首页
社区
课程
招聘
[求助]关于取得 动态获得SSDT中函数萦引号的问题
发表于: 2012-2-19 21:41 5314

[求助]关于取得 动态获得SSDT中函数萦引号的问题

2012-2-19 21:41
5314
看了windows 内核安全防护一书 上面有个宏,取得的方法是:
利用函数开头的mov eax,XXXX
取得后在的XXXX,就是索引号。

于是就试了一下,结果对于 ZwCreateFile,ZwOpenProcess都好使
可是对于ZwCreateTimers就不行。
用IDA看了一下我写的驱动发现下面:

mov     eax, ds:[COLOR="Green"]ZwCreateFile[/COLOR](x,x,x,x,x,x,x,x,x,x,x)
push    eax
push    offset ??_C@_0BC@BHIOKJOC@ZwCreateFile?3?$CF08X?$AA@FNODOBFM@ ; "ZwCreateFile:%08X"
call    _DbgPrint
add     esp, 8
mov     ecx, offset [COLOR="red"]ZwCreateTimer[/COLOR](x,x,x,x)
mov     edx, [ecx+1]
push    edx
push    offset ??_C@_0BK@ELJIPHOG@ZwCreateTimer?4index?5?$DN?5?$CFd?6?$AA@FNODOBFM@ ; "ZwCreateTimer.index = %d\n"
call    _DbgPrint
add     esp, 8

其中:ZwCreateFile 为
.idata:00010810 ; NTSTATUS __stdcall ZwCreateFile(PHANDLE FileHandle,ACCESS_MASK DesiredAccess,POBJECT_ATTRIBUTES ObjectAttributes,PIO_STATUS_BLOCK IoStatusBlock,PLARGE_INTEGER AllocationSize,ULONG FileAttributes,ULONG ShareAccess,ULONG CreateDisposition,ULONG CreateOptions,PVOID EaBuffer,ULONG EaLength)
.idata:00010810                 extrn __declspec(dllimport) __stdcall ZwCreateFile(x, x, x, x, x, x, x, x, x, x, x):dword
为一个导入的函数
但是ZwCreateTimer 确好象是本地的一个函数,然后跳了一下:
; NTSTATUS __stdcall ZwCreateTimer(PHANDLE TimerHandle,ACCESS_MASK DesiredAccess,POBJECT_ATTRIBUTES ObjectAttributes,TIMER_TYPE TimerType)
__stdcall ZwCreateTimer(x, x, x, x) proc near
jmp     ds:ZwCreateTimer(x,x,x,x)
__stdcall ZwCreateTimer(x, x, x, x) endp

所以,我取不到ZwCreateTimer的首地址,所以取错了。

请教,这是为啥,什么原理呀。同在SSDT表中有三个函数的索引号。为什么ZwCreateTimer是这样的呢,
还有没有别的函数是这样呢。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 506
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
自己顶一下,老大们都还没起来么。
还是我没说明白呀。
2012-2-20 08:30
0
雪    币: 269
活跃值: (25)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
ZwCreateTimer是你自己extern的,编译出来就是多一个jmp xxxxx

那样取当然不行了

通用的办法还是从ntdll中取吧
2012-2-20 11:29
0
雪    币: 506
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我没有自己声明ZwCreateTimer,我是直接用的。和上面那个ZwCreateFile一样
家有。我在驱动程序中,怎么取得ntdll中的函数的地址?
2012-2-21 17:35
0
雪    币: 343
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
给个Ring3的
ULONG GetSyscallId(char *pszSyscallName)  
{  
 if(NULL == pszSyscallName || '\0' == pszSyscallName[0])  
 {  
  return 0;  
 }  
  
 HMODULE hMod = GetModuleHandle(_T("ntdll.dll"));  
 if(NULL == hMod)  
 {  
  return 0;  
 }  
  
 unsigned char *pByte = (unsigned char *)GetProcAddress(hMod, pszSyscallName);  
 if(NULL == pByte)  
 {  
  return 0;  
 }  
  
 if(0xB8 == pByte[0] && 0xBA == pByte[5])  
 {  
  return *(ULONG *)(pByte + 1);  
 }  
 else  
 {  
  return 0;  
 }  
}
2012-2-21 17:53
0
雪    币: 269
活跃值: (25)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
6
读ntdll的文件啊~从导出表里面得到函数名,找到函数就有ssdt号了

kd> u ntdll!zwcreatetimer
ntdll!NtCreateTimer:
7c92d1a0 b836000000      mov     eax,36h
7c92d1a5 ba0003fe7f      mov     edx,offset SharedUserData!SystemCallStub (7ffe0300)
7c92d1aa ff12            call    dword ptr [edx]
7c92d1ac c21000          ret     10h

不想分析文件直接attach一个进程,读他的ntdll.dll的内存分析也可以啊~
2012-2-21 17:59
0
雪    币: 269
活跃值: (25)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
7
直接MmGetSystemRoutineAddress("ZwCreateTimer")也可以,不过只限于导出函数~
2012-2-21 18:01
0
雪    币: 506
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
[QUOTE=yarpee;1046622]给个Ring3的
ULONG GetSyscallId(char *pszSyscallName)  
{  
if(NULL == pszSyscallName || '\0' == pszSyscallName[0])  
{  
  return 0;  
}  
  
...[/QUOTE]
谢谢,啦 ,
不过,我就是想知道Ring0怎么实现同样的功能,
2012-2-22 13:05
0
雪    币: 506
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
ReturnsMe 谢谢。
不过,我的疑问,还是为嘛,同样两个导出函数,这种方法一个行,一个不行呢。
2012-2-22 13:05
0
游客
登录 | 注册 方可回帖
返回
//