【文章标题】: 手动脱壳Themida加壳的DLL
【文章作者】: maikkk
【软件名称】: unpackme.dll
【软件大小】: 1.60M
【下载地址】: 自己搜索下载
【加壳方式】: 未知
【保护方式】: 代码变形,IAT加密
【编写语言】: Microsoft Visual C++ 6.0
【使用工具】: OllyICE,ImportREC_fix,HideToolz,
【操作平台】: XP2
【软件介绍】: AhnLab, Inc
【作者声明】: 处女作.嘎嘎.失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
1.首先查壳:Themida/WinLicense V1.8.X-V1.9.X Other -> Oreans Technologies * Sign.By.fly * 20080131 *
OD 载入 ,忽略所有异常,勾选Hide OD的Option Auto Run HideOD,HideNtDebugbit.HideOD,
再运行HideToolz,打开右上角的Options勾选 Hide process,Protect process,Hide windows,Protect from windows hooks
Anti-anti debug.隐藏OllyICE进程.清除所有断点包括硬件断点.
1018E014 > B8 00004C06 mov eax, 64C0000 -> Themida/WinLicense V1.8.X-V1.9.X Other 入口
1018E019 60 pushad
1018E01A 0BC0 or eax, eax
1018E01C 74 68 je short 1018E086
1018E01E E8 00000000 call 1018E023
1018E023 58 pop eax
1018E024 05 53000000 add eax, 53
1018E029 8038 E9 cmp byte ptr [eax], 0E9
1018E02C 75 13 jnz short 1018E041
1018E02E 61 popad
1018E02F EB 45 jmp short 1018E076
1018E031 DB2D 37E01810 fld tbyte ptr [1018E037]
在unpackme CODE 段下内存写入断点,按F9到下面
1029736B F3:A4 rep movs byte ptr es:[edi], byte ptr [esi] ->再按F7+F8运行
1029736D C685 512DC106 5>mov byte ptr [ebp+6C12D51], 56
10297374 68 396D1FD4 push D41F6D39
10297379 FFB5 8522C106 push dword ptr [ebp+6C12285]
1029737F 8D85 EED5C406 lea eax, dword ptr [ebp+6C4D5EE]
10297385 FFD0 call eax
10297387 68 00800000 push 8000
1029738C 6A 00 push 0
1029738E 52 push edx
1029738F FFD0 call eax
10297391 8BC0 mov eax, eax
10297393 83BD A515C106 0>cmp dword ptr [ebp+6C115A5], 0
再按F9到下面
1029E4FF 2933 sub dword ptr [ebx], esi ->断在这里,取消内存写入断点
1029E501 013B add dword ptr [ebx], edi
1029E503 83C1 02 add ecx, 2
1029E506 83EA 02 sub edx, 2
1029E509 ^ 0F85 65FFFFFF jnz 1029E474
1029E50F 83BD B909C106 0>cmp dword ptr [ebp+6C109B9], 0
1029E516 ^ 0F85 45FFFFFF jnz 1029E461
1029E51C 8BBD 0D1DC106 mov edi, dword ptr [ebp+6C11D0D] ->选择这里按F4
1029E522 B9 F86F0000 mov ecx, 6FF8
1029E527 32C0 xor al, al
1029E529 F3:AA rep stos byte ptr es:[edi]
再到CODE段下内存写入断点,按F9到下面,EAX是IAT数组,记录下来,ebx是API地址
102AAC38 8918 mov dword ptr [eax], ebx ; VERSION.VerQueryValueA
102AAC3A 8B1C24 mov ebx, dword ptr [esp]
102AAC3D 83C4 04 add esp, 4
102AAC40 E9 0E000000 jmp 102AAC53
102AAC45 0342 7A add eax, dword ptr [edx+7A]
102AAC48 DD79 FC fstsw word ptr [ecx-4]
102AAC4B EC in al, dx
102AAC4C EB 3D jmp short 102AAC8B
然后在ntdll.dll的ZwFreeVirtualMemory 的retn 下断点,同时取消内存写入断点
7C92DA48 > B8 53000000 mov eax, 53
7C92DA4D BA 0003FE7F mov edx, 7FFE0300
7C92DA52 FF12 call dword ptr [edx]
7C92DA54 C2 1000 retn 10 -> 这里下断
按F9后,断在7C92DA54,别取消,再到CODE段下断点.按F9,如此重复几次到达下面OEP
10040787 /. 55 push ebp
10040788 |. 8BEC mov ebp, esp
1004078A |. 53 push ebx
1004078B |. 8B5D 08 mov ebx, dword ptr [ebp+8]
1004078E |. 56 push esi
1004078F |. 8B75 0C mov esi, dword ptr [ebp+C]
10040792 |. 57 push edi
10040793 |. 8B7D 10 mov edi, dword ptr [ebp+10]
10040796 |. 85F6 test esi, esi
10040798 |. 75 09 jnz short 100407A3
DUMP DLL.
打开ImportREC_fix在进程列表里选择loaddll.exe,载入后再打开pick dll,选择unpackme.dll
在OD里面查看记录下来的 IAT地址 ,向上拉发现在1007500开始 到100754C8结束大小4C8
因为是DLL基地址10000000 所以10040787-10000000 = 40787
输入OEP:40787,RVA:00075000,size:4C8
fix dump
在这多谢论坛各位大大的以往例子
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2008年08月12日 17:41:55
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!