看了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是这样的呢,
还有没有别的函数是这样呢。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)