首页
社区
课程
招聘
[求助]穿山甲极度加密脱壳的分析
发表于: 2006-4-24 13:44 10045

[求助]穿山甲极度加密脱壳的分析

2006-4-24 13:44
10045
1.peid查壳

Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks(可能查看的不准)

2.FI查壳

Armadillo 4.00 {glue}  SRT    .text1

3. 使用ArmadilloFindProtected查看穿山甲加密属性:(以下属性可能查看的不准)

!- Protected Armadillo(穿山甲保护)

<Protection Options>(穿山甲属性)
Debug-Blocker(屏蔽调试器双进程)
CopyMem-II(保护方式,不确定是否正确)
Enable Memory-Patching Protections

<Backup Key Options>
Fixed Backup Keys(固定备份钥匙)

<Compression Options>
Best/Slowest Compression(最好,最慢压缩方式)

启动程序,出现提示框:
This program requires a security key. If you have one, select OK to enter it. After entering

a valid key, you will not be prompted again.(此程序需要一个KEY,如果你有一个KEY,选择OK输入

输入一个正确的KEY后,你将不需要从新输入)
点OK出现提示框:
Hardware fingerprint: 23B4-20AB(我的机器码)
Name:
Key:

此程序没有试用限制,直接KEY保护
注意:(发现需要KEY以后如果没有别人机器上的一个有效KEY,就放弃了,我这里有一个KEY)

然后在 Windows 任务管理器或LordPE里查看是双进程的。

4.老规矩设置Ollydbg忽略所有异常,用IsDebug 1.4插件去掉Ollydbg的调试器标志

OD 载入,发现Windows 任务管理器或LordPE里查看是单进程,这是屏蔽了调试器双进程。

Armadillo4.X版本判断:
下断点 HE OutputDebugStringA
Shift+F9运行,中断下来。看堆栈:

0012BCC0   004D2A68  /CALL 到 OutputDebugStringA 来自 加密.004D2A65
0012BCC4   003A0A08  \String = "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%

s%s%s%s%s%s%s%s%s%s%s%s%s%s%s"

出现这个说明这个壳我们还是以 FI  查出的结果为准
清除断点,从新载入。

004E0D93 >/$  55            PUSH EBP(载入停在这里)
004E0D94  |.  8BEC          MOV EBP,ESP
004E0D96  |.  6A FF         PUSH -1

1 分离父子进程

下断点BP OpenMutexA

F9运行中断后,看堆栈:
0012D7AC   004CC9B8  /CALL 到 OpenMutexA 来自 动画.004CC9B2
0012D7B0   001F0001  |Access = 1F0001
0012D7B4   00000000  |Inheritable = FALSE
0012D7B8   0012DDEC  \MutexName = "74C::DA60960C50"

注意这个地址:0012DDEC

在CPU窗口中 Ctrl+G:401000  键入以下代码:

00401000    60              PUSHAD
00401001    9C              PUSHFD
00401002    68 ECDD1200     PUSH 12DDEC                              ; ASCII

"74C::DA60960C50"
00401007    33C0            XOR EAX,EAX
00401009    50              PUSH EAX
0040100A    50              PUSH EAX
0040100B    E8 D9BCA177     CALL kernel32.CreateMutexA
00401010    9D              POPFD
00401011    61              POPAD
00401012  - E9 548EA177     JMP kernel32.OpenMutexA

二进制:60 9C 68 EC DD 12 00 33 C0 50 50 E8 D9 BC A1 77 9D 61 E9 54 8E A1 77

在 401000 处点鼠标右键 "此处为新 EIP",F9运行,再次中断在OpenMutexA处,此时Ctrl+G:401000 撤

销刚才的修改的代码,使代码还原。OK,父进程分离完毕!清除 OpenMutexA 断点.

2.运行程序,出现提示框:
This program requires a security key. If you have one, select OK to enter it. After entering

a valid key, you will not be prompted again

