如何静态获取Windows系统调用程序集?
How to get Windows system calls assembly statically?
出于研究目的,我正试图在 Windows 系统调用中找到特定模式。
到目前为止,我一直在研究 Windows dll,例如 ntdll.dll, user32.dll
等,但它们似乎只包含准备跳转到系统调用的包装代码。例如:
mov eax, 101Eh
lea edx, [esp+arg_0]
mov ecx, 0
call large dword ptr fs:0C0h
retn 10h
我猜 call large dword ptr fs:0C0h
指令是链条中的另一个网关,最终通向实际的程序集,但我想知道我是否可以直接到达该程序集。
您看错了 dll
。系统调用位于 ntoskrnl.exe
.
如果您查看 ntoskrnl.exe
中的 NtOpenFile()
,您会看到:
mov r11, rsp
sub rsp, 88h
mov eax, [rsp+88h+arg_28]
xor r10d, r10d
mov [r11-10h], r10
mov [rsp+88h+var_18], 20h ; int
mov [r11-20h], r10d
mov [r11-28h], r10
mov [r11-30h], r10d
mov [r11-38h], r10d
mov [r11-40h], r10
mov [rsp+88h+var_48], eax ; int
mov eax, [rsp+88h+arg_20]
mov [rsp+88h+var_50], 1 ; int
mov [rsp+88h+var_58], eax ; int
mov [r11-60h], r10d
mov [r11-68h], r10
call IopCreateFile
add rsp, 88h
retn
这是函数的真体。大部分工作已在 IopCreateFile()
中完成,但您可以静态地跟随它并进行任何您需要的分析。
出于研究目的,我正试图在 Windows 系统调用中找到特定模式。
到目前为止,我一直在研究 Windows dll,例如 ntdll.dll, user32.dll
等,但它们似乎只包含准备跳转到系统调用的包装代码。例如:
mov eax, 101Eh
lea edx, [esp+arg_0]
mov ecx, 0
call large dword ptr fs:0C0h
retn 10h
我猜 call large dword ptr fs:0C0h
指令是链条中的另一个网关,最终通向实际的程序集,但我想知道我是否可以直接到达该程序集。
您看错了 dll
。系统调用位于 ntoskrnl.exe
.
如果您查看 ntoskrnl.exe
中的 NtOpenFile()
,您会看到:
mov r11, rsp
sub rsp, 88h
mov eax, [rsp+88h+arg_28]
xor r10d, r10d
mov [r11-10h], r10
mov [rsp+88h+var_18], 20h ; int
mov [r11-20h], r10d
mov [r11-28h], r10
mov [r11-30h], r10d
mov [r11-38h], r10d
mov [r11-40h], r10
mov [rsp+88h+var_48], eax ; int
mov eax, [rsp+88h+arg_20]
mov [rsp+88h+var_50], 1 ; int
mov [rsp+88h+var_58], eax ; int
mov [r11-60h], r10d
mov [r11-68h], r10
call IopCreateFile
add rsp, 88h
retn
这是函数的真体。大部分工作已在 IopCreateFile()
中完成,但您可以静态地跟随它并进行任何您需要的分析。