单步跟踪法脱壳加密壳

建议在Win7下运行。
用到的文件下载地址:https://download.csdn.net/download/lilongsy/12838790
先用ExeinfoPe查看一下是否加壳以及壳的类型:
加壳了,类型为aspack压缩壳。
单步跟踪法脱壳加密壳
一般的Win32程序从_start开始执行,然后到main函数。压缩加壳程序一般是从_start开始,然后到load函数,把代码恢复,然后jmp跳转到真正要执行的代码位置区域,最后到main开始执行。脱壳其实就是上下文恢复的过程,从pushad保存到栈上,popad恢复弹出到寄存器,一般是长跳转(段之间的跳转),从而恢复上下文。
注意用英文原版ollydbg。

常用快捷键:
F2下断点
F4运行到此处
F7步入
F8步过
F9运行

用Ollydbg打开Notepad.exe,停在了如下位置:
单步跟踪法脱壳加密壳
对于近call,我们选择跟进,按F7之后,是如下位置:
单步跟踪法脱壳加密壳
又是一个近call,继续跟进,按F7,现在没有近call了,单步向下,
我们可以轻松看到程序在调用GetModuleHandleA, GetProcAddress等api。继续向下分析
单步跟踪法脱壳加密壳

向下都是远call,我们之间F8一直下去
在0040D12F遇到一个稍大的循环,我们直接在0040D15F按F4跳过循环
单步跟踪法脱壳加密壳
单步跟踪法脱壳加密壳
继续向下F8,发现在0040D1A3又跳回到了之前的位置,就是向上的跳转,我们之间在下一行按F4跳过
也就是在0040D1A9位置按F4跳过,继续向下F8步过
单步跟踪法脱壳加密壳
0040D395又跳回,这是一个大循环,尝试跳出循环,我们在0040D39A按F4
单步跟踪法脱壳加密壳
单步跟踪法脱壳加密壳
这里的jnz跳转实现,在上一句有popad,基本说明壳程序已经加载完毕,现在要将控制权移交原程序。
继续向下到retn返回
单步跟踪法脱壳加密壳
到了一堆db里,我们删除分析,或按Ctrl+A,显示出了程序的入口点汇编指令。
单步跟踪法脱壳加密壳

我们成功找到了OEP:004010CC
使用OllyDump脱壳即可。

单步跟踪法脱壳加密壳

单步调试的两个准则找到程序的真正入口点OEP:

  1. 程序向下执行。有向上执行的,可能是循环,跳过到F4。
  2. 近call进去,近call步入。视野范围之内看到的F7步入,视野之外(拖动滚动条,下拉才能看到的)F8步过,例外是系统库函数的调用可以步过,如kernel32。

用原版ImportREC_fix修复动态链接资源库的表单
管理员身份运行ImportREC之前,需要脱壳的程序是ollydbg正在运行的。
单步跟踪法脱壳加密壳
右键Delete thunks。

成功脱壳:
单步跟踪法脱壳加密壳
单步跟踪法脱壳加密壳