【目标程序】:一加了2层壳的dll文件,外层ASPack 2.12 内层是UPX,是某网站管理系统的核心dll,新近发布
名称和版本不便相告。
【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
【感 谢】: fly, rock 等好多位朋友对我的帮助。
【调试环境】:WinXP、Ollydbg1.10汉化版、UltraEdit、LordPE、UPXAngela
―――――――――――――――――――――――――――――――――
【脱壳过程】:
ASPack 这里就省略了,有很多工具可以直接脱。
开始脱UPX壳
用OD载入该dll文件
------------------------------------
11F1E98F 0080 7C240801 ADD BYTE PTR DS:[EAX+108247C],AL
//OD 载入的起始地址
11F1E995 0F85 A3010000 JNZ unpacked.11F1EB3E
11F1E99B 60 PUSHAD
11F1E99C BE 00B0D211 MOV ESI,unpacked.11D2B000
11F1E9A1 8DBE 00602DFF LEA EDI,DWORD PTR DS:[ESI+FF2D6000]
11F1E9A7 57 PUSH EDI
11F1E9A8 83CD FF OR EBP,FFFFFFFF
11F1E9AB EB 0D JMP SHORT unpacked.11F1E9BA
11F1E9AD 90 NOP
11F1E9AE 90 NOP
------------------------------------
Ctrl+s 块寻找
------------------------------------
XCHG AH,AL
ROL EAX,10
XCHG AH,AL
ADD EAX,ESI
------------------------------------
来到这里
------------------------------------
11F1EB06 8D5E FC LEA EBX,DWORD PTR DS:[ESI-4]
11F1EB09 31C0 XOR EAX,EAX
11F1EB0B 8A07 MOV AL,BYTE PTR DS:[EDI]
// 2.老规矩,在这里按F2断下,F9运行,此时EDI=11EB9994 ★重定位开始地址
11F1EB0D 47 INC EDI
11F1EB0E 09C0 OR EAX,EAX
11F1EB10 74 2B JE SHORT unpacked.11F1EB3D
// 3.注意此跳,这是重定位结束的跳转,由于在结束前有很多循环,所以我们直接到此地址断下
11F1EB12 3C EF CMP AL,0EF
11F1EB14 77 11 JA SHORT unpacked.11F1EB27
11F1EB16 01C3 ADD EBX,EAX
11F1EB18 8B03 MOV EAX,DWORD PTR DS:[EBX]
11F1EB1A 86C4 XCHG AH,AL // 1.我们找到的位置,向上看
11F1EB1C C1C0 10 ROL EAX,10
11F1EB1F 86C4 XCHG AH,AL
11F1EB21 01F0 ADD EAX,ESI
11F1EB23 8903 MOV DWORD PTR DS:[EBX],EAX
-------------------------------------
我们来到11F1EB3D,按F2断下,清除原来在11F1EB0B的断点(什么,怎么清除?怎么设置就怎么清除)F9运行。
-------------------------------------
11F1EB3D 61 POPAD
// 来到此处,此时EDI=11F1D8E0 ★重定位结束,清除断点。
11F1EB3E - E9 E99D0FFF JMP unpacked.1101892C
11F1EB43 0000 ADD BYTE PTR DS:[EAX],AL
11F1EB45 0000 ADD BYTE PTR DS:[EAX],AL
11F1EB47 0000 ADD BYTE PTR DS:[EAX],AL
按F8 来到 1101892C
-------------------------------------
1101892C 5A POP EDX ; ntdll.7C9211A7
// OEP ★
1101892D 68 30EFDC11 PUSH unpacked.11DCEF30
11018932 68 34EFDC11 PUSH unpacked.11DCEF34
11018937 52 PUSH EDX
运行 “插件”->“OllyDump”->“脱壳在当前调试的进程” 里面数据无需修改,点击“脱壳” 保存文件
dump.dll
此过程OD可能会有几秒的停顿,生成的文件无需再修改IAT,OllyDump自动完成,并自动修改OEP
重定位的修复
我尝试了几次,用《ReloX修复DLL脱壳重定位表的简便方法――用Ollydbg手脱Neolite加壳的DLL》中的方法
修复,未果,都到的2个dll的比较是0,没法修复。所以参考fly大哥《用Ollydbg手脱UPX加壳的DLL》手动处理。
UPX破坏了重定位表。在第一步我们已经得到重定位表的地址了,用UltraEdit或者WinHex(Winhex没用过,
不过坛子上的高手都用这个,功能比较强,本站工具板块有下载)打开dump.dll,复制EB9994-F1D8E0之间的16
进制数值,另存为bney.bin(11000000是基址,在用Ollydump的时候会显示在弹出的对话框上。什么是基址?晕
倒,去看新手入门)
运行 看雪 老师写的辅助修复UPX加壳DLL重定位表的工具UPXAngela.exe,打开bney.bin,很快的提示pediy.bin
文件创建成功!
从dump.dll找块空白代码,如自UPX1段的dd2100处开始。够用就行,pediy.bin中的数据长度为8d13。
用UltraEdit把pediy.bin中的16进制数值全部复制、写入到dump.dll的dd2100处。
用LordPE修正dump.dll的重定位表RVA=00dd2100、大小=00008d13,保存之。
结果:
本地测试ok,放到别的服务器上也没问题。如果,诸位讨厌“非常感谢您使用 XXXXXXXX。此版本由XX市
XXXXXXX有限公司开发,并完全免费提供给用户使用。”的信息,可以用getvbres搜索去掉之。
第一次解壳,作此文是为纪念、也是为了感谢pediy.com上朋友们对我的帮助。
有问题可以发mail到 yeelerr@21cn.com 我们可以一起讨论。
我还有几个问题想请教fly:
1. OllyDump插件能处理IAT,为什么老大还要自己找呢?是不是所有的壳,只要程序跑到入口,Ollydump都能修正IAT。
2. 修复后,下图中哪些段可以删除呢?
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!