kissy 发表于 2008-5-9 20:14

脱DLL双层壳+修复

双层壳:ASPack 2.11+PECompact(原的+脱的在附件)
OD载入在:
003E0001 > 60         pushad-------------------F8
003E0002E9 3D040000   jmp 1.003E0444---------------------HR ESP---F9
003E0007A1 30D3CFB9   mov eax,dword ptr ds:
003E000CF6         ???               ; 未知命令
003E000DCF         iretd
断在:
003E03AB/75 08      jnz short 1.003E03B5---删除断点---F8
003E03AD|B8 01000000   mov eax,1
003E03B2|C2 0C00       retn 0C
003E03B5\68 00B03D00   push 1.003DB000
003E03BAC3         retn
003DB000/EB 06      jmp short 1.003DB008----------第二层壳的入口---F8
003DB002|68 14450000   push 4514----------OEP的RVA(直接在003D4514处下 硬件执行 断点,或者下内存断点,F9运行就中断在OEP了。但在这个DLL脱了不能运行,只好一步步往下走)
   
003DB007|C3         retn
003DB008\9C         pushfd
003DB00960         pushad
003DB00AE8 02000000   call 1.003DB011--------------------F7
003DB00F33C0      xor eax,eax
003DB0118BC4      mov eax,esp
003DB01383C0 04       add eax,4
003DB01693         xchg eax,ebx
003DB0178BE3      mov esp,ebx
003DB0198B5B FC       mov ebx,dword ptr ds:
003DB01C81EB 0FA04000    sub ebx,40A00F
003DB02287DD      xchg ebp,ebx
............
003DC1EF/EB 14      jmp short 1.003DC205
003DC1F1|6E         outs dx,byte ptr es:
003DC1F2|F1         int1
003DC1F3|3D 0011B000   cmp eax,0B01100
003DC1F8|0000      add byte ptr ds:,al
003DC1FA|003D 0000B000    add byte ptr ds:,bh
003DC200|0000      add byte ptr ds:,al
003DC202|F0:0000       lock add byte ptr ds:,al
003DC205\8BB5 A6A04000    mov esi,dword ptr ss:
Ctrl+S在整个段块搜索命令序列:
代码:
add esi,ebx
xor eax,eax
找到以下代码:
003DC5758B9D A6A04000    mov ebx,dword ptr ss:---硬件执行断点---F9
003DC57B3B9D 3BA64000    cmp ebx,dword ptr ss:
003DC58175 01      jnz short 1.003DC584---如与映像基址不符则重定位处理!
003DC583C3         retn
003DC5848BB5 3FA64000    mov esi,dword ptr ss:
ss:=00009000 ---重定位表的开始 RVA
003DC58A03F3      add esi,ebx
003DC58C33C0      xor eax,eax
003DC58E66:8B43 3C   mov ax,word ptr ds:
003DC59203C3      add eax,ebx
003DC5948B80 C0000000    mov eax,dword ptr ds:
003DC59A85C0      test eax,eax
003DC59C75 08      jnz short 1.003DC5A6
003DC59E2B9D 3BA64000    sub ebx,dword ptr ss:
003DC5A4EB 0F      jmp short 1.003DC5B5
003DC5A603C3      add eax,ebx
003DC5A82B9D 3BA64000    sub ebx,dword ptr ss:
003DC5AE0118      add dword ptr ds:,ebx
003DC5B083C0 04       add eax,4
003DC5B30118      add dword ptr ds:,ebx
003DC5B5AD         lods dword ptr ds:---开始处理一段
003DC5B60BC0      or eax,eax
003DC5B874 6F      je short 1.003DC629
003DC5BA8BD0      mov edx,eax
003DC5BC0395 A6A04000    add edx,dword ptr ss:
003DC5C2AD         lods dword ptr ds:
003DC5C38BC8      mov ecx,eax
003DC5C583E9 08       sub ecx,8
003DC5C8D1E9      shr ecx,1
003DC5CA66:C785 31A64000 00>mov word ptr ss:,0---初始值, 变形的关键
003DC5D333C0      xor eax,eax
003DC5D566:AD      lods word ptr ds:
003DC5D70BC0      or eax,eax
003DC5D974 49      je short 1.003DC624
003DC5DB66:0385 31A64000add ax,word ptr ss:
003DC5E266:8985 31A64000mov word ptr ss:,ax
003DC5E950         push eax---------------变形值已还原(改动为:)

