首页
社区
课程
招聘
[求助]关于armadillo三次断点法脱壳的问题
发表于: 2006-5-24 07:53 5271

[求助]关于armadillo三次断点法脱壳的问题

2006-5-24 07:53
5271
(zwl313编辑:1楼的问题已经解决,我要脱的软件是3.75c非标准壳,请各位高手直接看9楼的问题吧,急盼中,谢谢!!)

各位大虾,小弟是个菜鸟,刚刚接触脱壳,就碰到arm,请各位赐教,不胜感激。

因为我的网速太慢,没有搜索相关文章就直接问了,大虾见谅:)

用FI查是arm3.75c版,用PEDIY查是arm3.78版。

我参考了精华7里夜凉如水的一篇文章“ Armadillo 3.78->Silicon Re”,原文链接 http://bbs.pediy.com/showthread.php?threadid=14954

感觉我脱的程序应该是双进程标准壳,所以采用文章中的3次断点法。

我用的是OD1.10中文版,XP SP2系统

过程如下:

OD加载程序
00DAA000 > $  60            PUSHAD
00DAA001   .  E8 00000000   CALL tzfx.00DAA006
00DAA006   $  5D            POP EBP
00DAA007   .  50            PUSH EAX
00DAA008   .  51            PUSH ECX
00DAA009   .  0FCA          BSWAP EDX
00DAA00B   .  F7D2          NOT EDX
00DAA00D   .  9C            PUSHFD
00DAA00E   .  F7D2          NOT EDX
00DAA010   .  0FCA          BSWAP EDX
00DAA012   .  EB 0F         JMP SHORT tzfx.00DAA023

1、下OpenMutexA断,并在401000处写欺骗代码转换为单进程成功。
2、下GetModuleHandleA断,几次F9,找到magic jump,也成功。

014299AC    8B0D 20914501   MOV ECX,DWORD PTR DS:[1459120]
014299B2    89040E          MOV DWORD PTR DS:[ESI+ECX],EAX
014299B5    A1 20914501     MOV EAX,DWORD PTR DS:[1459120]
014299BA    393C06          CMP DWORD PTR DS:[ESI+EAX],EDI
014299BD    75 16           JNZ SHORT 014299D5
014299BF    8D85 B4FEFFFF   LEA EAX,DWORD PTR SS:[EBP-14C]
014299C5    50              PUSH EAX
014299C6    FF15 D4E04401   CALL DWORD PTR DS:[144E0D4]    ; kernel32.LoadLibraryA
014299CC    8B0D 20914501   MOV ECX,DWORD PTR DS:[1459120]
014299D2    89040E          MOV DWORD PTR DS:[ESI+ECX],EAX
014299D5    A1 20914501     MOV EAX,DWORD PTR DS:[1459120]
014299DA    393C06          CMP DWORD PTR DS:[ESI+EAX],EDI
014299DD    0F84 AD000000   JE 01429A90       ;将此改为jmp
014299E3    33C9            XOR ECX,ECX
014299E5    8B03            MOV EAX,DWORD PTR DS:[EBX]
014299E7    3938            CMP DWORD PTR DS:[EAX],EDI

3、下GetCurrentThreadId断,
第一次F9,堆栈内容
00128310   73391E26  /CALL 到 GetCurrentThreadId 来自 73391E20
00128314   00000001
00128318   73391C0A  返回到 73391C0A 来自 73391DD2
0012831C   73391B50  返回到 73391B50 来自 73391B7C
第二次F9,
001282F0   73393526  /CALL 到 GetCurrentThreadId 来自 73393520
也没什么不对,但第三次F9,问题出现了,程序发生了无法处理的异常并终止,并没有像预期的到达返回时机找到OEP。
参考精华7里henryouly的一篇文章“Armadillo标准壳完全扫盲”
原文链接  http://bbs.pediy.com/showthread.php?threadid=15803
里面说将magic jump改为jmp,跳转后如果不改回来可能解码时会发生异常,于是我将它改回来,可是问题依然,

