[逆向破解]使用ESP定律手动脱"中国菜刀"壳

0x00前言:

ESC定律脱壳一般的加壳软件在执行时,首先要初始化,保存环境(保存各个寄存器的值),一般利用PUSHAD(相当于把eax,ecx,edx,ebx,esp,ebp,esi,edi都压栈),当加壳程序的外壳执行完毕以后,再来恢复各个寄存器的内容,通常会用POPAD(相当与把eax,ecx,edx,ebx,esp,ebp,esi,edi都出栈),通过跨区段的转移来跳到程序的OEP来执行原程序!简单点来说就是会将加壳过程执行一遍之后会跳到OEP来执行源程序。当我们找到了OEP的时候就是找到了源程序,就可以脱壳了(以上简单点来说纯属是我个人理解)。

0x01工具:

  • PEID v0.95
  • Ollydbg

0x02正文:

一般拿到程序的第一件事就是查壳,查是否存在壳,存在什么壳。打开PEID。

这里PEID有效的告诉了我们,该程序加的是UPX压缩加密壳。

直接导入进OD里面。

如果目标程序加了壳的话,导入进od都会有该提示。直接点否。

点否之后OD会自动到pusdad 既是外壳的入口点。

注意右边的寄存器。现在一共是有EAX、ECX、EDX、ESP、EBP、ESI、EDI寄存器。

然后我们按下F8或者点菜单栏的单步步过。

按下之后右边的ESP以及EIP会同时变红。变成了红色代表有新的数据压入。注意:多个寄存器中除了EIP外只有ESP红色才行。其他变红则不能使用ESP定律脱壳。

选中 ESP  0012FFA4 然后右键 选择数据窗口中跟随。然后注意左下角。

左下角任意选择一段数据。右键-》断点-》硬件访问-》Word。然后运行程序(F9)。程序运行到指定地方会自动断点停掉。

004AE9BB    6A 00           push 0x0

004AE9BD    39C4            cmp esp,eax

004AE9BF    75 FA            jnz short 中国菜刀.004AE9BB

注意看这里。有一个判断。看红色箭头(这个箭头不是我标的)。如果不为0 那么就跳向 004AE9BB

这里我们需要选择"004AE9BF    75 FA  jnz short 中国菜刀.004AE9BB"的下面一行。然后按F4。直接跳过这个判断之后。继续按F8。

然后会发现直接跳进了真正程序的入口。

004659A8    55              push ebp

004659A9    8BEC            mov ebp,esp

004659AB    6A FF           push -0x1

004659AD    68 18714700     push 中国菜刀.00477118

004659B2    68 805B4600     push 中国菜刀.00465B80

004659B7    64:A1 00000000  mov eax,dword ptr fs:[0]

004659BD    50              push eax

004659BE    64:8925 0000000>mov dword ptr fs:[0],esp

004659C5    83EC 68         sub esp,0x68

004659C8    53              push ebx

004659C9    56              push esi

004659CA    57              push edi

004659CB    8965 E8         mov dword ptr ss:[ebp-0x18],esp

004659CE    33DB            xor ebx,ebx

004659D0    895D FC         mov dword ptr ss:[ebp-0x4],ebx

004659D3    6A 02           push 0x2

004659D5    5F              pop edi                                  ; 0012FFF0

这里就是我们要的OEP了。通过OEP我们可以猜出该程序是什么编程语言开发的。

(OEP入口特征百度都是有的。为了方便阅读。我已经从网上收集了出来。在本文的最下方就可以看到了)

 

找到了OEP接下来就是脱壳了。记住脱壳之前请先讲断点删除掉否则程序将会出错或者脱壳失败的。

我们右键-》用OllyDump脱壳调试进程

选择脱壳。然后保存。

这个时候我们在打开PEID来查一下"中国菜刀_1.exe"

成功把壳脱下来了。当然像UPX这种壳的话。网上都有很多脱壳机和脱壳脚本来。直接用就可以啦。

程序也能运行。

好啦,文章结束了,本文基本上没什么可以说的点。只是本着做笔记以后感叹人生以及交流分享所发滴。。

PS:本着交流分享。如果有好的方法或者思路以及上文讲述不正确的地方欢迎指出。谢谢!(大牛勿喷!!)

  

OEP入口的特征大全:
Microsoft Visual C++ 6.0
push    ebp
mov     ebp, esp
push    -1
push    004C0618
push    004736F8
mov     eax, dword ptr fs:[0]
push    eax
mov     dword ptr fs:[0], esp
sub     esp, 58
push    ebx
push    esi
push    edi
mov     [local.6], esp

