首页
社区
课程
招聘
PsSetLoadImageNotifyRoutine中修改镜像内容
发表于: 2011-12-7 10:24 7524

PsSetLoadImageNotifyRoutine中修改镜像内容

2011-12-7 10:24
7524
PsSetLoadImageNotifyRoutine的回调中修改了镜像内容,为什么修改一次,就一直有效了,直到机器重启。

我是想在回调中修改镜像的导入表,比如现在运行记事本,我修改了导入表,注入DLL成功了。
但是我再次运行记事本的时候,发现刚才修改的新的导入表地址已经被修改了。

为什么修改一次就一直有效啊?

修改方法如下:
pbNewIid 是在进程空间分配的虚拟内存地址
gpMyData 是自己构建的导入表地址
gnImportSize 是新导入表的长度
pImageBase 是镜像基址

__asm 
{
			cli;
			mov eax, cr0;
			mov oldCr0, eax;
			and eax, not 10000h;
			mov cr0, eax
		}
		
		ProbeForWrite(pbNewIid, gnImportSize, 1);
		RtlZeroMemory(pbNewIid, gnImportSize);
		RtlCopyMemory(pbNewIid, gpMyData, gnImportSize);
		pHeader->IMPORT_DIRECTORY.Size = gnImportSize;
		pHeader->IMPORT_DIRECTORY.VirtualAddress = (ULONG)pbNewIid - (ULONG)pImageBase;

		__asm
		{
			mov eax, oldCr0;
			mov cr0, eax;
			sti;
		}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
你这样把页保护机制关掉了,Cow就不起作用了,相当于全局写入,想达到你的效果就用MDL吧,不要关Cr0~~
2011-12-7 10:32
0
雪    币: 128
活跃值: (27)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
用NtProtectVirtualMemory,这样不用关Cr0
不过这个api地址要自己获取
2011-12-7 11:16
0
雪    币: 213
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
首先感谢楼上两位热心回答!

我尝试过,使用MDL代替CR0,一样可以修改,但是修改一次过后,同样后面再次运行这个程序时,导入表地址都是改边了的。
现在我只能采用一个笨办法,用一张表来保存所有修改过的IAT信息,在进程结束的时候把IAT地址修改回来。
不知道还有没有更好的办法。
2011-12-18 15:34
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
5
NtProtectXXX,NtWriteXXX
2011-12-18 18:02
0
雪    币: 329
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不想用NtProtectXXX,NtWriteXXX的可以处理一下copy-on-write bit
2012-5-31 19:27
0
游客
登录 | 注册 方可回帖
返回
//