【文章标题】: 菜鸟脱ExeCryptor的笔记
【文章作者】: machenglin
【软件名称】: pm
【软件大小】: 1.9MB
【下载地址】: 自己搜索下载
【加壳方式】: ExeCryptor
【保护方式】: ExeCryptor
【编写语言】: Borland Delphi
【使用工具】: OllyICE、PETools、ImportREC
【操作平台】: winxp sp2
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  
  首先感谢ExeCryptor脚本的作者。
  
  感谢参考学习ExeCryptor教程的作者。
  
  OD载入。
  
  7C921231    C3              retn                                 ; 系统断点。
  7C921232    8BFF            mov     edi, edi
  7C921234    90              nop
  7C921235    90              nop
  7C921236    90              nop
  7C921237    90              nop
  7C921238    90              nop
  7C921239 >  CC              int3
  7C92123A    C3              retn
  7C92123B    90              nop
  7C92123C    8BFF            mov     edi, edi
  ---------------------------------------------------------------------------------------------------
  一、找到OEP、转存。
  
  运行脚本Bypass AntiDBG OEP,出现几次异常,Shift+F9通过。
  
  0079F7BA    E8 038DEDFF     call    006784C2                     ; 停在伪OEP。
  0079F7BF    0D 71C08494     or      eax, 9484C071
  0079F7C4    07              pop     es
  0079F7C5    40              inc     eax
  0079F7C6    63E9            arpl    cx, bp
  0079F7C8    51              push    ecx
  0079F7C9    97              xchg    eax, edi
  0079F7CA    ED              in      eax, dx
  0079F7CB    FFE8            jmp     far eax                      ; 非法使用寄存器
  
  脚本结束。
  ---------------------------------------------------------------------------------------------------
  查code段00401000+23E000=63F000。
  
  shoooo大侠告诉我们:
  “delphi直接到初始化表的下一行去看,原oep处改成了jmp XXXX, XXXX可作oep”。
  
  0063E9A0  - E9 150E1600     jmp     <模块入口点>                  ; OEP!!!
  0063E9A5    81E0 CEF1E9B3   and     eax, B3E9F1CE
  0063E9AB    8BD0            mov     edx, eax
  0063E9AD    E8 DEF41100     call    0075DE90
  0063E9B2    335F 0C         xor     ebx, [edi+C]
  0063E9B5    D95B 0B         fstp    dword ptr [ebx+B]
  0063E9B8    B7 BD           mov     bh, 0BD
  0063E9BA    0BD8            or      ebx, eax
  0063E9BC  - E9 3F360200     jmp     00662000
  0063E9C1    D5 E8           aad     0E8
  0063E9C3    8AD2            mov     dl, dl
  0063E9C5    53              push    ebx
  0063E9C6    EC              in      al, dx
  0063E9C7    3A7C90 6A       cmp     bh, [eax+edx*4+6A]
  0063E9CB    8424F5 E5D8176A test    [esi*8+6A17D8E5], ah
  0063E9D2    006A 00         add     [edx], ch
  0063E9D5    68 A4EA6300     push    0063EAA4                         ; ASCII "AQB2005"
  
  用PETools转存为dumped.exe。
  
  在0063E9A0新建EIP。
  ====================================================================================================
  二、解密IAT,修复转存文件。
  
  用LordPE查看,一般EXECryptor壳,BBS区段下面的0eqizouf区段就是IAT表地址,当然,这个区段名由人随便命名
  ,但在BBS区段下面一个区段没有疑问。
  
  0eqizouf=0025C000。在OD数据窗口Ctrl+G:65C000。
  
  注意,EXECryptor加密的IAT函数用:文件名.xxxxxxxx 表示,“x”是数字。
  
  向下看:
  
  0065C1DC  00000000
  0065C1E0  007C731F  prj_safe.007C731F                            ; 加密的IAT,IATstart。
  0065C1E4  007DC743  prj_safe.007DC743
  0065C1E8  00678B15  prj_safe.00678B15
  ......
  0065C2C0  00760A9E  prj_safe.00760A9E
  0065C2C4  00000000
  0065C2C8  770F4850  oleaut32.SysFreeString                       ; 未加密的IAT
  0065C2CC  7711C99D  oleaut32.SysReAllocStringLen
  0065C2D0  770F4B59  oleaut32.SysAllocStringLen
  0065C2D4  00000000
  0065C2D8  00674239  prj_safe.00674239
  ......
  0065CBB8  71A23E00  WS2_32.bind
  0065CBBC  00000000
  0065CBC0  01FD1F70  sys_aq.get_key_password                      ; IATend。  
  
  ----------------------------------------------------------------------------------------------------
  打开ExeCryptor 2.xx IAT Rebuilder v1.1 脚本编辑。
  
  mov IATstart,0065C1E0
  mov IATend,0065CBC0                
  
  保存修改,运行ExeCryptor 2.xx IAT Rebuilder v1.1 脚本。
  
  这时可打开脚本运行窗口观察恢复情况。
  
  在恢复到0065C258出现异常,记住这个地址,下次修改用!终止脚本。
  
  注意,最好关闭文件,清理UDD全部。
  
  重新开始,直到伪OEP。
  
  在反汇编窗口Ctrl+G:0063E9A0(OEP),在0063E9A0新建EIP。
  在数据窗口Ctrl+G:0065C258,修改为00000000。
  
  运行ExeCryptor 2.xx IAT Rebuilder v1.1 脚本。
  
  脚本结束后,根据0065C258的函数地址修改为kernel32.FreeLibrary。
  
  再用ImportREC,OEP=0023E9A0 RVA=0025C1E0,修复转存文件。
  ====================================================================================================
  三、修复OEP。
  
  参考其他Borland Delphi文件修改OEP。
  
  这个软件中有一个Borland Delphi文件Project1,没有加密。
  ----------------------------------------------------------------------------------------------------
  0048FF74 >  55              push ebp
  0048FF75    8BEC            mov ebp,esp
  0048FF77    83C4 F0         add esp,-10
  0048FF7A    53              push ebx
  0048FF7B    B8 ACFC4800     mov eax,Project1.0048FCAC
  0048FF80    E8 F760F7FF     call Project1.0040607C                 ; F7跟随进入。
  
  来到这里。
  0040607C    53              push ebx
  0040607D    8BD8            mov ebx,eax
  0040607F    33C0            xor eax,eax
  00406081    A3 9C104900     mov dword ptr ds:[49109C],eax
  00406086    6A 00           push 0
  00406088    E8 2BFFFFFF     call <jmp.&kernel32.GetModuleHandleA>   ; 多熟悉的函数!
  ----------------------------------------------------------------------------------------------------
  修改OEP:
  0063E9A0 >  55              push ebp
  0063E9A1    8BEC            mov ebp,esp
  0063E9A3    83C4 F0         add esp,-10
  0063E9A6    53              push ebx
  0063E9A7    B8 30E26300     mov eax,AQTB_01.0063E230              ; 这里修改看下面②!
  0063E9AC    E8 FB86DCFF     call    004070AC                      ; 这里修改看下面①!
  0063E9B1    8B1D C0E26300   mov     ebx, [63E2C0]                 ; AQTB_2.0043508C 看后面!
  0063E9B7    68 A4EA6300     push    0063EAA4                      ; ASCII "AQB2005"
  0063E9BC    6A 00           push    0
  0063E9BE    6A 00           push    0
  0063E9C0    E8 6326DDFF     call    00411028
  0063E9C5    E8 BE27DDFF     call    00411188
  0063E9CA    3D B7000000     cmp     eax, 0B7
  0063E9CF    75 20           jnz     short 0063E9F1
  0063E9D1    6A 00           push    0
  0063E9D3    6A 00           push    0
  0063E9D5    68 A4EA6300     push    0063EAA4                      ; ASCII "AQB2005"
  0063E9DA    E8 DD95DCFF     call    <jmp.&user32.RegisterClipboar>
  ---------------------------------------------------------------------------------------------------
  ①在dumped_.exe的OEP附近搜索:
  
  push ebx
  mov ebx,eax
  xor eax,eax
  
  搜索到这里就是了。
  004070AC    53              push ebx
  004070AD    8BD8            mov ebx,eax
  004070AF    33C0            xor eax,eax
  004070B1    A3 A4F06300     mov dword ptr ds:[63F0A4],eax
  004070B6    6A 00           push 0
  004070B8    E8 2BFFFFFF     call <jmp.&kernel32.GetModuleHandleA>
  
  从OEP开始进入第一个call的入口地址这样就确定为004070AC。
  
  ②确定0063E9A7    B8 30E26300     mov eax,AQTB_01.00xxxxxx。
  确定了OEP开始进入第一个call的入口地址后,F7进入跟踪。
  现在另开OD打开用没有修复OEP的dumped_.exe,在反汇编窗口Ctrl+G:004070AC。
  在004070AC设内存访问断点,Shift+F9,运行。
  出现注册窗口,点“试用”,断下。
  
  看积存器:eax=0063E230
  
  为确认继续,F8步进到这里。
  004070E6    E8 4DD5FFFF     call    00404638                         ; F7进入。
  004070EB    5B              pop     ebx
  
  F8步进到这里。
  00404672    E8 61FFFFFF     call    004045D8                         ; F7进入。
  00404677    C3              retn
  
  004045D8    55              push    ebp
  004045D9    8BEC            mov     ebp, esp
  004045DB    53              push    ebx                    ; AAAA_.0063E230 这里入栈了。
  004045DC    56              push    esi
  004045DD    57              push    edi
  004045DE    A1 40966400     mov     eax, [649640]
  004045E3    85C0            test    eax, eax
  004045E5    74 4B           je      short 00404632
  004045E7    8B30            mov     esi, [eax]             ; 注意[eax]地址!
  
  ds:[0063E230]=000000ED
  
  数据窗口中定位:
  0063E230  000000ED
  0063E234  0063E238  AAAA_.0063E238
  0063E238  00407120  AAAA_.00407120
  0063E23C  004070F0  AAAA_.004070F0
  0063E240  00406F14  AAAA_.00406F14
  0063E244  00406EC0  AAAA_.00406EC0
  
  得到:
  0063E9A7    B8 30E26300     mov eax,0063E230
  
  ====================================================================================================
  四、初始化修改。
  
  修复OEP变形代码,完成初始化过程中,又出现内存异常,只能到启动界面,这个问题很费了一番周折,主要是基
  础太差的原因造成。
  
  也好,拿出没有修复OEP的dumped_.exe,对照在第一个call后补的代码行:
  
  0063E9AC    E8 FB86DCFF     call    004070AC                      ; 这里修改看下面①!
  0063E9B1    8B1D C0E26300   mov     ebx, [63E2C0]                 ; AQTB_2.0043508C
  
  经动态跟踪,没有修复OEP的dumped_.exe的是:
  
  00634D90    E8 1723DDFF     call prj_safe.004070AC
  00634D95    8B1D C0E26300   mov ebx,dword ptr ds:[63E2C0]         ; prj_safe.0063FC14
  
  修改:
  0063E9AC    E8 FB86DCFF     call    004070AC                      ; 这里修改看下面①!
  00634D95    8B1D C0E26300   mov ebx,dword ptr ds:[63E2C0]         ; prj_safe.0063FC14
  
  004070AC=prj_safe.004070AC
  
  保存,运行。到了“用户登陆”界面,测试正常。
  
  ====================================================================================================
  五、文件优化。
  
  这个软件未脱壳前为1.95 MB,想当然的把3个壳区断删除,重建PE。
  运行后问题出来了,键入用户名后,又跳出一个口令窗口,我没有设密码呀!?
  载入未优化的软件,在壳的3个区段F2,断在一个壳区段,只得将这个区段重新装配进去。
  启动脱壳软件,运行畅快了。
  就是文件字节还是有些大,为3.9MB,还是基础太差,汗!
  
  ====================================================================================================
  六、脱壳ExeCryptor小结
  
  这是纯属个人理解,千万别误导你的正确思路。
  
  1、必须有一个能反反跟踪的OD,建议用OllyICE。
  2、转存时PETools比LordPE成功率高。
  3、未加壳前文件的TLS在idata区段头。
  4、ExeCryptor加密的IAT区段在BBS段下面的一个区段(Borland Delphi)。
  5、脱壳前准备一个同语言的参考文件,最好是本软件文件内的。
  6、保留一个ImportREC修复的最初文件,修复参考用。
  7、有些SDK是存在壳区段,优化时要注意。
  
  本人是个菜鸟,不是很懂编程语言,作为脱壳过程中走过的失败,给像我一样的初哥们参考。
  
 
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2006年10月18日 22:45:42