其实很多人如果有机会的话就可以成为高手,但是意志不坚定或者种种因素困扰都让一个菜鸟永远保持这个没前途的状态.翻一下帖子或找一下,发觉万事开头难.所以,刚从那个阶段过来,就想给菜鸟同仁们分享一下,也许很多东西高手会觉得完全没有必要去讲,但是菜鸟是真的真的不明白....
孔明读书所谓"不求甚解"我们一开始学脱壳甚至是学破解也是如此,不要刨根问底,知其然就行了,等你慢慢积累经验你自己会知其所以然,即使还没有找到答案,你至少已经可以没有障碍地阅读高手们写给新手的教程了.
首先选择好工具,从调试区下载已经集成插件的 OllyICE(工具的说明容易看懂,不懂的可以在运用时体会,不赘述)
最初级的开始,三下五除二解决压缩壳:
压缩壳只是为了让可执行文件变得更小,所以都不架设障碍.最简单的upx的入口一个pushad,对应一个popad你只要Ctrl+F搜索popad就可以找到oep
0046AD56 61 popad ;直接查到
0046AD57 ^ E9 98CBFEFF jmp 004578F4 ;看到了,跨段跳
0046AD5C ^ 74 AD je short 0046AD0B
0046AD5E 46 inc esi
接着在popad那行F4(运行到该位置),然后F8(单步运行)就跳到了OEP
004578F4 55 push ebp
004578F5 8BEC mov ebp, esp
004578F7 83C4 F4 add esp, -0C
004578FA B8 AC774500 mov eax, 004577AC
到了OEP就可以使用Ollydump插件dump出来.开始不管什么,默认选项就可以.
这种方法在很少的时候可以奏效,适用范围很小,只是熟悉一下工具而已.常用的办法当然是下断点.
使用命令行插件运行
bp GetProcAddress
或者 bp LoadLibraryA
或者 bp GetModuleHandleA
这三个是下断点的重要函数,有时候并不是每一个都奏效,所以如果这个不行就换一个.Ctrl+N查看当前有一些什么可用函数,未必都包含,没有的就不选择作为断点了.当然,对于初学者来说,选择什么函数是个问题,下完断点如何不迷失在系统代码又是一个问题.一般的压缩壳如果断在系统代码,可以用ALT+F9返回用户代码,某些时候一返回程序就运行了,那么说明你最好换个断点.以后理解深刻了,再去体会到底为什么会这样.这种方法要学,但是如果你只是想脱一些简单的壳,当然有更加简单的方法.
跟踪不管成功与否,重新载入程序的时候按alt+B删除上次设的断点.这是菜鸟经常忽略的事情.
ESP定律
下面虚线中间部分可以不去了解,你只要知道,很多软件只需要做如下动作,入口位置观察ESP,然后dd (ESP-4),下面的例子也就是12ffc0,接着在ollydbg里面对这个位置右键->硬件访问->word这么下断,你狂按F9,程序运行时候就会停在OEP的下一行.按一下CTRL+↑就看到OEP了.这个定律在很多加密壳里照样用得很好,等你跳过了SEH暗桩躲过了各种检测,剩下一路平坦的时候就可以用一下.
对了,清除硬件断点的办法,ollydbg里面调试->硬件断点,删除就可以了,一般用完要删掉,养成习惯.
------------------------------------------------------------
简单说就是堆栈平衡,形象一点说,你进澡堂洗澡,一开始寄放了一些什么在保管员那里,不管你进去多久是不是换了衣服甚至在里面打了手机,等你出来的时候你取得的东西和你进去时候是一样的.程序就是如此,里面的过程不论,初始状态一个pushad寄存了,那么等最后要一个popad出来,出来的时候自然ESP一样的.
我借用weiyi75[Dfcg]的菜鸟破解教程中第三个例子,是aspack加壳的.
这是入口点的寄存器状态
EAX 00000000
ECX 0012FFB0
EDX 7C92EB94 ntdll.KiFastSystemCallRet
EBX 7FFD6000
ESP 0012FFC4
EBP 0012FFF0
ESI FFFFFFFF
EDI 7C930738 ntdll.7C930738
EIP 0040D000 chap703.<模块入口点>
这是OEP处的寄存器状态
EAX 004010CC chap703.004010CC
ECX 0012FFB0
EDX 7C92EB94 ntdll.KiFastSystemCallRet
EBX 7FFD4000
ESP 0012FFC4
EBP 0012FFF0
ESI FFFFFFFF
EDI 7C930738 ntdll.7C930738
EIP 004010CC chap703.004010CC
----------------------------------------------
模拟跟踪
Memory map
地址 大小 属主 区段 包含 类型 访问 初始访问 已映射为
00400000 00001000 chap703 PE 文件头 Imag R RWE
00401000 00004000 chap703 .text 代码 Imag R RWE
00405000 00001000 chap703 .data 数据 Imag R RWE
00406000 00001000 chap703 .idata Imag R RWE
00407000 00005000 chap703 .rsrc 资源 Imag R RWE
0040C000 00001000 chap703 .reloc Imag R RWE
0040D000 00004000 chap703 .adata SFX,输入表,
看好属主,chap703就是你当前调试文件,贴出来的就是它占用的内存空间以及分布.地址401000-405000这段显然是代码段.那么一眼看去就知道了,使用命令行工具:tc eip<405000 基本上等一会儿就可以找到OEP了.
模拟跟踪和ESP定律是最方便易用的,原理复杂但是使用方便.同样,以后遇到加密壳有SEH暗桩和各种检测的,等你从最后一个SEH出来跳到SE异常处理程序之后一样可以使用模拟跟踪,往往可以节省你很多事.
RAINSAIL的脱壳教程入门篇,基本上都可以用以上两种方法快速解决.当然,最好是学会的方法每一个都用一下,这样可以对这些方法更加理解.不然很多软件根本还不必要手动去脱,直接拿PEID查OEP然后使用LordPE脱出来再用ImportREC修复岂不是更快.
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!