首页
社区
课程
招聘
[求助]如何知道壳运行完了
发表于: 2014-2-4 19:45 7026

[求助]如何知道壳运行完了

MPL 活跃值
1
2014-2-4 19:45
7026
我用CreateProcess去调用一个加了壳的程序a.exe,要等他的壳运行完了,然后调用WriteProcessMemory去写进程a.exe的内存。问题是,我如何知道壳运行完了?用Sleep等待的话,不稳定!我试过了!也不能用WaitForInputIdle,因为这样的话,不仅壳运行完了,程序本身的代码也已经开始运行了!就是我希望程序本身的代码还没开始运行,停在第一条指令的时候,我去WriteProcessMemory!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 1392
活跃值: (5142)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
2
这不就是找oep么!!
2014-2-4 21:44
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
正解,精辟
2014-2-4 21:50
0
雪    币: 175
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
现在即使知道oep,也不知道怎么让进程a.exe在oep那儿暂停执行,我WriteProcessMemory之后,再继续执行啊!
2014-2-4 23:23
0
雪    币: 14
活跃值: (88)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
下断点..
2014-2-5 09:04
0
雪    币: 19
活跃值: (1086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
在OEP while sleep
2014-2-5 18:25
0
雪    币: 341
活跃值: (85)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
7
判断是否解码了被,看你好像是要打补丁的节奏啊
2014-2-5 19:24
0
雪    币: 157
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我也关心这个,想用易语言做个补丁
2014-2-6 14:34
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
首先必须手工(貌似没有通用的自动方法)找到OEP。
如果这个壳不是霸道的,并且不检测调试标志的话,通常你可以找到进入OEP前的最后一处壳代码的位置,CreateProcess用DEBUG方式开启但暂停住,你的主程序修改其最后一处壳代码为int 3(相当于加软断点),并且用WaitForDebugEvent等待调试事件,当发现断下时刻就是你所修改的int 3时,你可以还原代码,打补丁写内存,然后DebugActiveProcessStop分离运行(可以MSDN查WaitForDebugEvent一系调试代码的写法);如果找不到最后一处壳代码,理论上可以用SetThreadContext加硬件断点,把dr0寄存器写成OEP应该可以断下(本人对硬件断点的原理不太熟,可能有错漏)。
如果壳反调试,那么不太好办。不过既然你可以找到OEP,那你自然可以找到它正常情况下,所调用的第一个API,你可以在最初启动程序之前,把这个API的入口代码偷天换日一下,比如先判断OEP指令是否已经还原以及本函数返回地址是否是OEP执行之后再调用本函数应该返回的位置。如果发现不是的话,那么让他继续正常运行,如果是的话,让它进入死循环。主程序做完手脚后,通过Sleep100毫秒左右检测一次目标程序,将其挂起,GetThreadContext判断它EIP是否在死循环的位置,如果不是的话,继续Sleep,如果是的话,还原该API入口,SetThreadContext将EIP设置回该API入口。由于此时目标程序一个API都没来得及调用,所以“此时WriteProcessMemory”和“在OEP写”比较起来几乎是没有区别的。这样也变相完成了任务。
2014-2-13 11:17
0
雪    币: 220
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
找oep呗
2014-2-22 19:51
0
雪    币: 81
活跃值: (100)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
不用那么累得啦,找一个oep附近会调用的但是壳不调用的api挂钩,钩子里执行你自己的代码就好了.挂钩动作在壳还没开始的时候就可以挂上了,执行完代码把钩子卸了就一切正常了
2014-3-13 12:34
0
游客
登录 | 注册 方可回帖
返回
//