014446F2    83E3 0F         AND EBX,0F
014446F5    03F3            ADD ESI,EBX
014446F7    A1 34D74501     MOV EAX,DWORD PTR DS:[145D734]     ;145d734处为全零
014446FC    8B0D 90D54501   MOV ECX,DWORD PTR DS:[145D590]     ; tzfx.00DBA310
01444702    8B04B0          MOV EAX,DWORD PTR DS:[EAX+ESI*4]  //在此处发生异常
01444705    3341 2C         XOR EAX,DWORD PTR DS:[ECX+2C]
01444708    8B0D 90D54501   MOV ECX,DWORD PTR DS:[145D590]     ; tzfx.00DBA310
0144470E    3341 7C         XOR EAX,DWORD PTR DS:[ECX+7C]
01444711    8B0D 90D54501   MOV ECX,DWORD PTR DS:[145D590]     ; tzfx.00DBA310
01444717    3341 74         XOR EAX,DWORD PTR DS:[ECX+74]
0144471A    8B0D 90D54501   MOV ECX,DWORD PTR DS:[145D590]     ; tzfx.00DBA310
01444720    3341 58         XOR EAX,DWORD PTR DS:[ECX+58]
01444723    8B0D 90D54501   MOV ECX,DWORD PTR DS:[145D590]     ; tzfx.00DBA310
01444729    3341 64         XOR EAX,DWORD PTR DS:[ECX+64]
0144472C    3385 9CD5FFFF   XOR EAX,DWORD PTR SS:[EBP-2A64]
01444732    50              PUSH EAX
01444733    FFB5 D4D5FFFF   PUSH DWORD PTR SS:[EBP-2A2C]
01444739    E8 6B2D0000     CALL 014474A9

异常处 DS:[00000030]=???
       EAX=00000000
此时EAX=00000000  ESI=0000000c  EBP=0012cf48  ESP=00128cb8
堆栈
00128CB8   00000000
00128CBC   00000001
00128CC0   003C4330
00128CC4   00000000

情况是这样,还望各位大虾不吝赐教,留言或给我发邮件都行,zwl313@yahoo.com.cn
在此先谢过了。

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
今天求别人把精华7全部下来了,看到其中csjwaman的文章“arm3.60双进程”,里面讲到我出现的问题原来是因为采用的非标准壳。那就按非标准的方法试试吧,又有问题了,不好意思:)

下bp WaitForDebugEvent 程序断到了这
00DADB0F      23            DB 23                                    ;  CHAR '#'
00DADB10      82            DB 82
00DADB11      61            DB 61                                    ;  CHAR 'a'
00DADB12      52            DB 52                                    ;  CHAR 'R'
00DADB13      CE            DB CE
00DADB14      3B            DB 3B                                    ;  CHAR ';'
00DADB15      32            DB 32                                    ;  CHAR '2'
00DADB16      53            DB 53                                    ;  CHAR 'S'
00DADB17      C5            DB C5
00DADB18      AB            DB AB
00DADB19      60            DB 60                                    ;  CHAR '`'
00DADB1A      1E            DB 1E
00DADB1B      B6            DB B6
00DADB1C   >  3370 74       XOR ESI,DWORD PTR DS:[EAX+74]
00DADB1F   ?  1F            POP DS                                   ;  修正的段位寄存器
00DADB20   .  81B9 E42DFD67>CMP DWORD PTR DS:[ECX+67FD2DE4],BB3B6DF3
00DADB2A      17            DB 17
00DADB2B      C6            DB C6
00DADB2C      7C            DB 7C                                    ;  CHAR '|'
00DADB2D      BB            DB BB

好像是反汇编时的问题,不敢确定。命令已经被拆分成单字节的DB xx了,郁闷。
重新载入,直接下he WaitForDebugEvent,这回断到了,堆栈
0012BC88   00D94BF4  /CALL 到 WaitForDebugEvent
0012BC8C   0012CD60  |pDebugEvent = 0012CD60  //转存中跟随
0012BC90   000003E8  \Timeout = 1000. ms

取消断点,再下bp WriteProcessMemory,F9断到,堆栈
0012BB28   00D98B4D  /CALL 到 WriteProcessMemory
0012BB2C   0000004C  |hProcess = 0000004C
0012BB30   0041A000  |Address = 41A000
0012BB34   003A33C8  |Buffer = 003A33C8
0012BB38   00001000  |BytesToWrite = 1000 (4096.)
0012BB3C   0012BC44  \pBytesWritten = 0012BC44

