首页
论坛
课程
招聘
[系统底层] [调试逆向] [原创]带菜鸟入个门---58行代码破掉主流游戏保护实现CE读写
2020-12-16 11:31 8178

[系统底层] [调试逆向] [原创]带菜鸟入个门---58行代码破掉主流游戏保护实现CE读写

2020-12-16 11:31
8178

注意:此贴仅限技术交流分享


目前测试环境:win10 1909和win764位都能应用,win7 64位在退出游戏时,会引发蓝屏,需要修复部分数据,但对小白来说,过于麻烦,可以不用CE,直接使用三环的ReadProcessMemory和WriteProcessMemory即可。


  1. 上图



    2.过程(我挂了几天不蓝,如各位有蓝屏,请查找蓝屏代码自行修复)

  1. 如果你要修改的目标进程是32位的,你就打开32位的NOTEPAD.exe,如果是64位的,你就打开64位的NOTEPAD.exe做为傀儡进程,以实现环境适应。

  2. 在内核层,暂停傀儡进程的所有线程,让傀儡进程变成一个纯粹的内存空间,不要在三环创建挂起进程,会蓝。

  3. 将目标进程的CR3,VAD挂入傀儡进程的CR3和VAD,进行替换,切记不要替换PEB和wowPEB,会蓝。

  4. win7 64位,退出目标进程后,会蓝,需要修改很多细节,可以直接不用CE,直接三环读写API即可。


     当然如果对方以判断CR3和VAD为目的来进行判断,你可以不用notepad.exe,你将CR3的PML4的前100项和VAD挂入system,可以实现读,但写因为win10 64位的eprocess有个systemprocess判断位,无法写,但可以读


win10 1909代码如下:

#include "MyGlobalVar.h"
#define DirectoryTableBase 0x28
#define UserDirectoryTableBase 0x280
#define VadRoot 0x658
#define VadHint 0x660

NTSTATUS PsSuspendProcess(PEPROCESS Process);
NTSTATUS PsResumeProcess(PEPROCESS Process);
PGLOBAL_STRUCT pGLobalStruct;
VOID Unload(PDRIVER_OBJECT pDriverObject)
{
	if (pGLobalStruct->isChange)
	{
		RtlRecoveryEprocess();
		PsResumeProcess(pGLobalStruct->pOwnProcess);
		ExFreePool(pGLobalStruct);
		KdPrint(("end\n"));
	}
}
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath)
{
	NTSTATUS status = STATUS_SUCCESS;
	pDriverObject->DriverUnload = Unload;
	HANDLE puppetPid = 3492;//傀儡进程PID
	HANDLE gamePid = 3108;//游戏Pid
	pGLobalStruct = ExAllocatePool(NonPagedPool, sizeof(GLOBAL_STRUCT));
	if (!pGLobalStruct) return status;
	PsLookupProcessByProcessId(puppetPid, &pGLobalStruct->pOwnProcess);
	PsLookupProcessByProcessId(gamePid, &pGLobalStruct->pGameProcess);
	PsSuspendProcess(pGLobalStruct->pOwnProcess);

	RtlChangeEprocess();
    return status;
}
//改变EPROCESS
VOID RtlChangeEprocess()
{
	
	pGLobalStruct->OldCr3 = *((PULONG64)((ULONG64)pGLobalStruct->pOwnProcess + DirectoryTableBase));
	pGLobalStruct->OldUserCr3 = *((PULONG64)((ULONG64)pGLobalStruct->pOwnProcess + UserDirectoryTableBase));
	pGLobalStruct->OldVadRoot = *((PULONG64)((ULONG64)pGLobalStruct->pOwnProcess + VadRoot));
	pGLobalStruct->OldVadHint = *((PULONG64)((ULONG64)pGLobalStruct->pOwnProcess + VadHint));
	*((PULONG64)((ULONG64)pGLobalStruct->pOwnProcess + DirectoryTableBase)) = *((PULONG64)((ULONG64)pGLobalStruct->pGameProcess + DirectoryTableBase));
	*((PULONG64)((ULONG64)pGLobalStruct->pOwnProcess + UserDirectoryTableBase)) = *((PULONG64)((ULONG64)pGLobalStruct->pGameProcess + UserDirectoryTableBase));
	*((PULONG64)((ULONG64)pGLobalStruct->pOwnProcess + VadRoot)) = *((PULONG64)((ULONG64)pGLobalStruct->pGameProcess + VadRoot));
	*((PULONG64)((ULONG64)pGLobalStruct->pOwnProcess + VadHint)) = *((PULONG64)((ULONG64)pGLobalStruct->pGameProcess + VadHint));
	pGLobalStruct->isChange = TRUE;

}
VOID RtlRecoveryEprocess()
{
	
	*((PULONG64)((ULONG64)pGLobalStruct->pOwnProcess + DirectoryTableBase)) = pGLobalStruct->OldCr3;
	*((PULONG64)((ULONG64)pGLobalStruct->pOwnProcess + UserDirectoryTableBase)) = pGLobalStruct->OldUserCr3;
	*((PULONG64)((ULONG64)pGLobalStruct->pOwnProcess + VadRoot)) = pGLobalStruct->OldVadRoot;
	*((PULONG64)((ULONG64)pGLobalStruct->pOwnProcess + VadHint)) = pGLobalStruct->OldVadHint;

}