Microsoft Visual Basic 5.0 / 6.0
JMP DWORD PTR DS[<&MSVBVM60.#100>]
PUSH Dumped.00407C14
CALL <JMP.&MSVBVM60.#100>
ADD BYTE PTR DS:[EAX],AL
ADD BYTE PTR DS:[EAX],AL
ADD BYTE PTR DS:[EAX],AL
XOR BYTE PTR DS:[EAX],AL
VB还有一种
push Dumped.0040D4D0
call <jmp.&msvbvm60.ThunRTMain>
add byte ptr ds:[eax],al
add byte ptr ds:[eax],al
add byte ptr ds:[eax],al
xor byte ptr ds:[eax],al
add byte ptr ds:[eax],al

Borland C++
JMP SHORT BCLOCK.0040164E
DB 66                     ; CHAR ‘f‘
DB 62                     ; CHAR ‘b‘
DB 3A                     ; CHAR ‘:‘
DB 43                     ; CHAR ‘C‘
DB 2B                     ; CHAR ‘+‘
DB 2B                     ; CHAR ‘+‘
DB 48                     ; CHAR ‘H‘
DB 4F                     ; CHAR ‘O‘
DB 4F                     ; CHAR ‘O‘
DB 4B                     ; CHAR ‘K‘
NOP
DB E9
DD OFFSET BCLOCK.___CPPdebugHook
MOV   EAX,DWORD PTR DS:[4EE08B]
SHL    EAX,2
MOV   DWORD PTR DS:[4EE08F],EAX
PUSH  EDX
PUSH  0 ; /pModule = NULL
CALL  <JMP.&KERNEL32.GetModuleHandleA> ; /GetModuleHandleA
MOV   EDX,EAX

Borland Delphi 6.0 - 7.0
PUSH EBP
MOV  EBP,ESP
ADD  ESP,-14
PUSH EBX
PUSH ESI
PUSH EDI
XOR EAX,EAX
MOV DWORD PTR SS:[EBP-14],EAX
MOV EAX,Dumped.00509720
CALL Dumped.0040694C

易语言入口
call   Dumped.0040100B
push eax
call   <jmp.&KERNEL32.ExitProcess>
push ebp
mov  ebp,esp
add   esp,-110
jmp   Dumped.0040109C
imul   esi,dword ptr ds:[edx+6E],6C
outs  dx,byte ptr es:[edi]
也是有令一种形式
Microsoft Visual C++ 6.0 [Overlay]的E语言
PUSH  EBP
MOV   EBP,ESP
PUSH  -1
PUSH  Dumped.004062F0
PUSH  Dumped.00404CA4 ; SE 处理程序安装
MOV   EAX,DWORD PTR FS:[0]
PUSH  EAX
MOV   DWORD PTR FS:[0],ESP

MASM32 / TASM32
push 0                        ; /pModule = NULL
call  <jmp.&kernel32.GetModuleHandleA> ; /GetModuleHandleA
mov dword ptr ds:[403000],eax
push 0                       ; /lParam = NULL
push Dumped.004010DF ; |DlgProc = dump.004010DF
push 0                       ; |hOwner = NULL
push 65                     ; |pTemplate = 65
push dword ptr ds:[403000] ; |hInst = NULL
call   <jmp.&user32.DialogBoxParamA> ; /DialogBoxParamA

VC8
call Dumped.004ACF97
jmp Dumped.004A28FC
int   3
int   3
int   3
int   3
int   3
int   3
int   3
int   3
int   3
int   3
mov  ecx,dword ptr ss:[esp+4]
test   ecx,3
je      short Dumped.004A2B20
mov   al,byte ptr ds:[ecx]
add    ecx,1 
时间: 2024-07-30 13:37:08

[逆向破解]使用ESP定律手动脱"中国菜刀"壳的相关文章

手动脱NsPacK壳实战--吾爱破解培训第一课作业2

作者:Fly2015 这里脱壳的程序是吾爱破解培训的作业2,相较于作业1稍微要强一点,但是只要掌握了脱壳的ESP定律,脱这个Nspack壳并不难,不过还是蛮有意思的. 1.使用查壳软件对加壳的程序进行查壳. 使用PE Detective查壳的结果: 使用DIE查壳的结果: 2.OD载入程序进行脱壳操作 OD载入以后,被加壳程序的入口点的汇编代码,如图.很显然,加壳程序载入OD以后,发现有3个pushad指令,因此在进行程序脱壳的时候,根据ESP定律需要下3个硬件断点. 根据该加壳程序载入OD的汇

手动脱RLPack壳实战--吾爱破解培训第一课选修作业七

作者:Fly2015 吾爱破解论坛培训第一课选修作业练习的第7题.这个壳没听说过,但是脱起来比较简单,根据ESP定律即可直达光明,Dump出原来的程序. 老规矩,首先对需要脱壳的程序进行查壳处理. 使用DIE查壳的结果,程序加的是RLPack壳并且原程序是用微软编译器编译的. OD载入加壳程序进行调试分析,入口点代码反汇编快照. 看到PUSHAD指令想都不要想,直接ESP定律脱壳.F8单走一步在ESP寄存器上设置硬件写入断点,然后F9运行程序,程序自然断在刚才设置的硬件断点处. 显然JMP指令的

手动脱KBys Packer(0.28)壳实战--吾爱破解培训第一课选修作业五

作者:Fly2015 吾爱破解培训第一课选修作业第5个练习程序,在公司的时候用郁金香OD调试该加壳程序的时候出了点问题,但是回家用吾爱破解版的OD一调试,浑身精神爽,啥问题也没有. 首先使用查壳工具对加壳的程序进行查壳操作. OD载入需要脱壳的程序进行动态调试和分析,加壳程序入口点反汇编快照. F8单步跟踪程序几步,发现了比较熟悉的PUSHAD指令,又可以轻松的使用ESP定律进行程序的脱壳了. F8单步到指令PUSHAD的下一条指令,ESP寄存器右键设置HW Break硬件写入断点,F9畅快的运

手动脱WinUpack 壳实战--吾爱破解培训第一课选修作业六

作者:Fly2015 吾爱破解培训第一课选修作业第6个练习示例程序.不得不重复那句话,没见过这种壳,该壳是压缩壳的一种,相对于压缩壳,加密壳的难度要大一些,特别是IAT表的修复问题上. 首先分别使用DIE和Exeinfo PE对该加壳程序进行查壳的处理. OD载入加WinUpack 壳的程序进行动态调试分析,加壳程序入口点反汇编快照. 想都不用想,看到PUSHAD直接ESP定律脱壳F8单步一步,ESP寄存器右键设置硬件写入断点.F9运行程序,程序自然的断在设置的硬件断点处,如图. 有点惊呆了,硬

手动脱UPX 壳实战--吾爱破解培训第一课作业1

作者:Fly2015 Windows平台的加壳软件还是比较多的,因此有很多人对于PC软件的脱壳乐此不彼,本人菜鸟一枚,也学习一下PC的脱壳.要对软件进行脱壳,首先第一步就是 查壳,然后才是 脱壳. 推荐比较好的查壳软件: PE Detective .Exeinfo PE.DIE工具. 需要脱壳的程序是吾爱破解论坛的windows逆向破解培训http://www.52pojie.cn/thread-378612-1-1.html第一课的作业题1. 1.对该程序(吾爱破解培训第一课作业一.exe)进

手动脱PeCompact 2.20壳实战-吾爱破解培训第一课选修作业四

作者:Fly2015 PeCompact壳又是一个没有听说过的壳,需要脱壳的程序是吾爱破解培训的第一课的选修作业四.最近对脱壳有点上瘾了,当然也遭受了脱壳受挫的无奈,但是比较幸运还是把这个壳给搞了. 对加壳程序进行查壳. 工具DIE显示程序加的是PeCompact壳,并且原来没加壳的程序使用Microsoft Visual C/C++(2008)编写的,这一点对于查找原程序的真实OEP非常有帮助. OD载入加壳的程序进行分析,加壳程序的入口点的汇编代码. F8走了几步,坑啊,写壳的作者在代码中设

手动脱KBys Packer(0.28)壳实战

作者:Fly2015 吾爱破解培训第一课选修作业第5个练习程序.在公司的时候用郁金香OD调试该加壳程序的时候出了点问题,可是回家用吾爱破解版的OD一调试,浑身精神爽,啥问题也没有. 首先使用查壳工具对加壳的程序进行查壳操作. OD加载须要脱壳的程序进行动态调试和分析,加壳程序入口点反汇编快照. F8单步跟踪程序几步,发现了比較熟悉的PUSHAD指令,又能够轻松的使用ESP定律进行程序的脱壳了. F8单步到指令PUSHAD的下一条指令,ESP寄存器右键设置HW Break硬件写入断点,F9畅快的执

破解之寻找OEP[手动脱壳](2)

1.使用ESP定律 OD载入后,F8一次,在寄存器窗口的ESP的内容上(如0012FFA4)右键:“在数据窗口中跟随”,到内存数据窗口,将内存数据窗口以HEX 数据形式显示,在刚才的地址起始位置上(如0012FFA4)上右键:“断点”->“硬件访问”->“字”,F9直接运行,再F8一次或二 次,一般会到push ebp这句代码,这句代码所在的地址,就是OEP. 2.二次断点法 OD载入后,点击“M”按钮进入内存映射页面,先在数据(data).资源(rsrc).rdata.idata等区段下访问

20145331魏澍琛 《网络对抗技术》 PC平台逆向破解

20145331魏澍琛 <网络对抗技术> PC平台逆向破解 学习任务 1.shellcode注入:shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将堆栈的返回地址利用缓冲区溢出,覆盖成为指向 shellcode 的地址. 2.Return-to-libc 攻击实验:即使栈有不可执行的能力,无法将shellcode放入堆栈中运行,但我们却可以直接让漏洞程序调转到现存的代码来实现我们的攻击. 注入Shellcode并执行 1.设置环境 2.以 anyt