Windows内核--裸调系统调用(4.1)

本文介绍了在Windows XP x64环境下,通过修改内核和服务表新增`GetPid`系统调用的过程。首先在内核模块添加服务,然后在用户应用程序中使用汇编调用新系统调用获取进程ID。经过编译和替换内核,最终成功验证了系统的有效性和正确性。
摘要由CSDN通过智能技术生成

本文在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! 

                ​​​​​​​        

                        

        

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值