“破解大牛是怎么炼成的”之壳与ESP定律
文章难易度:★★★
文章阅读点/知识点:逆向破解
文章作者:Sp4ce
文章来源: i春秋
关键字:网络 信息安全技术
本文参与i春秋社区原创文章奖励计划,未经许可禁止转载!
一、前言
通过前面几篇的学习,我们学会了利用暴力破解达到绕过注册机制和追踪注册码来达到“合法”用软件的方法,但是我们往往会遇到代码经过混淆器混淆的程序,此类混淆器可以称之为壳,壳又可分为压缩壳(常见的有UPX、北斗、ASDPack、Npack、PECompact等)和保护壳(如强壳Safengine、VMprotect、winlicense、Themida等),压缩壳作用是把程序进行体积缩小化处理,保护壳主要作用是混淆或加密代码防止他人进行逆向程序、破解程序。我们可以通过一些侦壳程序进行识别,但有些壳会采用伪装技术来混淆侦壳程序。
本次文章是UPX压缩壳的脱壳工作。
二、目录
1、前期工作
2、OD操作
3、小结
三、正文
我们先看下加壳软件和未加壳对比
左边是没有加壳的,右边是加壳的,明显的发现体积缩小了一半
我们再用PEID对比下加壳前和加壳后的EP段和一些有用的信息
我们载入OD后会发现这个提示,为了方便接下来的操作,我们在这里选否
载入后的OD
我们F8单步走走,注意右面寄存器FPU的显示,当有且只有ESP和EIP为红色时,我们可以用ESP定律了
下图就是这样的例子,我们这时候可以右键ESP后面那个地址,然后选择在数据窗口中跟随
也可以直接在下面的Command窗口中输入dd 0012FFA4 后回车
这两种方法最终的效果都会在数据窗口中跟随到0012FFA4这个地址,然后我们可以右键那一段地址任意HEX设置断点→硬件访问→word型
这个操作也可以在command窗口输入 HR 0012FFA4 回车后完成,然后我们按F9运行程序,此时程序会暂停在我们设置的断点位置
然后我们F8单步走,到了jnz位置后不要再按F8了(这是向上跳转的),我们用鼠标点击她的下一行然后按F4,让程序强制转到跳转下面继续运行,到达jmp后我们必须跳过去,因为接下来就有可能是程序的OEP领空
OEP:程序的入口点,软件加壳就是隐藏了OEP(或者用了假的OEP)
这里就是易语言/VC程序的OEP
然后我们就可以脱壳了,脱壳前我们先把断点清理掉,以免出错【调试→硬件断点→删除】
然后右击程序当前位置第一行代码,选择OllyDump脱壳调试进程
然后我们在弹出的窗口中选择脱壳,然后输入要另存为的文件名
此时,我们已经脱壳结束,检查下程序能否正常运行
我们再看下PEID对比脱壳前和脱壳后的不同
EP段提示UPX0是因为我没有优化区段
我们可以点>>来详细看下对比
脱壳后
未脱壳
到此,脱壳完成。
3、小结
程序在下面,部分语言OEP
delphi:
55 PUSH EBP
8BEC MOV EBP,ESP
83C4 F0 ADD ESP,-10
B8 A86F4B00 MOV EAX,PE.004B6FA8
vc++
55 PUSH EBP
8BEC MOV EBP,ESP
83EC 44 SUB ESP,44
56 PUSH ESI
vc6.0
55 push ebp
8BEC mov ebp,esp
6A FF push -1
vc7.0
6A 70 push 70
68 50110001 push hh.01001150
E8 1D020000 call hh.010017B0
33DB xor ebx,ebx
vb:
00401166 - FF25 6C104000 JMP DWORD PTR DS:[<&MSVBVM60.#100>] ; MSVBVM60.ThunRTMain
0040116C > 68 147C4000 PUSH PACKME.00407C14
00401171 E8 F0FFFFFF CALL <JMP.&MSVBVM60.#100>
00401176 0000 ADD BYTE PTR DS:[EAX],AL
00401178 0000 ADD BYTE PTR DS:[EAX],AL
0040117A 0000 ADD BYTE PTR DS:[EAX],AL
0040117C 3000 XOR BYTE PTR DS:[EAX],AL
bc++
0040163C > $ /EB 10 JMP SHORT BCLOCK.0040164E
0040163E |66 DB 66 ; CHAR 'f'
0040163F |62 DB 62 ; CHAR 'b'
00401640 |3A DB 3A ; CHAR ':'
00401641 |43 DB 43 ; CHAR 'C'
00401642 |2B DB 2B ; CHAR '+'
00401643 |2B DB 2B ; CHAR '+'
00401644 |48 DB 48 ; CHAR 'H'
00401645 |4F DB 4F ; CHAR 'O'
00401646 |4F DB 4F ; CHAR 'O'
00401647 |4B DB 4B ; CHAR 'K'
00401648 |90 NOP
00401649 |E9 DB E9
0040164A . |98E04E00 DD OFFSET BCLOCK.___CPPdebugHook
0040164E > \A1 8BE04E00 MOV EAX,DWORD PTR DS:[4EE08B]
00401653 . C1E0 02 SHL EAX,2
00401656 . A3 8FE04E00 MOV DWORD PTR DS:[4EE08F],EAX
0040165B . 52 PUSH EDX
0040165C . 6A 00 PUSH 0 ; /pModule = NULL
0040165E . E8 DFBC0E00 CALL <JMP.&KERNEL32.GetModuleHandleA> ; \GetModuleHandleA
00401663 . 8BD0 MOV EDX,EAX
dasm:
00401000 >/$ 6A 00 PUSH 0 ; /pModule = NULL
00401002 |. E8 C50A0000 CALL <JMP.&KERNEL32.GetModuleHandleA> ; \GetModuleHandleA
00401007 |. A3 0C354000 MOV DWORD PTR DS:[40350C],EAX
0040100C |. E8 B50A0000 CALL <JMP.&KERNEL32.GetCommandLineA> ; [GetCommandLineA
00401011 |. A3 10354000 MOV DWORD PTR DS:[403510],EAX
00401016 |. 6A 0A PUSH 0A ; /Arg4 = 0000000A
00401018 |. FF35 10354000 PUSH DWORD PTR DS:[403510] ; |Arg3 = 00000000
0040101E |. 6A 00 PUSH 0 ; |Arg2 = 00000000
00401020 |. FF35 0C354000 PUSH DWORD PTR DS:[40350C] ; |Arg1 = 00000000
本节出现的名词解释
EP段:EntryPoint,入口点
OD命令:
HR 访问时进行硬件中断
DD 转存在堆栈格式
EIP:寄存器的一种,EIP寄存器里存储的是CPU下次要执行的指令的地址
ESP:寄存器的一种,寄存器里存储的是是栈的栈底指针,通常叫栈基址
四、总结
有看客私下问我能不能直接学破解网络验证,那么我的回答是不能,没有基础的人,直接上难度高的,会丧失自信心,网络验证往往会伴随各种暗桩,轻则关机重启蓝屏,重则格盘毁MBR放毒,这些我在后面都会有提到
更多安全技术、精品好文、白帽黑客大佬尽在:http://bbs.ichunqiu.com/portal.php