首页
社区
课程
招聘
Armadillo脱壳求助
发表于: 2006-8-16 08:26 4574

Armadillo脱壳求助

2006-8-16 08:26
4574
软件名称:易达清单大师4.5
下载地址:http://www.soft365.com.cn/Software.asp?id=48
壳类型:Armadillo

用FI4.01查壳为Armadillo 3.7 {glue}  SRT    .text1

用Armadillo finder protected显示如下:
////////////////////////////////////////
C:\Inbuild\清单大师4.5[国标广东版]0925\QDDS4.ExE
★ 目标为Armadillo保护
★ 特征识别 = 48A038E0
保护系统级别为 (专业版)
◆所用到的保护模式有◆
屏蔽调试器
使用策略代码衔接模式
使用 Nanomites 处理模式
【备份密钥设置】
固定的备份密钥
【程序压缩设置】
较好/较慢地压缩方式
【其它保护设置】
////////////////////////////////////////

破解过程:
1、OD载入,忽略所有异常,用ISDEBUGERPRESENT隐藏OD。
2、运行ArmMutex.osc转换双进程为单进程。
3、下断HE GetModuleHandleA
///////////////////////////////////////
0012EC6C   5D175394  /CALL 到 GetModuleHandleA 来自 5D17538E
0012EC70   5D1753E0  \pModule = "kernel32.dll"

0012ED2C   77F45BB0  /CALL 到 GetModuleHandleA 来自 SHLWAPI.77F45BAA
0012ED30   77F44FF4  \pModule = "KERNEL32.DLL"

0012F540   00D26E03  /CALL 到 GetModuleHandleA 来自 QDDS4.00D26DFD
0012F544   00000000  \pModule = NULL

0012BB18   0169F613  /CALL 到 GetModuleHandleA 来自 0169F60D
0012BB1C   016B0B58  \pModule = "kernel32.dll"
0012BB20   016B1BB4  ASCII "VirtualAlloc"

0012BB18   0169F630  /CALL 到 GetModuleHandleA 来自 0169F62A
0012BB1C   016B0B58  \pModule = "kernel32.dll"
0012BB20   016B1BA8  ASCII "VirtualFree"
/////////////////////////////////////////
出现"不知如何回避位于0160E1AD的命令.请尝试更改EIP或忽略程序异常"
按SHIFT F9跳过,不知这里是不是问题所在?

清除硬件断点,再按ALT F9返回:
/////////////////////
01689705    8B0D C04C6B01   MOV ECX,DWORD PTR DS:[16B4CC0]
0168970B    89040E          MOV DWORD PTR DS:[ESI+ECX],EAX
0168970E    A1 C04C6B01     MOV EAX,DWORD PTR DS:[16B4CC0]
01689713    393C06          CMP DWORD PTR DS:[ESI+EAX],EDI
01689716    75 16           JNZ SHORT 0168972E
01689718    8D85 B4FEFFFF   LEA EAX,DWORD PTR SS:[EBP-14C]
0168971E    50              PUSH EAX
0168971F    FF15 D0B06A01   CALL DWORD PTR DS:[16AB0D0]              ; kernel32.LoadLibraryA
01689725    8B0D C04C6B01   MOV ECX,DWORD PTR DS:[16B4CC0]
0168972B    89040E          MOV DWORD PTR DS:[ESI+ECX],EAX
0168972E    A1 C04C6B01     MOV EAX,DWORD PTR DS:[16B4CC0]
01689733    393C06          CMP DWORD PTR DS:[ESI+EAX],EDI
01689736    0F84 AD000000   JE 016897E9          ;;;这里修改Magic jump为jmp 016897E9
0168973C    33C9            XOR ECX,ECX
0168973E    8B03            MOV EAX,DWORD PTR DS:[EBX]
01689740    3938            CMP DWORD PTR DS:[EAX],EDI
01689742    74 06           JE SHORT 0168974A
01689744    41              INC ECX
01689745    83C0 0C         ADD EAX,0C
01689748  ^ EB F6           JMP SHORT 01689740
0168974A    8BC1            MOV EAX,ECX

//////////////////

修改Magic jump为jmp 016897E9

清除所有断点,ALT+M 调出Memory map,在00401000处右击设置内存访问断点,F9运行,程序异常,然后进程退出,请问是什么原因?
参考论坛内很多帖子,没有COPYMEM II应该是这样没错了.

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 277
活跃值: (312)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
2
脱壳机都有了,还手脱
2006-8-16 08:44
0
雪    币: 168
活跃值: (233)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
3
你修改Magic jump为jmp 016897E9 之后, 在把原来你改过的,改回
je 016897E9

