标题:Armadillo加壳的dll脱壳:Visual.Assist.X
链接:http://www.unpack.cn/viewthread.php?tid=17307
贴者:freecat
日期:2007-9-10 18:30
Visual.Assist.X.V10
va_x.dll
peid查出为 Armadillo 4.x 加的壳
od加载 va_x.dll,提示内存错不理 点确定!
下断he VirtualAlloc 按F9
然后hd VirtualAlloc取消断点 按Alt+F9返回
00993F3C 6A 40 PUSH 40
00993F3E 68 00200000 PUSH 2000
00993F43 FFB5 64C6FFFF PUSH DWORD PTR SS:[EBP-399C]
00993F49 FF35 80E89A00 PUSH DWORD PTR DS:[9AE880]
00993F4F FF15 A4F19900 CALL NEAR DWORD PTR DS:[99F1A4] ; kernel32.VirtualAlloc
00993F55 8985 6CC6FFFF MOV DWORD PTR SS:[EBP-3994], EAX //返回到这
00993F5B 83BD 6CC6FFFF 00 CMP DWORD PTR SS:[EBP-3994], 0
00993F62 74 33 JE SHORT 00993F97
00993F64 6A 40 PUSH 40
00993F66 68 00100000 PUSH 1000
00993F6B FFB5 64C6FFFF PUSH DWORD PTR SS:[EBP-399C]
00993F71 FF35 80E89A00 PUSH DWORD PTR DS:[9AE880]
00993F77 FF15 A4F19900 CALL NEAR DWORD PTR DS:[99F1A4] ; kernel32.VirtualAlloc
00993F7D 8985 6CC6FFFF MOV DWORD PTR SS:[EBP-3994], EAX
下断he 993F49 Ctrl+F2 重来
在提示内存错不理 点确定
下断he GetModuleHandleA 按shift+F9
中断后按Alt+F9
hd GetModuleHandleA 取消断点
00979A27 FF15 CCF09900 CALL NEAR DWORD PTR DS:[99F0CC] ; kernel32.GetModuleHandleA
00979A2D 8B0D 40A19A00 MOV ECX, DWORD PTR DS:[9AA140] //返回到这
00979A33 89040E MOV DWORD PTR DS:[ESI+ECX], EAX
00979A36 A1 40A19A00 MOV EAX, DWORD PTR DS:[9AA140]
00979A3B 393C06 CMP DWORD PTR DS:[ESI+EAX], EDI
00979A3E 75 16 JNZ SHORT 00979A56
00979A40 8D85 B4FEFFFF LEA EAX, DWORD PTR SS:[EBP-14C]
00979A46 50 PUSH EAX
00979A47 FF15 D4F09900 CALL NEAR DWORD PTR DS:[99F0D4] ; kernel32.LoadLibraryA
00979A4D 8B0D 40A19A00 MOV ECX, DWORD PTR DS:[9AA140]
00979A53 89040E MOV DWORD PTR DS:[ESI+ECX], EAX
00979A56 A1 40A19A00 MOV EAX, DWORD PTR DS:[9AA140]
00979A5B 393C06 CMP DWORD PTR DS:[ESI+EAX], EDI
00979A5E 0F84 B0000000 JE 00979B14 //Magic JMP 改 jmp 00979B14
00979A64 33C9 XOR ECX, ECX
然后按F9 中断在993F49
这时看一下 009AE880里的数据 是03CF0000
嗯戊成改成 1F200000吧
改好后壳会自动帮你调整调用到 jmp 03CFxxxx 的地址为 jmp 1F20xxxx的了
好了Alt+M 在第二个段下内存读断点吧(直接F2也行,不用一会取消哦 ~)
然后按F9~
中断在OEP了
LordPE 上场了 先完全Dump吧
再来部分Deump 地址:1F200000 大小:20000 就是上面我改成1F200000的段哦
接着就用ImportREC 来修复IAT了
由于此DLL加载后没有进行重定位,所以保留 Use PE Header From Disk 选项
(注意:Create New IA不能勾)
oep:142ac8 点IAT AutoSearch 自动找到
RVA:001B6000 Size: 00000ABC
CUT掉无效的函数
考虑到文件大小的问题IAT放回原来的附近地址吧
fly大哥说Armadillo没有清掉输入表的函数DLL名,
当找到很多00中的输入表中函数DLL名处就可以放输入表了
WinHEX打开Dumper.dll 搜KERNEL32.dll找到附近好多00的就是了
嗯
放在 0020C0C0 吧,当然大小要算好够用才行
0020CF40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0020CF50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0020CF60 00 00 00 00 00 00 4B 45 52 4E 45 4C 33 32 2E 64 ......KERNEL32.d
0020CF70 6C 6C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ll..............
0020CF80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
取消Add new sectio 的勾
填入新的RVA 0020C0A0 FixDump
修正001B6000段VSize和RSize为0020F000-001B6000=00059000
由于上面输入表的修复覆盖了输出表,所以我们要把输出表重新挪个位置
复制dumper.dll
运行PeMove把复件 Dumped.dll拖进去
Export Table's File Offset填入001B5300,
点击Move后把001B5300处的输出表用WinHEX复制写入到dumped_.dll中,
修正输出表所在区段0019E000段的VSize和RSize为001B6000-0019E000=00018000
再用LordPE修正Export Table RVA
(注意:不知道为什么做完这步后导入表中总有几个DLL的函数是乱了的~
导致这是用od加载总出错,有时说XXXDLL失败~~~~~~
后来重做用ImportREC 来修复IAT了这步,把IAT再写一次才行)
重定位表修复
Armadillo对于DLL比较友好,没有加密重定位表,因此就没有再调试时跟踪此重定位处理了
LordPE察看区段,“.reloc”段RVA即是重定位表RVA,Size看看其结尾的00就知道了
RVA: 276000 Size: 2975b7-276000 = 215B7
脱壳文件的优化
用LordPE删除“.reloc”区段下的所有壳区段,记住第一个壳区段“.text1”段的RVA=002A6000
用WinHex移除0X002A6000至末尾的所有数据,另存为unDumped_.dll。好了,壳数据基本清理完了
用DT_FixRes修复资源。DT_FixRes打开修复前的dumped.dll
NewRva=002A6000,FileAlignment=1000,Dump Resource,获得rsrc.bin
用LordPE把rsrc.bin载入UnPacKed.dll,修正Resource RVA=002A6000
最后LordPE导入Dumped.dmp的数据也就是刚才1F200000的数据了
修正区段的RVA: 1F200000 - 1ED00000 = 500000
LorePE只选验证PE 重建一下文件
(注意一下原来Win2003对导入表所在区段的属性有限制 C0000040即可)
改回原文件名 va_a.dll
运行vs试一下
出来一个提示License Error
脱壳应没问题了
接着来下一步
看导出的函数 ComSetup
1ED91440 > 83EC 24 SUB ESP, 24
1ED91443 E8 98F8FAFF CALL VA_X.1ED40CE0 ; 认证的函数 返回1 表示成功 0 表示失败
1ED91448 85C0 TEST EAX, EAX
1ED9144A 75 04 JNZ SHORT VA_X.1ED91450
1ED9144C 83C4 24 ADD ESP, 24
1ED9144F C3 RETN
1ED91450 F605 08EEF11E 01 TEST BYTE PTR DS:[1EF1EE08], 1
1ED91457 74 0D JE SHORT VA_X.1ED91466
1ED91459 68 2815EC1E PUSH VA_X.1EEC1528 ; ASCII "ComSetup"
进1ED40CE0看看
...
1ED4120C 68 74AFEB1E PUSH VA_X.1EEBAF74 ; ASCII "DAYSINSTALLED"
1ED41211 50 PUSH EAX
1ED41212 E8 99FAFFFF CALL VA_X.1ED40CB0
1ED41217 8B08 MOV ECX, DWORD PTR DS:[EAX]
1ED41219 8B69 F4 MOV EBP, DWORD PTR DS:[ECX-C]
1ED4121C 8B4424 34 MOV EAX, DWORD PTR SS:[ESP+34]
1ED41220 83C4 14 ADD ESP, 14
1ED41223 3BEB CMP EBP, EBX
1ED41225 0F944424 13 SETE BYTE PTR SS:[ESP+13]
1ED4122A 83C0 F0 ADD EAX, -10
1ED4122D 8D50 0C LEA EDX, DWORD PTR DS:[EAX+C]
1ED41230 8BCF MOV ECX, EDI
1ED41232 F0:0FC10A LOCK XADD DWORD PTR DS:[EDX], ECX
1ED41236 49 DEC ECX
1ED41237 85C9 TEST ECX, ECX
1ED41239 7F 08 JG SHORT VA_X.1ED41243
1ED4123B 8B08 MOV ECX, DWORD PTR DS:[EAX]
1ED4123D 8B11 MOV EDX, DWORD PTR DS:[ECX]
1ED4123F 50 PUSH EAX
1ED41240 FF52 04 CALL DWORD PTR DS:[EDX+4]
1ED41243 385C24 13 CMP BYTE PTR SS:[ESP+13], BL ; License是否正确,正确就跳向1ED41060,否则返回0
1ED41247 74 47 JE SHORT VA_X.1ED41290 ; 修改为jmp 1ed41290
1ED41249 A1 C44CF21E MOV EAX, DWORD PTR DS:[1EF24CC4]
1ED4124E 53 PUSH EBX
1ED4124F 68 60AFEB1E PUSH VA_X.1EEBAF60 ; ASCII "License"
1ED41254 68 58AFEB1E PUSH VA_X.1EEBAF58 ; ASCII "Error"
1ED41259 50 PUSH EAX
1ED4125A FF15 2C69EB1E CALL DWORD PTR DS:[<&user32.MessageBoxA>] ; USER32.MessageBoxA
1ED41260 8D46 F0 LEA EAX, DWORD PTR DS:[ESI-10]
1ED41263 897C24 54 MOV DWORD PTR SS:[ESP+54], EDI
1ED41267 8D48 0C LEA ECX, DWORD PTR DS:[EAX+C]
1ED4126A F0:0FC139 LOCK XADD DWORD PTR DS:[ECX], EDI
1ED4126E 4F DEC EDI
1ED4126F 85FF TEST EDI, EDI
1ED41271 7F 08 JG SHORT VA_X.1ED4127B
1ED41273 8B08 MOV ECX, DWORD PTR DS:[EAX]
1ED41275 8B11 MOV EDX, DWORD PTR DS:[ECX]
1ED41277 50 PUSH EAX
1ED41278 FF52 04 CALL DWORD PTR DS:[EDX+4]
1ED4127B 5D POP EBP
1ED4127C 5F POP EDI
1ED4127D 5E POP ESI
1ED4127E 33C0 XOR EAX, EAX
1ED41280 5B POP EBX
1ED41281 8B4C24 3C MOV ECX, DWORD PTR SS:[ESP+3C]
1ED41285 64:890D 00000000 MOV DWORD PTR FS:[0], ECX
1ED4128C 83C4 48 ADD ESP, 48
1ED4128F C3 RETN
1ED41290 8D4424 38 LEA EAX, DWORD PTR SS:[ESP+38] ; License 正确定到这进一步验证
1ED41294 68 50AFEB1E PUSH VA_X.1EEBAF50 ; ASCII "EXPIRED"
1ED41299 50 PUSH EAX
1ED4129A E8 11F3FFFF CALL VA_X.1ED405B0
1ED4129F 8BF0 MOV ESI, EAX
1ED412A1 8D4C24 3C LEA ECX, DWORD PTR SS:[ESP+3C]
1ED412A5 68 74AFEB1E PUSH VA_X.1EEBAF74 ; ASCII "DAYSINSTALLED"
1ED412AA 51 PUSH ECX
1ED412AB C64424 64 0C MOV BYTE PTR SS:[ESP+64], 0C
1ED412B0 E8 FBF2FFFF CALL VA_X.1ED405B0
1ED412B5 8BF8 MOV EDI, EAX
1ED412B7 8D5424 40 LEA EDX, DWORD PTR SS:[ESP+40]
1ED412BB 68 84AFEB1E PUSH VA_X.1EEBAF84 ; ASCII "DAYSLEFT"
1ED412C0 52 PUSH EDX
1ED412C1 C64424 6C 0D MOV BYTE PTR SS:[ESP+6C], 0D
1ED412C6 E8 E5F2FFFF CALL VA_X.1ED405B0
1ED412CB 83C4 18 ADD ESP, 18
1ED412CE 8BE8 MOV EBP, EAX
1ED412D0 C64424 54 0E MOV BYTE PTR SS:[ESP+54], 0E
1ED412D5 E8 F6AB0800 CALL VA_X.1EDCBED0
1ED412DA 8B00 MOV EAX, DWORD PTR DS:[EAX]
1ED412DC 68 48AFEB1E PUSH VA_X.1EEBAF48 ; ASCII "EDL: "
...
1ED41400 52 PUSH EDX
1ED41401 50 PUSH EAX
1ED41402 51 PUSH ECX
1ED41403 E8 68D80900 CALL VA_X.1EDDEC70
1ED41408 83C4 1C ADD ESP, 1C
1ED4140B E8 A0DC0900 CALL VA_X.1EDDF0B0
1ED41410 3BC3 CMP EAX, EBX
1ED41412 0F84 33010000 JE VA_X.1ED4154B ; 看看注册码正确跳到返回真,否则看是否过期了
修改为
1ED41410 8BD8 MOV EBX, EAX
1ED41412 E9 34010000 JMP VA_X.1ED4154B
1ED41417 90 NOP
1ED41418 83F8 02 CMP EAX, 2
1ED4141B 0F94C2 SETE DL
1ED4141E 52 PUSH EDX
1ED4141F 6A 01 PUSH 1
1ED41421 E8 FA040900 CALL VA_X.1EDD1920 ; 弹出Licenes信息窗口
1ED41426 83C4 08 ADD ESP, 8
1ED41429 85C0 TEST EAX, EAX
1ED4142B 75 46 JNZ SHORT VA_X.1ED41473
1ED4142D A1 C44CF21E MOV EAX, DWORD PTR DS:[1EF24CC4]
1ED41432 53 PUSH EBX
1ED41433 68 D072EB1E PUSH VA_X.1EEB72D0 ; ASCII "Visual Assist X"
1ED41438 68 C0AEEB1E PUSH VA_X.1EEBAEC0 ; ASCII "Visual Assist X is loaded but dormant.
Assist X by using the Add or Remove Programs Control Panel Applet."
1ED4143D 50 PUSH EAX
1ED4143E FF15 2C69EB1E CALL DWORD PTR DS:[<&user32.MessageBoxA>] ; USER32.MessageBoxA
1ED41444 8D4C24 18 LEA ECX, DWORD PTR SS:[ESP+18]
1ED41448 C64424 54 09 MOV BYTE PTR SS:[ESP+54], 9
1ED4144D E8 8EAA0800 CALL VA_X.1EDCBEE0
对于同一局域网不能同时用的问题
查找字串
All instances of the license ."%s".are in use. Visual Assist X will be disabled. You must unlo
查 the license 就行了
找到反在下面的返回处下断
或 Ctrl+B查找 74 0E FF 71 44
找到一处这里
1EDE69CF 53 PUSH EBX
1EDE69D0 56 PUSH ESI
1EDE69D1 57 PUSH EDI
1EDE69D2 8965 F0 MOV DWORD PTR SS:[EBP-10], ESP
1EDE69D5 /74 0E JE SHORT VA_X.1EDE69E5 ; 这里好明显了改 jmp 1EDE69E5吧
1EDE69D7 |FF71 44 PUSH DWORD PTR DS:[ECX+44]
1EDE69DA |8365 FC 00 AND DWORD PTR SS:[EBP-4], 0
1EDE69DE |FF71 58 PUSH DWORD PTR DS:[ECX+58]
1EDE69E1 |FFD0 CALL EAX
1EDE69E3 |59 POP ECX
1EDE69E4 |59 POP ECX
1EDE69E5 \8B4D F4 MOV ECX, DWORD PTR SS:[EBP-C]
1EDE69E8 5F POP EDI
1EDE69E9 5E POP ESI
关于注册信息看看RegIt.reg里的内容吧
REGEDIT4
[HKEY_CURRENT_USER\Software\Whole Tomato\Visual Assist X]
"UserKey"="FreeCat"
"UserName"="FreeCat "
[HKEY_CURRENT_USER\Software\Whole Tomato\VAnet]
"UserKey"="FreeCat"
"UserName"="FreeCat "
[HKEY_CURRENT_USER\Software\Whole Tomato\Visual Assist]
"UserKey"="FreeCat"
"UserName"="FreeCat"
好了
测试一下ok收工了
|