能力值:
( LV13,RANK:240 )
|
-
-
2 楼
这不就是找oep么!!
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
正解,精辟
|
能力值:
( LV4,RANK:50 )
|
-
-
4 楼
现在即使知道oep,也不知道怎么让进程a.exe在oep那儿暂停执行,我WriteProcessMemory之后,再继续执行啊!
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
下断点..
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
在OEP while sleep
|
能力值:
( LV5,RANK:70 )
|
-
-
7 楼
判断是否解码了被,看你好像是要打补丁的节奏啊
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
我也关心这个,想用易语言做个补丁
|
能力值:
( 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写”比较起来几乎是没有区别的。这样也变相完成了任务。
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
找oep呗
|
能力值:
( LV3,RANK:20 )
|
-
-
11 楼
不用那么累得啦,找一个oep附近会调用的但是壳不调用的api挂钩,钩子里执行你自己的代码就好了.挂钩动作在壳还没开始的时候就可以挂上了,执行完代码把钩子卸了就一切正常了
|
|
|