然后对 GetCurrentThreadId 下断点 ,然后 注意观察堆栈,有个堆栈是数值是之前出现过的,你发现了之后,在清楚断点,按Alt+F9,就可以发现入口点了。

看雪精华7里面有的一个教程,非常符合你上面的特征。你认真看看。保证你可以脱调。
2006-8-16 09:55
0
雪    币: 12626
活跃值: (3122)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢,我找找看
2006-8-16 11:23
0
雪    币: 12626
活跃值: (3122)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
找到了,谢谢猪头三,不过在这里碰壁了:

一、破解目标: 联众台球圣手v4.7试用版

二、破解工具:OllyDbg v1.10,ImportREC 1.6 Final,LordPE

三、破解作者:csjwaman

四、破解过程:

1.寻找版本号:


用PEiD扫描,提示为Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks [Overlay]。这其实是误报,实际应为ARM3.60双进程非标准壳。

因为是双进程的,先用以下脚本转换为单进程:

//转单进程脚本
msg "请忽略所有异常,并添加忽略C000001E异常,然后运行本脚本!"
gpa "OpenMutexA","kernel32.dll"
bp $RESULT
esto
exec
pushad
pushfd
push edx
xor eax,eax
push eax
push eax
call kernel32.CreateMutexA
popfd
popad
jmp kernel32.OpenMutexA
ende
bc eip
msg "现已转换成单进程!"
ret


运行脚本后停在:

77E62391 k> 55 push ebp///停在这里。
77E62392 8BEC mov ebp,esp
77E62394 51 push ecx
77E62395 51 push ecx
77E62396 837D 10 00 cmp dword ptr ss:[ebp+10],0
77E6239A 56 push esi
77E6239B 0F84 C2E30100 je 77E80763 ; 77E80763
77E623A1 64:A1 18000000 mov eax,dword ptr fs:[18]
77E623A7 FF75 10 push dword ptr ss:[ebp+10]

SHIFT+F9运行,出现异常:

00D306A7 A1 3857D400 mov eax,dword ptr ds:[D45738]
00D306AC 8B0D 9455D400 mov ecx,dword ptr ds:[D45594] ; Ball4.004EC260
00D306B2 8B04B0 mov eax,dword ptr ds:[eax+esi*4]///停在这里。
00D306B5 3341 54 xor eax,dword ptr ds:[ecx+54]
00D306B8 8B0D 9455D400 mov ecx,dword ptr ds:[D45594] ; Ball4.004EC260
00D306BE 3341 04 xor eax,dword ptr ds:[ecx+4]
00D306C1 8B0D 9455D400 mov ecx,dword ptr ds:[D45594] ; Ball4.004EC260
00D306C7 3341 74 xor eax,dword ptr ds:[ecx+74]
00D306CA 8B0D 9455D400 mov ecx,dword ptr ds:[D45594] ; Ball4.004EC260
00D306D0 3341 30 xor eax,dword ptr ds:[ecx+30]
00D306D3 8B0D 9455D400 mov ecx,dword ptr ds:[D45594] ; Ball4.004EC260
00D306D9 3341 20 xor eax,dword ptr ds:[ecx+20]

出现上述,说明这是非标准加壳方式。现在搜索所有参考文本串,然后查找字符“armVersion”,找到后在上一行就可以看到字符“3.60”。这就是版本号了。



2.寻找OEP和DUMP进程

重新加载程序,下断BP WaitForDebugEvent,断下后堆栈如下:

0012DAC0 004C1D67 /CALL 到 WaitForDebugEvent 来自 Ball4.004C1D61
0012DAC4 0012EB84 |pDebugEvent = 0012EB84///进数据窗口。
0012DAC8 000003E8 \Timeout = 1000. ms

取消断点,然后bp WriteProcessMemory 再F9,内存窗口数据如下:

0012EB84 01 00 00 00 E4 0A 00 00 ...?..
0012EB8C E8 0A 00 00 01 00 00 80 ?....?
0012EB94 00 00 00 00 00 00 00 00 ........
0012EB9C 38 77 49 00 02 00 00 00 8wI....
0012EBA4 00 00 00 00 38 77 49 00 ....8wI.
0012EBAC 38 77 49 00 00 00 00 00 8wI.....
0012EBB4 01 C7 4F E1 00 00 00 00 窍?...

其中497738就是OEP地址了。

ALT+F9返回:

004C5C6E . 85C0 test eax,eax///返回这里。
004C5C70 . 75 4B jnz short 004C5CBD ; 004C5CBD
004C5C72 . 50 push eax
004C5C73 . F7D0 not eax
004C5C75 . 0FC8 bswap eax
004C5C77 . 58 pop eax

