首页
社区
课程
招聘
[求助]驱动中修改一个进程Image中的内存数据后,该进程的第二个实例也显示被修改了,是全局性的?
发表于: 2011-7-13 09:27 7080

[求助]驱动中修改一个进程Image中的内存数据后,该进程的第二个实例也显示被修改了,是全局性的?

2011-7-13 09:27
7080
正在入门驱动……说说我刚遇到的问题

我正试着用LoadImageNotifyRoutine监视某个特定的exe进程后,通过 ImageBase定位到里的某个代码,进行修改……

WP(1);//off=1
memcpy(pFun, &_patchcode, sizeof(_patchcode));
WP(0);

可是,这个exe被修改过一次后,这个exe再次运行实例的时候,我驱动还没对这个新进程的内存进行修改,结果那个指针的数据已经修改过的了……除非这个exe改名再启动

问题:
1, LoadImageNotifyRoutine回调里,我直接使用ImageBase指针,而不用Attach到这个进程就已经是在这个进程上下文中了,不用Attach靠谱吗?

2,我要怎么做才能每次只修改当前这个进程的内存?这样这个程序再启动第二个实例的时候我就再修改

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
你把写保护关了?copy on write依赖这个的。
2011-7-13 14:28
0
雪    币: 237
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
你的意思是本来会自动CopyOnWrite的,是因为我关了写保护才导致修改后是全局性的吗?

因为改的是映像里的代码默认不可写,不关的话写不进入

我用过别的实现,改后也是全局性的,代码像这样,其实我也不太理解,不知道代码是不是哪里的问题

...
pMdl = IoAllocateMdl((PVOID)pFun, sizeof(_patchcode), FALSE,FALSE,NULL); 
if (pMdl) 
{ 
	...
	MmProbeAndLockPages(pMdl, UserMode, IoReadAccess); 
	...
	pWritableP = MmMapLockedPagesSpecifyCache(pMdl, UserMode, MmNonCached, NULL, FALSE, NormalPagePriority);

	status = MmProtectMdlSystemAddress(pMdl,PAGE_EXECUTE_READWRITE);

	memcpy(pWritableP, &_patchcode, sizeof(_patchcode));

	MmUnmapLockedPages(pWritableP,pMdl);
	MmUnlockPages(pMdl); 
	IoFreeMdl(pMdl); 
}
2011-7-13 15:39
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
你去查一下copy on write是如何实现的,你应该用NtProtectVirtualMemory修改保护方式,这个和页的写保护不一样
2011-7-13 16:01
0
雪    币: 237
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
ZwProtectVirtualMemory
ZwWriteVirtualMemory
要是内核有导出这两个就没这么麻烦了,偏偏都是不导出,又不想用非常规方法去搜地址
2011-7-13 17:07
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
6
用其它方法写,直接wpoff就把所有的都改了……
2011-7-13 17:09
0
雪    币: 237
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
因为要写的内存还得解决read-only的问题。
你帮我看看我在3楼贴的那个代码,没有用WP off,同样也会把所有的都给改了
2011-7-13 17:16
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
3楼的差不多,都是直接改写那块物理地址,而没有备份
利用ntdll.dll调用NtProtectVirtualMemory
2011-7-13 17:22
0
雪    币: 237
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
谢谢你,
在驱动里可以调用ntdll.dll的NtProtectVirtualMemory吗?
内核中ZwProtectVirtualMemory没导出
2011-7-13 17:36
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
ntdll.dll每次开机后地址固定,它导出了NtProtectVirtualMemory,可以调用
如果不行你可以从ntdll.dll的NtProtectVirtualMemory得到服务号,然后在ssdt中找到地址
2011-7-13 18:07
0
雪    币: 603
活跃值: (40)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
11
阿弥陀佛!!!路过。。。
2011-7-13 18:52
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
12
我记得Mdl方法不是全局的啊,而且3楼的代码有WriteAccess吗?
2011-7-13 23:07
0
雪    币: 237
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
有WriteAccess啊,也确实是全局……

看来最简单的,还得是非常规手段,取索引号,搜索代码特征找ZwProtectVirtualMemory,
如果用索引号从ssdt取NtProtectVirtualMemory,Nt*这个调用起来还麻烦点,可能参数地址要处理,否则老失败。
2011-7-13 23:24
0
游客
登录 | 注册 方可回帖
返回
//