我使用IDA从Win XP SP 3中反汇编了ntdll.dll。我关心的不是正式记录的函数NtCreatePort,它创建LPC端口。我会发现它是如何工作的。
因此ntdll.dll导出NtCreatePort,我可以找到它:
mov eax, 2Eh
mov edx, 7FFE0300h
call dword ptr [edx]
retn 14h
所以我认为该功能在地址
7FFE0300h
被调用。 第一个问题:我不知道在哪里找到它。
但是从文献中我发现应该调用函数
KiFastSystemCall
,对吗? mov edx, esp
sysenter
我认为可以调用syscall
2Eh
。但是在哪里找到呢?我很困惑,不知道如何继续进行跟踪。谢谢大家!顺便说一句,如果您向我推荐有关该主题的文献,我将不胜感激。
#1 楼
int 2e
在Windows XP之前的系统中使用,从Windows XP到Windows XP快速系统调用是从用户模式转换到内核模式的首选方法。快速系统调用指针嵌入在“共享用户数据”部分中0:003> dt ntdll!_KUSER_SHARED_DATA @@masm(SharedUserData) SystemCall
+0x300 SystemCall : 0x76dd70f0
0:003> uf 0x76dd70f0
ntdll!KiFastSystemCall:
76dd70f0 8bd4 mov edx,esp
76dd70f2 0f34 sysenter
76dd70f4 c3 ret
如果使用的是用户模式调试器,则看不到Nt / Zw函数的内部信息
ntdll仅包含转换为内核的存根模式
您需要内核调试连接,或者必须依赖于ntos的静态分析....(kr / mp).exe(内核执行代码)
或您可以使用sysinternals中的livekd进行本地调试
NtCreatePort
内部调用nt!AlpcpCreateConnectionPort
调用
NtCreateObject
,初始化端口属性,将对象插入该对象插入HANDLE表并返回
以下是控制流程的简要概述(win 7 32位)
kd> uf /c nt!NtCreatePort
nt!NtCreatePort (8303f8a6)
nt!NtCreatePort+0x22 (8303f8c8):
call to nt!AlpcpCreateConnectionPort (8304d35c)
nt!NtCreatePort+0x52 (8303f8f8):
call to nt!KiCheckForKernelApcDelivery (82e74b24)
kd> uf /c nt!AlpcpCreateConnectionPort
nt!AlpcpCreateConnectionPort (8304d35c)
nt!AlpcpCreateConnectionPort+0x7 (8304d363):
call to nt!_SEH_prolog4 (82ecc240)
nt!AlpcpCreateConnectionPort+0xb3 (8304d40f):
call to nt!ObCreateObject (83072413)
nt!AlpcpCreateConnectionPort+0xc5 (8304d421):
call to nt!memset (82e864c0)
nt!AlpcpCreateConnectionPort+0xf4 (8304d450):
call to nt!AlpcpInitializePort (830b76c5)
nt!AlpcpCreateConnectionPort+0x101 (8304d45d):
call to nt!ObfDereferenceObject (82ec5163)
nt!AlpcpCreateConnectionPort+0x120 (8304d47c):
call to nt!AlpcpValidateAndSetPortAttributes (830b75a5)
nt!AlpcpCreateConnectionPort+0x140 (8304d49c):
call to nt!AlpcpSetOwnerProcessPort (830b77dc)
nt!AlpcpCreateConnectionPort+0x14d (8304d4a9):
call to nt!AlpcpAllocateBlob (830b7526)
nt!AlpcpCreateConnectionPort+0x181 (8304d4dd):
call to nt!AlpcInitializeHandleTable (830b7898)
nt!AlpcpCreateConnectionPort+0x198 (8304d4f4):
call to nt!ObInsertObjectEx (83071380)
nt!AlpcpCreateConnectionPort+0x1d5 (8304d531):
call to nt!_SEH_epilog4 (82ecc285)
kd>
#2 楼
第一个问题:在您的示例中,您正确-调用了
KiFastSystemCall()
。 7FFE0300h
是非ASLR系统上的指针。在windbg中,您可以这样看:
uf poi(7ffe0300)
第二个问题:
在哪里可以找到
int 2E
-在较旧的Windows版本中-Windows 2k和更早版本。在Windows XP中,机制已更改,而新的机制恰好是您在IDA中看到的。 请注意,这与x86机器有关。
更多详细信息:
https://opcode0x90.wordpress.com/2007/05/ 18 / kifastsystemcall-hook /
https://www.evilsocket.net/2014/02/11/on-windows-syscall-mechanism-and-syscall-numbers-extraction-methods/
https://www.codemachine.com/article_syscall.html