HI 大家好 我是朽木 QQ200655307今天教大家学习OD破解的教程
专门给菜鸟录制的
我就拿个加密的软件来破解给大家看吧
待脱壳程序:压缩包中
学破解迟早都对接触手动脱壳,看完这篇动画后,你会觉得其实手动脱壳也并不是这么高深。
这其实也是我做这篇动画的目的。这里以fsg为例,因为fsg没有什么anti等反调试技术。
对软件的加壳实际上是对软件的压缩,压缩之后程序的代码和数据就变得不可辨认,这也正
起到了对软件破解的保护。那么压缩后程序是怎么运行的呢。壳在运行的时候会把代码解压
缩到内存中,然后运行。也就是说程序在运行了一段时间后,程序的代码会完整的出现在内
存中。这就是我们要找的。通常称这个地方为oep,入口点。
当程序运行到入口点的时候我们可以用ollydbg的ollydump插件抓取内存中完整的程序代码以
及数据,这就实现了脱壳。
说了这么多是不是等不急了呢,让我们开始吧!!!
首先用peid查看程序,是用fsg1.33加的壳,查看oep很遗憾,看不到(看的到就不会有这篇
文章了:))
有ollydbg载入程序,开始我们的寻找oep之旅吧,寻找oep需要一点经验,就是要找跨段的jmp,
也就是说跳转实现跨段的,就有可能是跳到程序的真正的入口点
我们按住f8,使其单不运行,等会我们会发现一个地址老是往回跳,可以在下面一个地址设断,
然后按f9跳过这无数次的循环。
004307C7 41 INC ECX
004307C8 41 INC ECX
004307C9 95 XCHG EAX,EBP
004307CA 8BC5 MOV EAX,EBP
004307CC B6 00 MOV DH,0
004307CE 56 PUSH ESI
004307CF 8BF7 MOV ESI,EDI
004307D1 2BF0 SUB ESI,EAX
004307D3 F3:A4 REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[>
004307D5 5E POP ESI ; 1551-cra.00422D1E
004307D6 ^ EB 9D JMP SHORT 1551-cra.00430775 //这里一直往回跳
004307D8 8BD6 MOV EDX,ESI //在这里设断
004307DA 5E POP ESI
004307DB AD LODS DWORD PTR DS:[ESI]
004307DC 48 DEC EAX
004307DD /74 0A JE SHORT 1551-cra.004307E9
004307DF |79 02 JNS SHORT 1551-cra.004307E3
004307E1 |AD LODS DWORD PTR DS:[ESI]
004307E2 |50 PUSH EAX
004307E3 |56 PUSH ESI
004307E4 |8BF2 MOV ESI,EDX
004307E6 |97 XCHG EAX,EDI
004307E7 ^|EB 87 JMP SHORT 1551-cra.00430770 //这里还有一处
004307E9 AD LODS DWORD PTR DS:[ESI] //同样在此设断
004307EA 93 XCHG EAX,EBX
004307EB 5E POP ESI
004307EC 46 INC ESI
取消断点,继续往下走,不远处我们看到了如下代码
004307F4 84C0 TEST AL,AL
004307F6 ^ 75 FB JNZ SHORT 1551-cra.004307F3 //用同样的方法跳过
004307F8 FE0E DEC BYTE PTR DS:[ESI]
004307FA ^ 74 F0 JE SHORT 1551-cra.004307EC
004307FC 79 05 JNS SHORT 1551-cra.00430803
004307FE 46 INC ESI
004307FF AD LODS DWORD PTR DS:[ESI]
00430800 50 PUSH EAX
00430801 EB 09 JMP SHORT 1551-cra.0043080C
00430803 FE0E DEC BYTE PTR DS:[ESI]
00430805 - 0F84 5B1EFDFF JE 1551-cra.00402666 //看到了吧,这就是跨"段"的jmp
到这里程序还在壳中,我们取消断点,直接在入口点00402666下断点,bp 00402666
到达指定地点
启用插件ollydump,dump.保存为dump.exe.
脱壳初步成功
运行脱壳后的程序,晕!报错,why?I don't know.还是让我们调试一下再说吧。
用ollydbg载入dump.exe,按住f8,int3中断!!!
我们把它nop掉吧
0040126C |. 51 PUSH ECX ; |Arg1
0040126D |. E8 00F00000 CALL dumpd.00410272 ; \dumpd.00410272
00401272 |. 81BD D8FDFFFF>CMP DWORD PTR SS:[EBP-228],0FB45
0040127C |. 7E 02 JLE SHORT dumpd.00401280
0040127E |. CD 13 INT 13 //改成nop就可以了
00401280 |> 8D4D E4 LEA ECX,DWORD PTR SS:[EBP-1C]
00401283 |. 895E 64 MOV DWORD PTR DS:[ESI+64],EBX
保存,再运行,程序不再报错,用peid查看,是用vc++6编写的,脱壳成功