[公告] 2021 KCTF 春季赛 防守方征题火热进行中!

最后于 2020-12-16 14:02 被学技术打豆豆编辑 ,原因:
收藏
点赞6
打赏
分享
最新回复 (28)
雪    币: 2791
活跃值: 活跃值 (2780)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
学技术打豆豆 活跃值 1 2020-12-16 11:43
2
0

..。

最后于 2020-12-16 14:07 被学技术打豆豆编辑 ,原因:
雪    币: 0
活跃值: 活跃值 (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Galesaur 活跃值 2020-12-16 11:57
3
0
这个原来有人讲过,不过我好奇你的虚拟机,我想要这个
雪    币: 2791
活跃值: 活跃值 (2780)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
学技术打豆豆 活跃值 1 2020-12-16 12:02
4
0
Galesaur 这个原来有人讲过,不过我好奇你的虚拟机,我想要这个
虚拟机三行代码解决
雪    币: 280
活跃值: 活跃值 (388)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dz默契 活跃值 2020-12-16 12:08
5
0
我豆哥得技术  我这辈子都赶不上了,别怀疑啊 就那个一杆进三洞都够我学一辈子了
雪    币: 9734
活跃值: 活跃值 (2474)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
hzqst 活跃值 3 2020-12-16 13:41
6
1
其实要anti也简单,遍历所有进程判断PML4前100项是否跟游戏进程相同即可,但是这样搞就变成攻防套娃了,纯属浪费时间
雪    币: 322
活跃值: 活跃值 (288)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
清风qfccc 活跃值 2020-12-16 14:32
7
0
豆哥牛逼
雪    币: 0
活跃值: 活跃值 (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Galesaur 活跃值 2020-12-16 15:00
8
0
学技术打豆豆 虚拟机三行代码解决
可以双机调试不,我最近想玩玩,被按在这里了
雪    币: 2791
活跃值: 活跃值 (2780)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
学技术打豆豆 活跃值 1 2020-12-16 15:16
9
0
hzqst 其实要anti也简单,遍历所有进程判断PML4前100项是否跟游戏进程相同即可,但是这样搞就变成攻防套娃了,纯属浪费时间
攻防双方本来就是技术对抗的过程,我告诉你了原理,你当然简单,你把TP的原理告诉我,我也简单!
雪    币: 888
活跃值: 活跃值 (368)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
鸭子咯咯哒 活跃值 2020-12-16 18:32
10
0
这个是一个驱动读写吗
雪    币: 71
活跃值: 活跃值 (337)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
killpy 活跃值 2 2020-12-17 09:05
11
0
你这个可以读写 已经换页的内存吗
雪    币: 2791
活跃值: 活跃值 (2780)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
学技术打豆豆 活跃值 1 2020-12-17 10:11
12
0
killpy 你这个可以读写 已经换页的内存吗
当然可以
雪    币: 250
活跃值: 活跃值 (220)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
killleer 活跃值 2020-12-19 12:43
13
0
如果你要修改的目标进程是32位的,你就打开32位的NOTEPAD.exe,如果是64位的,你就打开64位的NOTEPAD.exe做为傀儡进程,以实现环境适应。

在内核层,暂停傀儡进程的所有线程,让傀儡进程变成一个纯粹的内存空间,不要在三环创建挂起进程,会蓝。

这个感觉和某老外的poc很像啊@hzqst

老外那个很早就有了,暂停runtimebroker的
雪    币: 250
活跃值: 活跃值 (220)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
killleer 活跃值 2020-12-19 12:49
14
0
hzqst 其实要anti也简单,遍历所有进程判断PML4前100项是否跟游戏进程相同即可,但是这样搞就变成攻防套娃了,纯属浪费时间
PCclone和kmem那玩意?
雪    币: 361
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
gdgdgdg 活跃值 2020-12-19 13:02
15
0
自己写个虚拟机 解决一切疑难杂症
雪    币: 2791
活跃值: 活跃值 (2780)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
学技术打豆豆 活跃值 1 2020-12-22 12:26
16
0
gdgdgdg 自己写个虚拟机 解决一切疑难杂症
雪    币: 48
活跃值: 活跃值 (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wbqsohucom 活跃值 2020-12-25 20:45
17
0
学习了,谢谢
雪    币: 145
活跃值: 活跃值 (388)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
huojier 活跃值 2020-12-27 19:04
18
0
我有一种设想...要干坏事的,直接把PID改了做完坏事再改回去,所以有人去试试吗?
雪    币: 225
活跃值: 活跃值 (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
仙乐 活跃值 2020-12-29 17:42
19
0
为什么我看到不到系统调用的内核函数 我是很白很白的小白
雪    币: 327
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
思源欲涩 活跃值 2020-12-29 20:48
20
0
Win10 64 1809 能替换成功 创建进程或过几秒钟到十几秒不等蓝屏 报内存重叠 难道是我操作不对?
VOID 进程内存替换(const char* age_processname)
{
    //int3zzzz();
    pGLobalStruct = (GLOBAL_STRUCT*)ExAllocatePool(NonPagedPool, sizeof(0));
    if (!pGLobalStruct) return;
    pGLobalStruct->pOwnProcess = (PEPROCESS)取指定进程("test.exe");
    pGLobalStruct->pGameProcess = (PEPROCESS)取指定进程(age_processname);
    if (pGLobalStruct->pOwnProcess == NULL64 || pGLobalStruct->pGameProcess == NULL64)
        return;
    PsSuspendProcess(pGLobalStruct->pOwnProcess);
    RtlChangeEprocess();
}


雪    币: 2791
活跃值: 活跃值 (2780)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
学技术打豆豆 活跃值 1 2020-12-29 21:21
21
0
思源欲涩 Win10 64 1809 能替换成功 创建进程或过几秒钟到十几秒不等蓝屏 报内存重叠 难道 ...
 pGLobalStruct = (GLOBAL_STRUCT*)ExAllocatePool(NonPagedPool, sizeof(0));

雪    币: 2004
活跃值: 活跃值 (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
rescuo 活跃值 2020-12-29 23:44
22
0
虚拟机怎么过检测
雪    币: 1377
活跃值: 活跃值 (405)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dearfuture 活跃值 2021-2-3 04:31
23
0
牛逼,以前只想过怎么构造页表,原来找个傀儡进程替换成目标进程的cr3就好了。替换vadroot,是为了解决r3内存的页异常?不过问题来了,要是r3发生缺页,应该还是当前线程挂入傀儡进程执行pf,其实也就是游戏进程的pf。但要是游戏进程的pf做了什么手脚,会不会出什么问题?
雪    币: 1377
活跃值: 活跃值 (405)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dearfuture 活跃值 2021-2-3 05:17
24
0
还有一个就是为什么是拷贝pml4前100项?系统空间最低是 0x00000800`00000000也就是2^43,所以大概2^43/2^39=16,感觉只需要拷贝pml4的前16项就可以了?
雪    币: 859
活跃值: 活跃值 (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
倪大大 活跃值 2021-2-19 20:37
25
0
1809没几分钟就109蓝屏
游客
登录 | 注册 方可回帖
返回