Posted on 2009-10-24 23:58
S.l.e!ep.¢% 阅读(364)
评论(0) 编辑 收藏 引用 所属分类:
RootKit
[资料] http://www.cppblog.com/sleepwom/archive/2009/10/24/99375.html
What is SSDT?
SSDT的全称是System Services Descriptor Table,系统服务描述符表。这个表就是一个把ring3的Win32 API和ring0的内核API联系起来。SSDT并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基地址、服务函数个数等。
How to use?
在头文件如此定义即可
#pragma pack(1)
typedef struct _SSDT_TABLE
{
PVOID ServiceTableBase;
PULONG ServiceCounterTableBase;
ULONG NumberOfService;
ULONG ParamTableBase;
}SSDT_TABLE,* PSSDT_TABLE;
#pragma pack()
extern "C" extern PSSDT_TABLE KeServiceDescriptorTable;
why?
KeServiceDescriptorTable是ntoskrnl.exe导出的(Win下所有PE都可以导出接口或变量)
用 vc 自带的 dependency.exe 工具查看 ntoskrnl.exe 就可以看到
609(0x0261) 594(0x0252) KeServiceDescriptorTable 0x0008B520
(另外可以看到 Nt开头的是ntdll.dll导出的,ntoskrnl.exe导出的是Zw开头的函数 )
可以参考以下这篇文章,里面提到系统服务号101h,NtTerminateProcess和ZwTerminateProcess的关系:
内核下,ZwXxx函数还是会走int 2e这条路,为的是把PreviousMode变为KernelMode。NtXxx是真正实现的地方。SSDT里面放的是NtXxx的函数地址。
标 题: 【原创】内核态进程管理器Intercessor和实现细节
作 者: greatcsk
时 间: 2007-09-05,20:20
链 接: http://bbs.pediy.com/showthread.php?t=51157
try it;
写一个Exe程序
.h 加上
#pragma comment(linker, "/EXPORT:_Add,@1,NONAME")
#ifdef __cplusplus
extern "C" {
#endif
__declspec(dllexport) int Add(int a, int b);
#ifdef __cplusplus
}
#endif /* __cplusplus */
.cpp 加上
#ifdef __cplusplus
extern "C" {
#endif
int Add(int a, int b)
{
return (a + b);
}
#ifdef __cplusplus
}
#endif /* __cplusplus */
最后加上 .def
EXPORTS
Add @1
生成后,发现有 *.lib
用 dependency.exe 一看,确实导出了
调用时,跟调用DLL的函数是一样的
void CTestexeexportDlg::OnButton1()
{
HMODULE moudule = ::LoadLibrary("C:\\\\exeexport.exe");
typedef int(*MyFuncProc)(int a, int b);
MyFuncProc pFun;
pFun = (MyFuncProc)GetProcAddress(moudule, "Add");
int i = pFun(10, 20);
}