HOOK SSDT Hide Process (一)

[资料] 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);

}



你可能感兴趣的:(HOOK SSDT Hide Process (一))