返回列表 发布新帖

内核实现修改进程PID以及易语言调用【转载BeaFeng】

72 0
发表于 2024-11-29 16:58:23 | 显示全部楼层 阅读模式
开发环境
Win10 X64/Visual Studio 2019/WDK 10.0 SDK 10.0.19041.0/易语言5.9

概述
首先我们需要了解的是EPROCESS结构体,每个Windows进程在0环都有一个对应的结构体,这个结构体包含了进程所有重要的信息以及相关结构的指针,不难猜出进程ID也是保存在此结构体中,由于EPROCESS结构位于系统地址空间,所以访问这个结构我们需要有Ring0权限,在Winbbg中 使用dt _EPROCESS查看EPROCESS结构体的信息。
我尽量的做了注释以及每一个步骤都详细的讲解,认真看完相信你们能有所收获。

分析结构
使用Windbg查看EPROCESS的结构体如下

对EPROCESS结构体中的重要成员进行说明

01) +0x000 Header : _DISPATCHER_HEADER //“可等待”对象,比如Mutex互斥体、Event事件等(WaitForSingleObject)
02) +0x018 DirectoryTableBase : [2] Uint4B //页目录表的基址
03) +0x020 LdtDescriptor : _KGDTENTRY
      +0x028 Int21Descriptor : _KIDTENTRY //历史遗留,16位Windows 段选择子不够 每个进程都有一个LDT表,Int21Descriptor 是 DOS下要用的
04) +0x038 KernelTime : Uint4B
      +0x03c UserTime : Uint4B //统计信息 记录了一个进程在内核模式/用户模式下所花的时间
05) +0x05c Affinity : Uint4B //规定进程里面的所有线程能在哪些个CPU上跑,第i位为1表示能在第i个核上运行。Xp是4个字节共32位,所以最多32核 Windows64位就64核。当设置运行的CPU不存在时进程无法运行。64位的操作系统将不适用。
06) +0x062 BasePriority : Char //基础优先级或最低优先级 该进程中的所有线程最起码的优先
07) +0x070 CreateTime : _LARGE_INTEGER
      +0x078 ExitTime : _LARGE_INTEGER//进程的创建/退出时间
08) +0x084 UniqueProcessId : Ptr32 Void //进程的编号(就是在任务管理器中的PID)
09) +0x088 ActiveProcessLinks : _LIST_ENTRY//双向链表,将所有的活动进程都连接在一起,构成了一个链表,进程结构体们彼此拴着各自的腰。而PsActiveProcessHead符号指向全局链表头。


获取UniqueProcessId偏移

上述很明显能看出来UniqueProcessId就是我们需要的进程ID,UniqueProcessId=EPROCESS+0x084,但是如果直接这么写进去 那就会遇到一个比较头疼的问题,因为每一个系统版本可能EPROCESS结构成员的偏移可能都不一样,所以我们需要想办法去定位这个偏移,打开IDA Pro拖进去ntoskrnl.exe内核文件:

接下来会用得到一个函数:PsGetProcessId
微软的解释是 例程返回与指定进程关联的进程标识符(进程 ID)



果然Win10的PID偏移是不一样的,我们可以看到48 8B 81 40 04 00 00 mov rax,[rcx+440],说明进程PID的是由rcx第一个参数+440来的,参数就是EPROCESS指针
我们仔细观察他的字节可以发现48 8B 81[操作码]+偏移,也就是说我们得到PsGetProcessId的地址,设定为变量apiaddr,apiaddr+3就是我们需要的UniqueProcessId偏移

RtlInitUnicodeString(&routineName, L"PsGetProcessId");


apiaddr = MmGetSystemRoutineAddress(&routineName);


UNIQUEPROCESSID_OFFSET = *(PDWORD)(apiaddr + 3);

轻松拿到我们的偏移UNIQUEPROCESSID_OFFSET,接下来就开始我们的操作。

修改进程PID
PsLookupProcessByProcessId(ProcessId, &eProcess);//先取进程EPROCESS结构


ProcessPid = Get64bitValue((PULONG64)((ULONG64)eProcess + UNIQUEPROCESSID_OFFSET)); //保存原来的进程PID  


Set64bitValue((PULONG64)((ULONG64)eProcess + UNIQUEPROCESSID_OFFSET), (ULONG64)SETULONGPID);//写入新的PID值,SETULONGPID变量为我们要修改的新PID值







最后用IO通讯用易语言调用,详细代码如下






功能测试:Win7 X64





功能测试:Win10 X64






总结


Win7和Win10均无异常,而且不触发PatchGuard,Win11以前测试过也是没有毛病的
最后提一杯,PID改成0可以达到隐藏进程的效果,而且不会蓝屏,有兴趣的伙伴可以自己深入研究一下,请不要用于非法用途,仅限学习

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
温馨提示:
1、在社区里发表的文章仅代表作者本人的观点,与本网站立场无关。
2、社区的所有内容都不保证其准确性,有效性,时间性。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
3、当政府机关依照法定程序要求披露信息时,论坛均得免责。
4、若因线路及非本站所能控制范围的故障导致暂停服务期间造成的一切不便与损失,社区不负任何责任。
5、注册会员通过任何手段和方法针对社区进行破坏,我们有权对其行为作出处理。并保留进一步追究其责任的权利。

本帖被以下淘专辑推荐:

回复

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

投诉/建议联系

990037279@qq.com

如果有侵犯到您的权益,
请第一时间联系邮箱,
站长会进行审查,情况属实的会在三个工作日内为您删除。
  • 关注公众号
  • 添加微信客服
Copyright © 2001-2024 生活的趣事 版权所有 All Rights Reserved. 浙ICP备2022006091号-1
关灯 快速发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表