首页
社区
课程
招聘
[求助]用WriteProcessMemory修改kernel32.dll返回487错误
发表于: 2009-5-5 00:58 6787

[求助]用WriteProcessMemory修改kernel32.dll返回487错误

2009-5-5 00:58
6787
以CREATE_SUSPENDED方式调用CreateProcessA创建进程后,希望修改被创建进程的kernel32.dll的一个导出函数的入口代码。先是用VirtualProtectEx修改页面保护属性,也一样调用失败,错误号487(无效地址)。
修改地址是从Loader那里得到的,不过kernel32.dll加载的位置基本上都相同,地址应该不会错。如果将修改地址改成0x00400000即Exe基地址,则调用成功。如果等被CreateProcessA的进程ResumeThread以后再调用也是成功。
当进程被CreateProcessA,但尚未ResumeThread之前,用调试器附加它的话,可以看到kernel32已经被加载,但是如果这时候不用调试器附加,直接用LordPE查看(进程名是系统,不过进程号是对的)内存区域,那么会发现kernel32这时候尚未被加载(kernel32对应的0x7c800000的区域不存在),但如果用调试器附加,再用LordPE查看那么kernel32就出现了。
那么问题来了,kernel32到底是什么时候加载的?不过这个问题也不重要,因为现在需要修改kernel32一个导出函数的入口,到底有没有办法让它在一开始就加载kernel32呢?这样才有办法修改吧?或者有其他方法可以实现同一效果吗?
等待大侠指点迷经……

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

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
大侠帮个忙!为什么OD启动进程,第一次停在系统断点时,kernel32是已经加载的状况?
2009-5-5 15:34
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
目前的解决方法是,VirtualAllocEx分配一下空间,第一条指令是ret 4,然后用CreateRemoteThread创建一下线程,线程ret 4直接退出,主进程WaitForSingleObject等待该线程退出后,VirtualFreeEx释放空间,这样一来kernel32就被加载了。
2009-5-6 09:41
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
调试器加载,进程已经活动,只不过被中断了.
2009-5-6 14:55
0
雪    币: 22
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
你意思就是说什么系统dll都不应该有喽。
那从磁盘装载到内存,用什么函数的呢。
你研究的深了。所以闷住了。
2009-5-7 05:39
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
停在系统断点时,Exe自身已经加载,ntdll.dll已经加载,不过kernel32.dll尚未加载,之后应该是直接调用ntdll.dll来加载kernel32等一系列所需dll的。
不过用OD调试停在系统断点时,kernel32已经存在,不知道它是怎么做的。
2009-5-7 09:36
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
改目标进程的导入表
2009-5-7 11:05
0
游客
登录 | 注册 方可回帖
返回
//