返回列表 发帖

[转帖]菜鸟脱ExeCryptor的笔记

【文章标题】: 菜鸟脱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 ; 多熟悉的函数! ---------------------------------------------------------------------------------------------------- 修改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 --------------------------------------------------------------------------------------------------- ①在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 从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

返回列表 回复 发帖