本文在XP x64虚拟机实验
Windows系统调用机制
NtCreateProcess如何切换进内核?
ntdll.dll NtCreateProcess将服务号0x82传入,通过syscall调入内核系统调用例程。
syscall在做什么?
在64位系统上,Windows使用syscall指令实现系统服务分发。syscall实现和int 2E
类似的作用,只不过它更快速,看它名字"快速调用"。
新增"GetPid"系统调用
WRK内核
1 增加GetPid到systable.asm
2 在create.c实作,并在头文件中增加声明
> 此处为了方便,直接调用内部PsGetCurrentProcessId函数返回。
3 重新编译内核,替换wrkamd64.exe到虚拟机,重启生效。
用户应用程序调用GetPid系统调用
1 (VS2022)配置环境
a. VS2022安装“对 VS 2017(v141)工具的C++ Windows XP 支持 [已弃用]”工具。
b. 安装Intel C++编译器以支援编译x64内嵌汇编。
c. 编译选择兼容XP模式(v141_xp),选择静态库,确认Minimum Required Version
是5.02(此版本可兼容XP系统).
2 源代码
syscall.c
#include <stdio.h>
int my_syscall_getpid()
{
int pid;
__asm
{
mov eax, 128h
syscall
mov pid, eax
}
return pid;
}
int main()
{
int pid = 0xFF;
pid = my_syscall_getpid();
getchar();
printf("Call my syscall(getpid): %d\n", pid);
return 0;
}
3 编译并在虚拟机上运行
执行到getchar时,用任务管理器查看syscall.exe的pid.
接着执行应用程序看到输出也是960, OK!