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。
    [逆向破解]使用ESP定律手动脱"中国菜刀"壳
  这里PEID有效的告诉了我们,该程序加的是UPX压缩加密壳。
  直接导入进OD里面。
  [逆向破解]使用ESP定律手动脱"中国菜刀"壳

    如果目标程序加了壳的话,导入进od都会有该提示。直接点否。
[逆向破解]使用ESP定律手动脱"中国菜刀"壳

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

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

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

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

    按下之后右边的ESP以及EIP会同时变红。变成了红色代表有新的数据压入。注意:多个寄存器中除了EIP外只有ESP红色才行。其他变红则不能使用ESP定律脱壳。
 
[逆向破解]使用ESP定律手动脱"中国菜刀"壳
      选中 ESP  0012FFA4 然后右键 选择数据窗口中跟随。然后注意左下角。

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

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

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

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。
然后会发现直接跳进了真正程序的入口。
 

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

 

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入口特征百度都是有的。为了方便阅读。我已经从网上收集了出来。在本文的最下方就可以看到了)

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

找到了OEP接下来就是脱壳了。记住脱壳之前请先讲断点删除掉否则程序将会出错或者脱壳失败的。
[逆向破解]使用ESP定律手动脱"中国菜刀"壳
我们右键-》用OllyDump脱壳调试进程

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

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

选择脱壳。然后保存。
 
这个时候我们在打开PEID来查一下"中国菜刀_1.exe"
 
[逆向破解]使用ESP定律手动脱"中国菜刀"壳
    成功把壳脱下来了。当然像UPX这种壳的话。网上都有很多脱壳机和脱壳脚本来。直接用就可以啦。

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

    程序也能运行。
    
    好啦,文章结束了,本文基本上没什么可以说的点。只是本着做笔记以后感叹人生以及交流分享所发滴。。
 
    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

相关文章:

  • 2021-09-02
  • 2021-10-06
  • 2021-07-10
  • 2022-12-23
  • 2021-12-04
  • 2021-06-26
  • 2021-12-01
  • 2021-08-20
猜你喜欢
  • 2021-06-23
  • 2021-07-02
  • 2022-12-23
  • 2022-12-23
  • 2021-05-23
  • 2022-12-23
  • 2022-01-08
相关资源
相似解决方案