这里搜索所有命令“or eax,FFFFFFF8”,结果:

004C23D6 or eax,FFFFFFF8///双击这行。
004C2933 or eax,FFFFFFF8
004C5C6E test eax,eax

双击后来到:

004C238A > \83BD D0F5FFFF 00 cmp dword ptr ss:[ebp-A30],0/////下断,Shift+F9中断下来 把[ebp-A30]=[0012EB70]=00000005清0
004C2391 . 0F8C A9020000 jl 004C2640 ; 004C2640
004C2397 . 8B8D D0F5FFFF mov ecx,dword ptr ss:[ebp-A30]
004C239D . 3B0D E4254F00 cmp ecx,dword ptr ds:[4F25E4]///注意[4F25E4]
004C23A3 . 0F8D 97020000 jge 004C2640//解码结束后跳转004C2640,到004C2640处下断
004C23A9 . 8B95 44F6FFFF mov edx,dword ptr ss:[ebp-9BC]
004C23AF . 81E2 FF000000 and edx,0FF
004C23B5 . 85D2 test edx,edx
004C23B7 . 0F84 AD000000 je 004C246A ; 004C246A
004C23BD . 6A 00 push 0
004C23BF . 8BB5 D0F5FFFF mov esi,dword ptr ss:[ebp-A30]
004C23C5 . C1E6 04 shl esi,4
004C23C8 . 8B85 D0F5FFFF mov eax,dword ptr ss:[ebp-A30]
004C23CE . 25 07000080 and eax,80000007
004C23D3 . 79 05 jns short 004C23DA ; 004C23DA
004C23D5 . 48 dec eax
004C23D6 . 83C8 F8 or eax,FFFFFFF8///来到这里。
004C23D9 . 40 inc eax
004C23DA > 33C9 xor ecx,ecx
004C23DC . 8A88 800A4F00 mov cl,byte ptr ds:[eax+4F0A80]
004C23E2 . 8B95 D0F5FFFF mov edx,dword ptr ss:[ebp-A30]
004C23E8 . 81E2 07000080 and edx,80000007
004C23EE . 79 05 jns short 004C23F5 ; 004C23F5
004C23F0 . 4A dec edx
004C23F1 . 83CA F8 or edx,FFFFFFF8
004C23F4 . 42 inc edx
004C23F5 > 33C0 xor eax,eax
004C23F7 . 8A82 810A4F00 mov al,byte ptr ds:[edx+4F0A81]
004C23FD . 8B3C8D 60C24E00 mov edi,dword ptr ds:[ecx*4+4EC260]
004C2404 . 333C85 60C24E00 xor edi,dword ptr ds:[eax*4+4EC260]
004C240B . 8B8D D0F5FFFF mov ecx,dword ptr ss:[ebp-A30]
004C2411 . 81E1 07000080 and ecx,80000007
004C2417 . 79 05 jns short 004C241E ; 004C241E
004C2419 . 49 dec ecx
004C241A . 83C9 F8 or ecx,FFFFFFF8
004C241D . 41 inc ecx
004C241E > 33D2 xor edx,edx
004C2420 . 8A91 820A4F00 mov dl,byte ptr ds:[ecx+4F0A82]
004C2426 . 333C95 60C24E00 xor edi,dword ptr ds:[edx*4+4EC260]
004C242D . 8B85 D0F5FFFF mov eax,dword ptr ss:[ebp-A30]
004C2433 . 99 cdq
004C2434 . B9 1C000000 mov ecx,1C
004C2439 . F7F9 idiv ecx
004C243B . 8BCA mov ecx,edx
004C243D . D3EF shr edi,cl
004C243F . 83E7 0F and edi,0F
004C2442 . 03F7 add esi,edi
004C2444 . 8B15 D4254F00 mov edx,dword ptr ds:[4F25D4]
004C244A . 8D04B2 lea eax,dword ptr ds:[edx+esi*4]
004C244D . 50 push eax
004C244E . 8B8D D0F5FFFF mov ecx,dword ptr ss:[ebp-A30]
004C2454 . 51 push ecx
004C2455 . E8 FF1F0000 call 004C4459 ; 004C4459
004C245A . 83C4 0C add esp,0C
004C245D . 25 FF000000 and eax,0FF///这里开始Patch
004C2462 . 85C0 test eax,eax
004C2464 . 0F84 D6010000 je 004C2640 ; 004C2640
004C246A > 837D D8 00 cmp dword ptr ss:[ebp-28],0
004C246E . 75 28 jnz short 004C2498 ; 004C2498
004C2470 . 8B15 B8C24E00 mov edx,dword ptr ds:[4EC2B8]
004C2476 . 3315 CCC24E00 xor edx,dword ptr ds:[4EC2CC]
004C247C . 3315 D0C24E00 xor edx,dword ptr ds:[4EC2D0]
004C2482 . 81E2 00002000 and edx,200000
004C2488 . 85D2 test edx,edx