我们返回OD,下断点:HE GetDlgItem 接着在提示框点OK中断在OD
然后删除断点alt+f9返回:
返回后单步向走
02892D1F    50              PUSH EAX(返回点)
02892D20    68 15040000     PUSH 415
02892D25    57              PUSH EDI
02892D26    FFD6            CALL ESI
02892D28    50              PUSH EAX
02892D29    68 07040000     PUSH 407
02892D2E    57              PUSH EDI
02892D2F    FFD6            CALL ESI
02892D31    50              PUSH EAX
02892D32    E8 C37AFFFF     CALL 0288A7FA
02892D37    8B0D 14ED8A02   MOV ECX,DWORD PTR DS:[28AED14]
02892D3D    83C4 0C         ADD ESP,0C
02892D40    E8 FD53FEFF     CALL 02878142
02892D45    33DB            XOR EBX,EBX
02892D47    84C0            TEST AL,AL
02892D49    75 36           JNZ SHORT 02892D81
02892D4B    381D 78908A02   CMP BYTE PTR DS:[28A9078],BL
02892D51    74 2E           JE SHORT 02892D81
02892D53    8B0D 14ED8A02   MOV ECX,DWORD PTR DS:[28AED14]
02892D59    894D 08         MOV DWORD PTR SS:[EBP+8],ECX
02892D5C    E8 E153FEFF     CALL 02878142
02892D61    84C0            TEST AL,AL
02892D63    74 07           JE SHORT 02892D6C
02892D65    A1 44608A02     MOV EAX,DWORD PTR DS:[28A6044]
02892D6A    EB 06           JMP SHORT 02892D72
02892D6C    8B45 08         MOV EAX,DWORD PTR SS:[EBP+8]
02892D6F    83C0 08         ADD EAX,8
02892D72    50              PUSH EAX
02892D73    68 07040000     PUSH 407
02892D78    57              PUSH EDI
02892D79    FFD6            CALL ESI
02892D7B    50              PUSH EAX
02892D7C    E8 04E80000     CALL 028A1585
02892D81    395D 14         CMP DWORD PTR SS:[EBP+14],EBX
02892D84    0F84 B7000000   JE 02892E41
02892D8A    53              PUSH EBX
02892D8B    B9 D8C88A02     MOV ECX,28AC8D8
02892D90    E8 8E51FEFF     CALL 02877F23     (F7进入)
02892D95    53              PUSH EBX
02892D96    B9 D8C88A02     MOV ECX,28AC8D8
02892D9B    8945 08         MOV DWORD PTR SS:[EBP+8],EAX
02892D9E    E8 9751FEFF     CALL 02877F3A
02892DA3    837D 14 01      CMP DWORD PTR SS:[EBP+14],1
02892DA7    75 27           JNZ SHORT 02892DD0
02892DA9    8B45 08         MOV EAX,DWORD PTR SS:[EBP+8]
02892DAC    8BC8            MOV ECX,EAX
02892DAE    81E1 FFFF0000   AND ECX,0FFFF
02892DB4    C1E8 10         SHR EAX,10
02892DB7    51              PUSH ECX
02892DB8    50              PUSH EAX
02892DB9    8D85 00FFFFFF   LEA EAX,DWORD PTR SS:[EBP-100]
02892DBF    68 B8668A02     PUSH 28A66B8                             ; ASCII "%04X-%04X"

02892D90    E8 8E51FEFF     CALL 02877F23  (F7进入)以后代码:

02877F23    8B81 58060000   MOV EAX,DWORD PTR DS:[ECX+658]
02877F29    8B5424 04       MOV EDX,DWORD PTR SS:[ESP+4]
02877F2D    8B4490 18       MOV EAX,DWORD PTR DS:[EAX+EDX*4+18]
02877F31    3381 58200000   XOR EAX,DWORD PTR DS:[ECX+2058](F8到这里,寄存器EAX显示我的机器

码23B420AB)
02877F37    C2 0400         RETN 4

拷贝这两句代码:
02877F31    3381 58200000   XOR EAX,DWORD PTR DS:[ECX+2058]
02877F37    C2 0400         RETN 4