003DC5E966:8946 FE   mov word ptr ds:,ax
003DC5ED49         dec ecx
003DC5EE ^ 75 E3      jnz short 1.003DC5D3
003DC5F0 ^ EB C3      jmp short 1.003DC5B5

..........
003DC621/EB 01      jmp short 1.003DC624
003DC623|58         pop eax
003DC624\49         dec ecx
003DC625 ^ 75 AC      jnz short 1.003DC5D3
003DC627 ^ EB 8C      jmp short 1.003DC5B5
003DC629C3         retn-------------------硬件执行断点---F9
ESI=003D9354
重定位表结束地址=003D9354-4=003D9350
重定位表大小=003D9350-003D9000=350
LordPE 修改重定位表为 重定位=9000, 大小=350, OK.
F8往下:
003DC482E8 8F0C0000   call 1.003DD116
003DC48761         popad
003DC4889D         popfd
003DC48950         push eax
003DC48A68 14453D00   push 1.003D4514
003DC48FC2 0400       retn 4---------------F8
003D451455         push ebp------------------OEP
003D45158BEC      mov ebp,esp
003D451783C4 C4       add esp,-3C
003D451AB8 E4444000   mov eax,4044E4
003D451FE8 CCFBFFFF   call 1.003D40F0
003D4524E8 D3F2FFFF   call 1.003D37FC
003D45298D40 00       lea eax,dword ptr ds:
003D452C0000      add byte ptr ds:,al
003D452E0000      add byte ptr ds:,al
003D45300000      add byte ptr ds:,al
003D45320000      add byte ptr ds:,al
003D45340000      add byte ptr ds:,al
003D45360000      add byte ptr ds:,al
003D45380000      add byte ptr ds:,al
003D453A0000      add byte ptr ds:,al
用LordPE选中Ollydbg的loaddll.exe的进程,在下面的列表里选择1.dll,然后完整脱壳,得到dumped.dll。
Dump完之后,不要关闭Ollydbg,还要为下面的处理重定位表提供点准备。
随便从程序找一个API调用,如:
003D1000$- FF25 E8703D00   jmp dword ptr ds:   kernel32.CloseHandle
在转存中跟随003D1000,上下看到许多函数地址,很明显的可以找到IAT开始和结束的地址:
开始地址=003D7078
结束地址=003D7128
大小=003D7128-003D7078=50
运行ImportREC,选中Ollydbg的loaddll.exe的进程,然后点“选取DLL”,选择1.dll,填入RVA=00007078、大小=50、OEP=00004514 ,点“Get Import”。用PEditor纠正dumped.dll的DumpFixer,修正区块。FixDump!
脱壳DLL经测试成功!

Hmily 发表于 2008-5-9 20:20

学习DLL脱壳重定位~~~

joedy 发表于 2008-5-9 23:06

学习一下先了.哈哈~~~

youxian 发表于 2008-5-15 00:10

正在找这方面的资料,可惜壳不一样。学习了

249358562 发表于 2008-6-19 01:15

下来研究研究,谢谢了

小生我怕怕 发表于 2008-6-19 02:36

DLL最可怕的重定位,也是最麻烦的来学习啦!!!!

badboytcq 发表于 2008-6-20 00:51

好东西哦 收下了 感谢楼主发布

qweqweqwe0 发表于 2008-6-22 14:39

必须顶一下 。。。。弄不明白

659079 发表于 2010-7-17 18:25

下来研究研究

nevsayno 发表于 2010-9-6 13:15

学习下
页: [1]
查看完整版本: 脱DLL双层壳+修复