EXECryptor脚本使用说明
 

标题:EXECryptor脚本使用说明
链接:http://www.unpack.cn/viewthread.php?tid=17510
帖者:unppnu
日期:2007-9-16 14:56

看到一些初学者对EXECryptor脚本使用存在着一定的困难,这里是本人在脱EXECryptor时的一点体会,期待能给初学者朋友一些帮助。

祝你们玩的快乐!
---------------------------------------------------------------------------------------------------------------
一、确认文件编写语言

一般在从PE头文件信息头可以知道是用何语言编写的。

下面就以Borland Delphi作为示例。

CODE
DATA
BBS
.idata
.tls
.rdata
.reloc
.rsrc
一般Delphi的标准区段是这样的。

从图中我们可以看到被EXECryptor修改成它的特有区段名:

.idata=c3usshcz
.reloc=jwtb8xm4



---------------------------------------------------------------------------------------------------------------
二,EXECryptor找IAT

除特别外,EXECryptor加壳后的软件,IAT可以在.idata区段找到。

OD载入后停在系统断点,因为代码还没有释放的原因,貌似都是00什么也找不到。

为能得到IAT地址,请先运行脚本到伪OEP后才能看到。

脚本找到的OEP:
007F17B5    /E9 66FF0400        jmp 00841720                         ; True or fake OEP!
007F17BA    |E9 4D7A0000        jmp 007F920C                         ; gclgj.007F920C
007F17BF   ^|0F82 FAF4FDFF      jb 007D0CBF                          ; gclgj.007D0CBF
007F17C5    |9C                 pushfd
007F17C6    |E9 01A80300        jmp 0082BFCC                         ; gclgj.0082BFCC
007F17CB    |2B15 360C7E00      sub edx,dword ptr ds:[7E0C36]
007F17D1    |81F2 4E2673CD      xor edx,CD73264E
007F17D7    |03D5               add edx,ebp
007F17D9    |81C2 D8B62D99      add edx,992DB6D8
007F17DF    |8B12               mov edx,dword ptr ds:[edx]
007F17E1   -|E9 65AFEBFF        jmp 006AC74B                         ; gclgj.006AC74B

一般以这样的形式存在:

006A3200  00000000
006A3204  00000000                       ☆iat_start
006A3208  007CE01C  gclgj.007CE01C
006A320C  0083CFA3  gclgj.0083CFA3
006A3210  00802C80  gclgj.00802C80
......
006A32E4  0081AB9F  gclgj.0081AB9F
006A32E8  0080FFF0  gclgj.0080FFF0
006A32EC  00000000
006A32F0  770F4880  oleaut32.SysFreeString
006A32F4  771244AD  oleaut32.SysReAllocStringLen
006A32F8  770F4BA7  oleaut32.SysAllocStringLen
006A32FC  00000000
006A3300  0081E447  gclgj.0081E447
006A3304  007F2597  gclgj.007F2597
......
006A3B64  71A23F41  WS2_32.inet_ntoa
006A3B68  71A22BF4  WS2_32.inet_addr
006A3B6C  71A22B66  WS2_32.ntohs
006A3B70  71A2406A  WS2_32.connect
006A3B74  71A29639  WS2_32.closesocket
006A3B78  71A31028  WS2_32.accept
006A3B7C  00000000                         ☆iat_end
006A3B80  00000000
006A3B84  00000000

在.idata区段上下滚动,找到iat_start、iat_end,确定Size=006A3B7C-006A3204=978

OK,在脚本中修改IAT地址:

//================================================
mov iat_start,006A3B7C
mov iat_end,006A3204
//================================================

现在运行脚本吧。
---------------------------------------------------------------------------------------------------------------
三、脚本中恢复IAT表过程异常处理

运行脚本,在脚本中恢复IAT表过程中出现异常!

006A3200  00000000
006A3204  00000000
006A3208  7C808FBC  ASCII "NTDLL.RtlDeleteCriticalSection"
006A320C  7C80911B  ASCII "NTDLL.RtlLeaveCriticalSection"
006A3210  7C921005  ntdll.RtlEnterCriticalSection         ▲复制这一行到记事本
006A3214  006BEB5C  gclgj.006BEB5C



复制这一行到记事本,其中Value的值是恢复IAT完成后需要的函数。

再次OD重新载入文件,在脚本弹出“请修改.....”时:

1、在数据窗口Ctrl+G:006A3B7C 定位,修改异常地址Value的值=00000000。



006A3200  00000000
006A3204  00000000
006A3208  007CE01C  gclgj.007CE01C
006A320C  0083CFA3  gclgj.0083CFA3
006A3210  00000000
006A3214  006BEB5C  gclgj.006BEB5C
006A3218  00847E69  gclgj.00847E69
006A321C  00840CF5  gclgj.00840CF5

2、在脚本窗口F4继续运行脚本,直到下次异常出现。



3、复制异常行到记事本,再次OD重新载入文件运行脚本。

4、如此反复,直到脚本运行结束。

5、脚本运行结束后,编辑修改异常为00的Value的值为记录值,代码恢复了。

006A3200  00000000
006A3204  00000000
006A3208  7C808FBC  ASCII "NTDLL.RtlDeleteCriticalSection"
006A320C  7C80911B  ASCII "NTDLL.RtlLeaveCriticalSection"
006A3210  7C921005  ntdll.RtlEnterCriticalSection  ★IAT恢复了    
006A3214  7C809EF1  kernel32.InitializeCriticalSection
006A3218  7C809AE4  kernel32.VirtualFree
006A321C  7C809A51  kernel32.VirtualAlloc



在数据窗口Ctrl+G:006A3204 定位后,可以直接看到IAT恢复的情形。
---------------------------------------------------------------------------------------------------------------
四、修复tls表

TLS表在Borland的程序中是必须的,它的原来是在.rdata区段。非Borland文件RVA=0。



打开LordPE--->区段,查看.rdata区段V偏移为000E2000。

返回LordPE--->目录,修改tls表RVA=000E2000。



---------------------------------------------------------------------------------------------------------------
五、某些机上用F2断点跑飞问题
有一个干净的系统是很重要的。

因种种客观原因的实际存在,教程中一些F2断点经常跑飞,使调试无法继续进行。

我们可以把F2断点转为内存访问、写入断点。

例如:
BP WaitForDebugEvent

下F2断点经常跑飞,就在断点窗口双击该断点,到反汇编窗口,取消F2断点转为内存访问、写入断点。


---------------------------------------------------------------------------------------------------------------

上一篇   下一篇