最近看了加密与解密3脱壳这一章,感觉很好。自己也尝试脱了一些壳,偶得一点心得,写出来分享一下,前辈莫笑......
      首先说下壳加载的一般流程,保护入口参数-获取API地址-解密原程序区块-IAT的初始化-重定位项的处理-HOOK API-跳转到OEP,这其中,IAT的初始化-重定位项的处理-HOOK API这三个过程自己在脱壳的过程中没有怎么感受到(有关IAT在一个壳中遇到过,晕菜了,),所以认识不很深,就不乱说了。还是说些自己遇到的吧。
     1.保护入口参数
   这可能是我体会最深的,很多压缩壳就是这样,比如ASPack,入口一般都是pushad,这种壳我一般都是根据ESP定律下硬件断点,效果很不错。而加密壳呢,入口一般就不是这样了,大多的加密壳入口一般都是跳转或者Call,一F8就飞了,对于这种壳,我一般下内存断点,呵呵。不过像ASProtect偶就没招了,(哪位大大教教我怎么脱ASProctect啊)
   2.获取API地址
   这里面有几个API很重要,LoadLibrary,GetModuleHandle,GetProcAddress这三个API函数,LoadLibrary是加载DLL用的,GetModuleHandle是获取DLL句柄用的,而GetProcAddress是获取输入函数的地址。外壳需要用到的函数一般都是用这三个函数调用。再说说我单步跟踪遇到的几个API,VirtualAlloc,VirtualProtect,VirtualFree。大家知道,壳在加载过程中需要还原各个区块,这时候它就会分配一块内存空间,在这块空间上完成解密。
   3.解密区块
   解密一般是按区块顺序解密的,这点要牢记,脱壳时很有用哦。
   最后说点寻找OEP的心得,对于压缩壳,可以先尝试ESP定律,对于加密壳,可以先尝试内存断点,一般两次,一次下在.rdata,.data等区块,第二次下在.text区块,为什么呢,呵呵,前面说了,解密区块哦。另外对各种编译语言的特点也要有些了解哦,特别是入口,不然的话找到OEP你都不知道那是OEP,
    好了,偶得一点心得,前辈莫笑,继续学习中....................