在国外的一个很好的网站上找到一款可以给任何exe文件加密码的小软件,界面清爽,功能强大,就下载来玩玩,没想到这还是一次坎坷但意味深长的经历呢o(∩_∩)o...

PEID查壳显示是UPX,顿时觉得没挑战性,用peid插件脱,未果;用OD手动载入脱,失败有点意思,把这个过程分享一下,算是给大家扩展下思路吧。

新手练手,牛牛飘过 

OD载入代码如下:

代码:
00468D90 >  60              pushad
00468D91    BE 00204400     mov     esi, 00442000
00468D96    8DBE 00F0FBFF   lea     edi, dword ptr [esi+FFFBF000]
00468D9C    C787 D0D40400 B>mov     dword ptr [edi+4D4D0], 1487B1B8
00468DA6    57              push    edi
00468DA7    83CD FF         or      ebp, FFFFFFFF
00468DAA    EB 0E           jmp     short 00468DBA
00468DAC    90              nop
一看就是标准UPX,F8单步一下直接ESP定律hr 0012FFC4,然后shift+F9运行至此
代码:
00468F36    8D4424 80       lea     eax, dword ptr [esp-80]   ****停在这里
00468F3A    6A 00           push    0
00468F3C    39C4            cmp     esp, eax
00468F3E  ^ 75 FA           jnz     short 00468F3A
00468F40    83EC 80         sub     esp, -80
00468F43  ^ E9 2437FEFF     jmp     0044C66C
00468F48    60              pushad
00468F49    8F46 00         pop     dword ptr [esi]
00468F4C  ^ 70 8F           jo      short 00468EDD
00468F4E    46              inc     esi
00468F4F    00D0            add     al, dl
00468F51    E4 44           in      al, 44
稍微有一点和传统的upx不太一样,不过没什么影响,删除硬件断点F8单步在jmp 0044C66C直接跳向了OEP(我曾经怀疑了自己是不是搞错了,因为脱壳修复后程序显示莫名奇妙的错误,以至于我都没想到是自校验)
代码:
0044C66C    55              push    ebp
0044C66D    8BEC            mov     ebp, esp
0044C66F    83C4 F4         add     esp, -0C
0044C672    B8 DCC44400     mov     eax, 0044C4DC
0044C677    E8 5097FBFF     call    00405DCC
0044C67C    E8 0B80FFFF     call    0044468C
0044C681    84C0            test    al, al
0044C683    75 09           jnz     short 0044C68E
0044C685    E8 7A81FFFF     call    00444804
0044C68A    84C0            test    al, al
0044C68C    74 19           je      short 0044C6A7
0044C68E    6A 40           push    40
0044C690    68 18C74400     push    0044C718             ; ASCII "Debugger detected"
0044C695    68 2CC74400     push    0044C72C             ; ASCII "No debuggers,please."
0044C69A    E8 619DFBFF     call    00406400                         ; jmp 到 USER32.GetDesktopWindow
0044C69F    50              push    eax
0044C6A0    E8 139FFBFF     call    004065B8                         ; jmp 到 USER32.MessageBoxA
0044C6A5    EB 6A           jmp     short 0044C711

用OD加载脱壳修复后的程序先修改一下0044C68C位jmp,因为程序会检测调试器的。
试运行,显示Application Error,究竟怎么回事?尝试OD不忽略内存访问异常,看能不能断下来,未果;那下bp MessageBoxA断点,未果百思不得其解!
灵机一动,OD载入,ctrl+F8让OD自动单步步进,出现错误提示,好
代码:
7C92EAF0    8B1C24          mov     ebx, dword ptr [esp]
7C92EAF3    51              push    ecx
7C92EAF4    53              push    ebx
7C92EAF5    E8 C78C0200     call    7C9577C1
7C92EAFA    0AC0            or      al, al
7C92EAFC    74 0C           je      short 7C92EB0A
OD标题显示试ntdll模块,没关系,按小键盘减号“-”键,直到回到程序领空
代码:
0044C6D7   .  E8 7045FFFF   call    00440C4C
0044C6DC   .  E8 F385FFFF   call    00444CD4
0044C6E1   .  3D E0930400   cmp     eax, 493E0
0044C6E6   .  7E 05         jle     short 0044C6ED
0044C6E8   .  E8 B386FFFF   call    00444DA0           ******停在了这里
0044C6ED   >  8B0D 10DE4400 mov     ecx, dword ptr [44DE10]  
0044C6F3   .  A1 34DD4400   mov     eax, dword ptr [44DD34]

开心了cmp eax, 493E0看起来多熟悉,自校验,下面的jle改成jmp保存程序,一切正常,收工!

1.常规手动脱壳
2.修改0044C68C处的跳转跳过调试器检测
3.修改0044C6E6跳转跳过自校验,搞定
上传的附件 empathy.rar[解压密码:PEDIY]