然后开始打补丁:
在02877F31此代码位置输入:
jmp 00401000
然后进入00401000处,开始写补丁文件,进行机器码欺骗:
00401000    3381 58200000   XOR EAX,DWORD PTR DS:[ECX+2058]
00401006    3D AB20B423     CMP EAX,23B420AB(我的机器码)
0040100B    75 04           JNZ SHORT 动画.00401011
0040100D    B8 682664DC     MOV EAX,DC642668(别人的机器码)
00401012    C2 0400         RETN 4

二进制:33 81 58 20 00 00 3D AB 20 B4 23 75 04 B8 68 26 64 DC C2 04 00

然后我直接运行出现输入注册码提示框,输入别人的NAME和KEY以后,提示:
key is valid,and has been stored

然后我关闭OD,打开程序提示:
The security key for this program currently stored on your system does not appear to be

valid for this version of the program select yes to enter a new key,or no to revert to the
default setting(if any).

接着我从新做到这一步采用欺骗成功以后直接脱壳下了断点he GetModuleHandleA+5这个断点

接着运行程序,出现输入注册码提示框,输入别人的NAME和KEY以后,点OK返回OD,一直F9直到提示:
key is valid,and has been stored
点OK

这个时候我运行程序发现程序提示:
The security key for this program currently stored on your system does not appear to be

valid for this version of the program select yes to enter a new key,or no to revert to the
default setting(if any).

还是一样的,然后我返回OD,推载显示:
001277F8   02834F9E  返回到 02834F9E 来自 kernel32.GetModuleHandleA
001277FC   00127948  ASCII "kernel32.dll"
删除断点返回

ALT+F9返回,出现红色代码
02834F9E    8B0D AC0D8602   MOV ECX,DWORD PTR DS:[2860DAC]
02834FA4    89040E          MOV DWORD PTR DS:[ESI+ECX],EAX
02834FA7    A1 AC0D8602     MOV EAX,DWORD PTR DS:[2860DAC]
02834FAC    391C06          CMP DWORD PTR DS:[ESI+EAX],EBX
02834FAF    75 16           JNZ SHORT 02834FC7
02834FB1    8D85 B4FEFFFF   LEA EAX,DWORD PTR SS:[EBP-14C]
02834FB7    50              PUSH EAX
02834FB8    FF15 B4328502   CALL DWORD PTR DS:[28532B4]              ; kernel32.LoadLibraryA
02834FBE    8B0D AC0D8602   MOV ECX,DWORD PTR DS:[2860DAC]
02834FC4    89040E          MOV DWORD PTR DS:[ESI+ECX],EAX
02834FC7    A1 AC0D8602     MOV EAX,DWORD PTR DS:[2860DAC]
02834FCC    391C06          CMP DWORD PTR DS:[ESI+EAX],EBX
02834FCF    0F84 2F010000   JE 02835104       (magic JMP)
02834FD5    33C9            XOR ECX,ECX
02834FD7    8B07            MOV EAX,DWORD PTR DS:[EDI]
02834FD9    3918            CMP DWORD PTR DS:[EAX],EBX
02834FDB    74 06           JE SHORT 02834FE3
02834FDD    41              INC ECX
02834FDE    83C0 0C         ADD EAX,0C
02834FE1  ^ EB F6           JMP SHORT 02834FD9
02834FE3    8BD9            MOV EBX,ECX
02834FE5    C1E3 02         SHL EBX,2
02834FE8    53              PUSH EBX
02834FE9    E8 A4DA0100     CALL 02852A92                            ; JMP 到 msvcrt.??

2@YAPAXI@Z
02834FEE    8B0D A40D8602   MOV ECX,DWORD PTR DS:[2860DA4]
02834FF4    89040E          MOV DWORD PTR DS:[ESI+ECX],EAX
02834FF7    53              PUSH EBX
02834FF8    E8 95DA0100     CALL 02852A92                            ; JMP 到 msvcrt.??