内存数据
0012CD60  01 00 00 00 B8 06 00 00  ...?..
0012CD68  BC 06 00 00 01 00 00 80  ?....€
0012CD70  00 00 00 00 00 00 00 00  ........
0012CD78  97 A1 41 00 02 00 00 00  ?A....
0012CD80  00 00 00 00 97 A1 41 00  ....?A.
0012CD88  97 A1 41 00 00 00 00 00  ?A.....

请问到底41A000是OEP还是内存中的41A197是OEP?
还有,ALT+F9后返回到下面
00D98B4D      85            DB 85
00D98B4E      C0            DB C0
00D98B4F      75            DB 75                                    ;  CHAR 'u'
00D98B50      4B            DB 4B                                    ;  CHAR 'K'
00D98B51      50            DB 50                                    ;  CHAR 'P'
00D98B52      F7            DB F7
00D98B53      D0            DB D0
00D98B54      0F            DB 0F
00D98B55      C8            DB C8
00D98B56      58            DB 58                                    ;  CHAR 'X'
而实际上这里应该是
85c0  test eax,eax
75 4b jnz short xxxxxxxx
50    push eax
f7d0  not eax
0fc8  bswap eax
58    pop eax

很明显命令又被拆分了,而且全部都这样,郁闷,不知道该怎样处理这种问题了。
请大虾赐教。
还有armadillo对SoftIce的检测怎样躲过去呢?
2006-5-24 12:02
0
雪    币: 277
活跃值: (312)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
3
41A197是OEP

ctrl+A
2006-5-24 14:24
0
雪    币: 417
活跃值: (475)
能力值: ( LV9,RANK:1250 )
在线值:
发帖
回帖
粉丝
4
建议找这个软件查查:
ArmadilloFindProtected.exe
2006-5-24 16:41
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
感谢两位,我一会儿回去试试。

不过虽然命令被拆分了,不过还能执行,所以数着字节还是把子进程dump出来了,用OD加载之,傻了,怎么找IAT啊,运行到第一个CALL就挂了,没能像参考文章中说的那样跟踪几步就找到。

不知什么原因,还要请教高手了。
2006-5-25 10:48
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
刚才试了一下 wangshq397的方法,不行啊。我说的命令被拆分是用OD加载程序就这样,不是在执行期发生的,加载时自动分析过了,ctrl+A问题依然。还请大家帮忙想想办法。

还有就是怎么找IAT还是没搞懂,大侠救命。
我参考的是精华7里csjwaman的文章“arm3.60双进程”
2006-5-25 11:56
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
cyto说的那个软件ArmadilloFindProtected.exe
在哪儿能下到啊?
2006-5-25 12:09
0
雪    币: 443
活跃值: (200)
能力值: ( LV9,RANK:1140 )
在线值:
发帖
回帖
粉丝
8
首先必须搞清楚是何种保护方式,再找相应的方法~~

3、下GetCurrentThreadId断,

-------------> 使用BP CREATETHREAD效果更佳~~

:)
2006-5-25 14:21
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
(请结合13楼问题看)

按csjwaman说的做,我要脱的软件是3.75c非标准壳

命令被拆分的问题已经解决了,原来在OD中取消分析就行了:)

我参考csjwaman的方法,将子进程dump出来,用OD加载

0041A197 <>  55                    PUSH EBP
0041A198     8BEC                  MOV EBP,ESP
0041A19A     6A FF                 PUSH -1
0041A19C     68 00544500           PUSH dumped.00455400
0041A1A1     68 DCEC4100           PUSH dumped.0041ECDC
0041A1A6     64:A1 00000000        MOV EAX,DWORD PTR FS:[0]
0041A1AC     50                    PUSH EAX
0041A1AD     64:8925 00000000      MOV DWORD PTR FS:[0],ESP
0041A1B4     83EC 58               SUB ESP,58
0041A1B7     53                    PUSH EBX
0041A1B8     56                    PUSH ESI
0041A1B9     57                    PUSH EDI
0041A1BA     8965 E8               MOV DWORD PTR SS:[EBP-18],ESP
0041A1BD     FF15 58224500         CALL DWORD PTR DS:[452258]
0041A1C3     33D2                  XOR EDX,EDX
0041A1C5     8AD4                  MOV DL,AH
0041A1C7     8915 6C61D700         MOV DWORD PTR DS:[D7616C],EDX