Patch代码:

004C245D FF85 D0F5FFFF inc dword ptr ss:[ebp-A30]
004C2463 C705 E8254F00 0100>mov dword ptr ds:[4F25E8],1
为什么是4F25E8,而不是其它,这个地址是空闲的
004C246D ^ E9 18FFFFFF jmp 004C238A ; 004C238A
004C2472 90 nop
004C2473 90 nop

用以上代码欺骗主进程解码。


SHIFT+F9,程序断在:

004C2640 > \E9 E00F0000 jmp 004C3625///断在这里。
004C2645 > 8B0D A0C24E00 mov ecx,dword ptr ds:[4EC2A0]
004C264B . 81F1 050000C0 xor ecx,C0000005
004C2651 . 398D D8F5FFFF cmp dword ptr ss:[ebp-A28],ecx

此时子进程代码全部解开,运行LordPE,完全Dump出子进程。

但是我用LORDPE无法dump出来,说是"Couldn't grap process Memory",什么原因?
2006-8-16 14:25
0
雪    币: 12626
活跃值: (3122)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
终于可以dump了,原来那个mov dword ptr ds:[4F25E8],1要改为
mov dword ptr ds:[0D587C0],1

但是修复完IAT之后,发现还是运行不了,出现内存访问错误,原教程没有说这种情况.

我翻阅其他教程,发现必须用ARMInLine修复Code splicing,但无论如何也附加不了子进程,能用lordpe来dump,就是OD里说附加不了,是什么原因?
2006-8-16 22:02
0
雪    币: 168
活跃值: (233)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
7
最初由 rongge 发布
终于可以dump了,原来那个mov dword ptr ds:[4F25E8],1要改为
mov dword ptr ds:[0D587C0],1

但是修复完IAT之后,发现还是运行不了,出现内存访问错误,原教程没有说这种情况.

........


你的保护模式是:
使用 Nanomites 处理模式
还是双进程,又是 专业版的

跟我现在脱的的ARM一样,保护模式是完全一样的。

需要修复CC,我现在也正弄修复CC,很麻烦!
2006-8-16 22:25
0
雪    币: 12626
活跃值: (3122)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我想问下猪头三大哥,如果切换主进程为子进程,是不是不能正确解码.
能否达到OEP,如果不能切换成单进程,而子进程又被父进程调试,那不是没戏了?
2006-8-17 14:47
0
雪    币: 168
活跃值: (233)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
9
最初由 rongge 发布
我想问下猪头三大哥,如果切换主进程为子进程,是不是不能正确解码.
能否达到OEP,如果不能切换成单进程,而子进程又被父进程调试,那不是没戏了?


其实不管怎么样都是可以正确解码,就看我们的跟踪处理技巧了.

我现在脱的ARM跟你保护一摸一样,我发现了不少问题. 没有论坛里面那些ARM脱文说得那么简单.论坛里面的多是没有Nanomites保护处理. 你也不走运,呵呵,选了这个带有Nanomites保护处理的专业版.

慢慢来.我现在也正慢慢来.

我现在的问题是进入OEP之后,先不dump,而是直接F9运行,发现有异常,我就怀疑解码是否正确. 我等下发贴问别人.

还有你的那个程序,必须使用ARMInLine修复Code splicing.进入OEP之后,就运行ARMInLine 修复,在dump
2006-8-17 15:35
0
雪    币: 12626
活跃值: (3122)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
问题是要把双进程切换成单进程还是按台球圣手脱文的办法,Patch代码后断在jmp 004C3625,然后dump,那我应该什么时候修复code splicing,又如何知道code splicing申请的代码区间地址?
///////////////////////////////////////
Patch代码:

004C245D       FF85 D0F5FFFF      inc dword ptr ss:[ebp-A30]
004C2463       C705 E8254F00 0100>mov dword ptr ds:[4F25E8],1
004C246D     ^ E9 18FFFFFF        jmp 004C238A                               ;  004C238A
004C2472       90                 nop
004C2473       90                 nop

用以上代码欺骗主进程解码。

SHIFT+F9,程序断在:

004C2640    > \E9 E00F0000        jmp 004C3625///断在这里。
004C2645    >  8B0D A0C24E00      mov ecx,dword ptr ds:[4EC2A0]
004C264B    .  81F1 050000C0      xor ecx,C0000005
2006-8-18 08:57
0
游客
登录 | 注册 方可回帖
返回
//