2@YAPAXI@Z
02834FFD    59              POP ECX
02834FFE    59              POP ECX
02834FFF    8B0D A80D8602   MOV ECX,DWORD PTR DS:[2860DA8]
02835005    89040E          MOV DWORD PTR DS:[ESI+ECX],EAX

02834FCF    0F84 2F010000   JE 02835104  (magic JMP)
我们找到了(magic JMP)

第一种方法:

JE改成JMP
然后继续下断点 bp GetCurrentThreadId

按F9运行中断后,看堆栈:
00127138   73441E36  /CALL 到 GetCurrentThreadId 来自 73441E30

00127118   7344353F  /CALL 到 GetCurrentThreadId 来自 73443539

第三次以后死在这里:
02847FEE    0BB2 FAEAFAEB   OR ESI,DWORD PTR DS:[EDX+EBFAEAFA]
02847FF4    0E              PUSH CS
02847FF5  ^ 7C 8B           JL SHORT 02847F82
02847FF7    B7 89           MOV BH,89
02847FF9    1D 8C9DF342     SBB EAX,42F39D8C
02847FFE    FC              CLD
02847FFF    45              INC EBP
02848000    5F              POP EDI
02848001    66:83EE B3      SUB SI,0FFB3
02848005    196490 74       SBB DWORD PTR DS:[EAX+EDX*4+74],ESP
02848009    A7              CMPSD
0284800A    BD 18CF9F78     MOV EBP,789FCF18
0284800F  ^ 72 CD           JB SHORT 02847FDE
02848011    65:B9 900D6DB6  MOV ECX,B66D0D90                         ; 多余的前缀
02848017    2F              DAS

第二种方法:
为了避免后面有检效JE改成jmp跟随进去:

02835104    83C7 0C         ADD EDI,0C
02835107    89BD 78FDFFFF   MOV DWORD PTR SS:[EBP-288],EDI
0283510D    83C6 04         ADD ESI,4
02835110    395F FC         CMP DWORD PTR DS:[EDI-4],EBX
02835113  ^ 0F85 49FEFFFF   JNZ 02834F62
02835119    EB 03           JMP SHORT 0283511E

02835119    EB 03           JMP SHORT 0283511E 下断点,SHIFT+F9运行,取消断点,

把代码02834FCF处的 JMP改回JE

ALT+M打开内存静像在00401000下内存访问断点,运行后死在:

02847FEE    0BB2 FAEAFAEB   OR ESI,DWORD PTR DS:[EDX+EBFAEAFA]
02847FF4    0E              PUSH CS
02847FF5  ^ 7C 8B           JL SHORT 02847F82
02847FF7    B7 89           MOV BH,89
02847FF9    1D 8C9DF342     SBB EAX,42F39D8C
02847FFE    FC              CLD
02847FFF    45              INC EBP
02848000    5F              POP EDI
02848001    66:83EE B3      SUB SI,0FFB3
02848005    196490 74       SBB DWORD PTR DS:[EAX+EDX*4+74],ESP
02848009    A7              CMPSD
0284800A    BD 18CF9F78     MOV EBP,789FCF18
0284800F  ^ 72 CD           JB SHORT 02847FDE
02848011    65:B9 900D6DB6  MOV ECX,B66D0D90                         ; 多余的前缀
02848017    2F              DAS

希望大家帮忙分析一下是什么原因,是不是因为CopyMem-II保护方式的原因,如果是CopyMem-II保护模式

而且是带固定KEY保护的,那么如何搞定啊,我看过FLY大哥脱魔法转换的文章,可是那个软件有试用限制

的,而我这个没有试用限制了,如果是先搞定KEY,程序是无法运行的,而且此加密屏蔽了调试器双进程

更加无法去解密子进程了,不知道如何是好了,希望解密朋友帮忙分析下,回个帖子
先谢谢大家了

小弟在这里先谢谢大家看此贴了,如果有帮助我的可以去:
www.188.com
用户名字:unpack
密码:unpack
在邮件相里有此加密动画,可以下载