用F7应该很快找到IAT,可是我在第一个call处F7就挂了,就是0041A1BD处的,错误提示“不知道如何继续进行,因为内存地址0142e626处是不宜读取的。请尝试更改EIP或者跳过异常执行程序。”。然后调试窗口中一片空白。
ds:[00452258]=0142e626

我不知道问题出在哪,请指教,急盼中
感谢了先
2006-5-25 15:16
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我对上面提出的问题已经束手无策了
急需高手帮助
自己先顶一下
2006-5-25 17:52
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
感谢两位,我一会儿回去试试。
2006-5-25 20:12
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
明天还要上班,不能在线等了。

如果哪位高手知道我在9楼提的问题,就麻烦指教一下吧。

cyto说的那个软件ArmadilloFindProtected.exe我在工具下载板块已找到,查了一下我要脱的软件,是双进程非标准壳,在调试过程也找到版本是3.75c。我现在用的脱壳方法应该没错,可dump出来的程序为什么会挂掉,迷茫了....
2006-5-25 23:01
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
今天继续研究,重新dump时,什么都没改,可是下bp WriteProcessMemory,断下
发现OEP变了
堆栈
0012BB28   00D98B4D  /CALL 到 WriteProcessMemory 来自 tzfx.00D98B47
0012BB2C   0000004C  |hProcess = 0000004C
0012BB30   0044B000  |Address = 44B000
0012BB34   003A3038  |Buffer = 003A3038
0012BB38   00001000  |BytesToWrite = 1000 (4096.)
0012BB3C   0012BC44  \pBytesWritten = 0012BC44

内存
0012CD60  01 00 00 00 24 05 00 00  ...$..
0012CD68  F0 02 00 00 01 00 00 80  ?....?
0012CD70  00 00 00 00 00 00 00 00  ........
0012CD78  D5 B8 44 00 02 00 00 00  崭D....
0012CD80  00 00 00 00 D5 B8 44 00  ....崭D.
0012CD88  D5 B8 44 00 00 00 00 00  崭D.....

OEP变成0044B8D5了。
先继续dump出子进程,OEP改成0044B8D5,用OD加载

0044B8D5 >  56              PUSH ESI
0044B8D6    E8 7561FCFF     CALL dumped.00411A50
0044B8DB    8BF0            MOV ESI,EAX
0044B8DD    85F6            TEST ESI,ESI
0044B8DF    74 1E           JE SHORT dumped.0044B8FF
0044B8E1    8B06            MOV EAX,DWORD PTR DS:[ESI]
0044B8E3    8BCE            MOV ECX,ESI
0044B8E5    FF90 B0000000   CALL DWORD PTR DS:[EAX+B0]
0044B8EB    85C0            TEST EAX,EAX
0044B8ED    74 10           JE SHORT dumped.0044B8FF

如果把OEP改成昨天的0041A197,再加载,就和昨天的一样了,也就是说每次dump出来的子进程都一样。
那OEP到底出什么问题了呢?哪个对啊,还是都不对?

对了,我下bp WaitForDebugEvent断到的不是在dll领空,堆栈里也看不到什么。我每次都是直接下he WaitForDebugEvent,再bp WriteProcessMemory。

请高手指点。急盼,急盼
2006-5-26 11:41
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
老大,各位版主,路过的高手,有谁知道就告诉我吧

不要再折磨我了,5555555
2006-5-26 11:47
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
不是我不想给,只是此程序内部使用,被严格禁止发布

不是技术保密,是有合法合理的原因的

请谅解

是CopyMemII的,debug blocker

大家提供点思路吧

谢谢
2006-5-26 12:10
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
是双进程非标准壳,3.75c版

只是我用相同的方法找到两个OEP,见9楼和13楼
每次dump出来的子进程都一样,现在不知道OEP对不对,这个值会变吗?
2006-5-26 12:34
0
游客
登录 | 注册 方可回帖
返回
//