ARI*_*TOS 1 windows dll assembly exe system-calls
我试图让程序使用系统调用而不是dll(kernel32.dll,ntdll.dll).
我知道例如,Windows 10 64位中的0x2C(44)系统调用是NtTerminateProcess购买该网页.当我反汇编ntdll.dll我发现代码时:
NtTerminateProcess:
mov r10, rcx
mov eax, 44
test byte [abs 7FFE0308h], 01h ;also what is in that memory address?
jnz label
syscall
ret
label:
int 46 ;and why the 46 (the 2Eh windows NT interrupt) is here
ret
Run Code Online (Sandbox Code Playgroud)
我的问题是如何以这种方式终止程序?
直接进行系统调用并不是一个好主意,因为这不是一个稳定的ABI.从理论上讲,这些数字可以在服务包之间进行更改,甚至可以更新.
32位Windows上使用的指令在所有系统上都不一样!
Windows NT和2000总是使用int 2e.Windows XP 在"更新"的Intel/AMD CPU(Pentium II,AMD K7及更高版本)上运行时开始使用SysEnter/ SysCall.因为Windows XP也支持较旧的CPU,所以它使用了一个小辅助函数(SystemCallStub)来进入内核模式.此函数(以及稍后的函数的地址)存储在一个内存页面中,该内存页面可被所有_KUSER_SHARED_DATA位于0x7ffe0000的进程访问.
原始int 2e方法仍然受支持,但我不确定为什么64位Windows无法检查使用哪种方法,因为它运行的每个CPU都支持SysCall.我的Windows 8机器不检查:
0:000> uf ntdll!NtTerminateProcess
ntdll!ZwTerminateProcess:
000007ff`1ad52ea0 4c8bd1 mov r10,rcx
000007ff`1ad52ea3 b82a000000 mov eax,2Ah
000007ff`1ad52ea8 0f05 syscall
000007ff`1ad52eaa c3 ret
Run Code Online (Sandbox Code Playgroud)
这些只是实现细节,它们可以随时更改.
int 2e可能有点慢,所以如果你想保持"便携" ,只需使用SysCall64位代码和int 2e32位代码.
| 归档时间: |
|
| 查看次数: |
616 次 |
| 最近记录: |