或是有热心朋友帮助可以联系我:
QQ:78414633
EMAIL:2982055@163.com

非常感谢此论坛的工作人员让我发帖以便得到大家的帮助

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (18)
雪    币: 279
活跃值: (145)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
2
你的KEY还没注册成功,怎么脱壳呀!
2006-4-24 13:59
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
2楼的大哥麻烦你看清楚在回复了

我的文章里面有这句话,而且我记录的够详细了:
看这句话:
key is valid,and has been stored
这句话的中文意思就是:
KEY注册成功并保存
2006-4-24 14:11
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
有朋友说是证书的问题,所以出错,但是我不太了解穿山甲的证书,小弟刚开始学习穿山甲的脱壳,请知道的朋友帮忙回个帖子了,小弟先谢了。
2006-4-24 18:10
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
KEY成功以后程序运行提示错误,有朋友告诉我是证书问题,有朋友告诉我怎么解决证书吗?先谢谢大家了
2006-4-26 12:04
0
雪    币: 217
活跃值: (61)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
你看看在文件夹里面还有没有其他的dll也是加了穿山甲的壳?
2006-4-26 13:49
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
回复楼上的朋友,这个是屏幕录象专家录制的动画,没有附带DLL插件,以及OCX控件等,看雪上已经有人破解了,可是要50元才共享技术啊,他说是证书的原因,了解证书的朋友帮忙分析下了,小鸟在这里先谢谢了。
2006-4-26 16:00
0
雪    币: 236
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
关注中……这个欺骗方法表面看起来不错,但是我觉得ARM的加密不仅仅依靠一个硬件ID吧?
2006-4-26 17:38
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
有个朋友告诉我是证书过期了,说让我去了解一下ARM壳的SDK,
可是我不知道SDK是什么啊,大家有什么解决的方法吗?或是SDK的资料让我看看,我在论坛找资料没找到啊,可能是论坛资料太多了。
2006-4-27 16:21
0
雪    币: 200
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我也遇到同样的问题,关注。
2006-5-1 00:32
0
雪    币: 108
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
如果已经成功欺骗并能运行软件

那么就应该找copymem II的脱壳方法脱壳

我看你的文章欺骗机器码以后 你依然用了标准壳的方法
2006-5-1 01:35
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
回复楼上的朋友:
我欺骗以后提示:

key is valid,and has been stored

这个时候我打开程序提示:
The security key for this program currently stored on your system does not appear to be

valid for this version of the program select yes to enter a new key,or no to revert to the
default setting(if any).

证书过期了,程序根本无法运行啊,程序加了SDK。
正在学习中
2006-5-1 17:05
0
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
13
最初由 扮酷男孩 发布
2楼的大哥麻烦你看清楚在回复了

我的文章里面有这句话,而且我记录的够详细了:
看这句话:
key is valid,and has been stored
........

看你态度?
提示了key is valid,and has been stored
就代表注册成功?

你都说了是证书。。。

2006-5-1 18:12
0
雪    币: 241
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
请问ArmaFindprotected哪里有得下载啊?
我在论坛里搜索过没有啊
2006-5-2 17:04
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
有没有人整理下ARM证书过期如何解决,和SDK如何处理啊,先谢谢了
2006-5-7 14:00
0
雪    币: 277
活跃值: (312)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
16
不是证书过期,是系统中的注册码不匹配。需要重新注册。
2006-5-7 14:56
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
楼上的朋友,这个问题如何解决啊,注册码在系统中不匹配是什么意思呢?
2006-5-9 09:46
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
看了楼上的朋友的回复,想到了ARM证书采用的加密方式不同,打补丁的地方也就不同,知道自己可能是打补丁的地方不正确,所以提示过期了,现在我去自己是加密类型,看看都是在哪里打补丁了,谢谢楼上的朋友wangshq397回复.
2006-5-9 15:30
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
是啊!到底怎么解决啊.我也遇到同样的问题.
2006-8-31 11:43
0
游客
登录 | 注册 方可回帖
返回
//