我在RE和Win NT领域都是乞gg。
我使用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