|
本帖最后由 BeaFeng 于 2022-2-17 09:31 编辑
开发环境
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可以达到隐藏进程的效果,而且不会蓝屏,有兴趣的伙伴可以自己深入研究一下,请不要用于非法用途,仅限学习
如果大家看完不错对你们有帮助的话就点点好评给个赞吧,有什么问题可以在下方留言一起讨论~
补充内容 (2022-2-19 12:36):
统一回复:Win7修改PID后可以不用还原,Win10进程退出之前需要还原否则蓝屏。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
评分
-
查看全部评分
|