首页
社区
课程
招聘
令类armadillo脱壳
发表于: 2005-8-21 22:34 7757

令类armadillo脱壳

aki 活跃值
2
2005-8-21 22:34
7757

昨天有人在讨论一个armadillod壳保护的软件,down下来看了下,说是标准壳,却与一般的情况不太一样。
软件下载地址
http://yncnc.onlinedown.net/soft/41711.htm

peid查壳结果
Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks [Overlay]

od载入,找到地球人都知道的magic jmp处
003C471F           8906              mov dword ptr ds:[esi],eax          ; kernel32.77E40000
003C4721           3BC3              cmp eax,ebx
003C4723           75 0B             jnz short 003C4730
003C4725           FF76 F8           push dword ptr ds:[esi-8]
003C4728           FF15 CCB03D00     call dword ptr ds:[3DB0CC]          ; kernel32.LoadLibraryA
003C472E           8906              mov dword ptr ds:[esi],eax
003C4730           391E              cmp dword ptr ds:[esi],ebx
003C4732           74 19             je short 003C474D
003C4734           8B7E FC           mov edi,dword ptr ds:[esi-4]
003C4737           391F              cmp dword ptr ds:[edi],ebx
003C4739           74 12             je short 003C474D
003C473B           FF37              push dword ptr ds:[edi]
003C473D           FF36              push dword ptr ds:[esi]
003C473F           FF15 C8B03D00     call dword ptr ds:[3DB0C8]          ; kernel32.GetProcAddress
003C4745           8947 0C           mov dword ptr ds:[edi+C],eax
003C4748           83C7 10           add edi,10
003C474B         ^ EB EA             jmp short 003C4737
003C474D           83C6 0C           add esi,0C
003C4750           395E F8           cmp dword ptr ds:[esi-8],ebx
003C4753         ^ 75 C1             jnz short 003C4716
003C4755           E9 98000000       jmp 003C47F2
003C475A           381D 502D3E00     cmp byte ptr ds:[3E2D50],bl
003C4760           0F85 8C000000     jnz 003C47F2
003C4766           895D DC           mov dword ptr ss:[ebp-24],ebx

到这里,怎么看也不像是magic jmp
将就着改下,到401000段下内存断点断在oep处,看了下iat,还是有好多没有解密。看来那里确实不是magic jmp了
通过对iat下写入断点,很容易来到写入iat的地方
003D2111           6A 01             push 1
003D2113           58                pop eax
003D2114           85C0              test eax,eax
003D2116           0F84 7D010000     je 003D2299
003D211C           83A5 6CFCFFFF 00  and dword ptr ss:[ebp-394],0
003D2123           8B85 9CFEFFFF     mov eax,dword ptr ss:[ebp-164]
003D2129           0FBE00            movsx eax,byte ptr ds:[eax]
003D212C           85C0              test eax,eax
003D212E           75 12             jnz short 003D2142
003D2130           8B85 9CFEFFFF     mov eax,dword ptr ss:[ebp-164]
003D2136           40                inc eax
003D2137           8985 9CFEFFFF     mov dword ptr ss:[ebp-164],eax
003D213D           E9 57010000       jmp 003D2299
003D2142           8B85 9CFEFFFF     mov eax,dword ptr ss:[ebp-164]
003D2148           0FB600            movzx eax,byte ptr ds:[eax]
003D214B           3D FF000000       cmp eax,0FF
003D2150           0F85 A7000000     jnz 003D21FD
003D2156           8B85 9CFEFFFF     mov eax,dword ptr ss:[ebp-164]
003D215C           40                inc eax
003D215D           8985 9CFEFFFF     mov dword ptr ss:[ebp-164],eax
003D2163           8B85 9CFEFFFF     mov eax,dword ptr ss:[ebp-164]
003D2169           66:8B00           mov ax,word ptr ds:[eax]
003D216C           66:8985 68FCFFFF  mov word ptr ss:[ebp-398],ax
003D2173           8B85 9CFEFFFF     mov eax,dword ptr ss:[ebp-164]
003D2179           40                inc eax
003D217A           40                inc eax
003D217B           8985 9CFEFFFF     mov dword ptr ss:[ebp-164],eax
003D2181           0FB785 68FCFFFF   movzx eax,word ptr ss:[ebp-398]
003D2188           50                push eax
003D2189           FFB5 88FCFFFF     push dword ptr ss:[ebp-378]
003D218F           E8 D229FFFF       call 003C4B66
003D2194           8985 6CFCFFFF     mov dword ptr ss:[ebp-394],eax
003D219A           83BD 6CFCFFFF 00  cmp dword ptr ss:[ebp-394],0
003D21A1           75 58             jnz short 003D21FB
003D21A3           FF15 C4B03D00     call dword ptr ds:[3DB0C4]          ; ntdll.RtlGetLastWin32Error
003D21A9           83F8 32           cmp eax,32
003D21AC           75 0A             jnz short 003D21B8
003D21AE           C785 6CFCFFFF 5B4>mov dword ptr ss:[ebp-394],3C4B5B
003D21B8           83BD 6CFCFFFF 00  cmp dword ptr ss:[ebp-394],0
003D21BF           75 3A             jnz short 003D21FB
003D21C1           8B45 08           mov eax,dword ptr ss:[ebp+8]
003D21C4           8B00              mov eax,dword ptr ds:[eax]
003D21C6           C700 03000000     mov dword ptr ds:[eax],3
003D21CC           FF15 C4B03D00     call dword ptr ds:[3DB0C4]          ; ntdll.RtlGetLastWin32Error
003D21D2           50                push eax
003D21D3           0FB785 68FCFFFF   movzx eax,word ptr ss:[ebp-398]
003D21DA           50                push eax
003D21DB           FFB5 70FCFFFF     push dword ptr ss:[ebp-390]
003D21E1           68 A4E53D00       push 3DE5A4                         ; ASCII "File "%s", ordinal %d (error %d)"
003D21E6           8B45 08           mov eax,dword ptr ss:[ebp+8]
003D21E9           FF70 04           push dword ptr ds:[eax+4]
003D21EC           E8 CB2C0000       call 003D4EBC
003D21F1           83C4 14           add esp,14
003D21F4           33C0              xor eax,eax
003D21F6           E9 57050000       jmp 003D2752
003D21FB           EB 7A             jmp short 003D2277
003D21FD           8B85 9CFEFFFF     mov eax,dword ptr ss:[ebp-164]
003D2203           8985 64FCFFFF     mov dword ptr ss:[ebp-39C],eax
003D2209           6A 00             push 0
003D220B           FFB5 9CFEFFFF     push dword ptr ss:[ebp-164]
003D2211           E8 EA2B0000       call 003D4E00
003D2216           59                pop ecx
003D2217           59                pop ecx
003D2218           40                inc eax
003D2219           8985 9CFEFFFF     mov dword ptr ss:[ebp-164],eax
003D221F           FFB5 64FCFFFF     push dword ptr ss:[ebp-39C]
003D2225           FFB5 88FCFFFF     push dword ptr ss:[ebp-378]
003D222B           E8 3629FFFF       call 003C4B66
003D2230           8985 6CFCFFFF     mov dword ptr ss:[ebp-394],eax
003D2236           83BD 6CFCFFFF 00  cmp dword ptr ss:[ebp-394],0
003D223D           75 38             jnz short 003D2277
003D223F           8B45 08           mov eax,dword ptr ss:[ebp+8]
003D2242           8B00              mov eax,dword ptr ds:[eax]
003D2244           C700 03000000     mov dword ptr ds:[eax],3
003D224A           FF15 C4B03D00     call dword ptr ds:[3DB0C4]          ; ntdll.RtlGetLastWin32Error
003D2250           50                push eax
003D2251           FFB5 64FCFFFF     push dword ptr ss:[ebp-39C]
003D2257           FFB5 70FCFFFF     push dword ptr ss:[ebp-390]
003D225D           68 80E53D00       push 3DE580                         ; ASCII "File "%s", function "%s" (error %d)"
003D2262           8B45 08           mov eax,dword ptr ss:[ebp+8]
003D2265           FF70 04           push dword ptr ds:[eax+4]
003D2268           E8 4F2C0000       call 003D4EBC
003D226D           83C4 14           add esp,14
003D2270           33C0              xor eax,eax
003D2272           E9 DB040000       jmp 003D2752
003D2277           8B85 74FCFFFF     mov eax,dword ptr ss:[ebp-38C]
003D227D           8B8D 6CFCFFFF     mov ecx,dword ptr ss:[ebp-394]
003D2283           8908              mov dword ptr ds:[eax],ecx    //写入
003D2285           8B85 74FCFFFF     mov eax,dword ptr ss:[ebp-38C]      ; eBookStu.0057E1E8
003D228B           83C0 04           add eax,4
003D228E           8985 74FCFFFF     mov dword ptr ss:[ebp-38C],eax
003D2294         ^ E9 78FEFFFF       jmp 003D2111

注意这里
003D2219           8985 9CFEFFFF     mov dword ptr ss:[ebp-164],eax
003D221F           FFB5 64FCFFFF     push dword ptr ss:[ebp-39C]
003D2225           FFB5 88FCFFFF     push dword ptr ss:[ebp-378]
003D222B           E8 3629FFFF       call 003C4B66
003D2230           8985 6CFCFFFF     mov dword ptr ss:[ebp-394],eax
003D2236           83BD 6CFCFFFF 00  cmp dword ptr ss:[ebp-394],0
003D223D           75 38             jnz short 003D2277

上面的call是个分水岭,在这里解出api的地址,几个加密api的加密处理也是在这里完成的。
在上面的call下断,看下堆栈
0012DF14   77E40000   ASCII "MZ?
0012DF18   00E62124   ASCII "LoadLibraryExA"
这个LoadLibraryExA进去后,经过上面那个call的处理,得出一个加密的地址。
注意这里,这个地方怎么看怎么像是GetProcAddress的参数,我们直接改成这样
003D221F           FFB5 64FCFFFF     push dword ptr ss:[ebp-39C]
003D2225           FFB5 88FCFFFF     push dword ptr ss:[ebp-378]
003D222B           E8 0291A877       call kernel32.GetProcAddress
003D2230           8985 6CFCFFFF     mov dword ptr ss:[ebp-394],eax
003D2236           83BD 6CFCFFFF 00  cmp dword ptr ss:[ebp-394],0
003D223D           75 38             jnz short 003D2277

然后f9运行一下,程序提示异常了,但是所有的api都已经完全解出来,用ImportREC获取一下,然后填入oep,修复下dump下的文件,然后把overlay粘贴下,程序正常运行。因为注册用的是arm的注册模块,所以脱壳后就已经注册给你了。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (14)
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
2
旧版Armadillo
GetProcAddress上面比较特殊api待加密
跳开就行了
2005-8-21 22:47
0
雪    币: 223
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
我不太明白fly你是什么意思。
003C4739           74 12             je short 003C474D

003C4732           74 19             je short 003C474D
两处改掉都不行
之所以起名令类脱壳,就是这么个意思
2005-8-21 22:51
0
雪    币: 301
活跃值: (300)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
4
003D4BE2    85C0             test eax, eax
003D4BE4    74 0A            je short 003D4BF0  //把这里NOP掉,就可以得到未加密的IAT了
003D4BE6    83C6 10          add esi, 10
003D4BE9    397E 08          cmp dword ptr ds:[esi+8], edi
003D4BEC  ^ 75 DD            jnz short 003D4BCB
003D4BEE  ^ EB B9            jmp short 003D4BA9
2005-8-21 23:31
0
雪    币: 280
活跃值: (281)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
5
003C4737           391F              cmp dword ptr ds:[edi],ebx
003C4739           74 12             je short 003C474D

我在003C4739处跳过后,用ImportRec修复,程序仍然有错。
是不是我理解错了?请解释详细些
2005-8-21 23:31
0
雪    币: 223
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
to clide2000
呵呵,不好意思,你机器上地址跟我机器上不一样,所以刚才看错了。其实那样改跟直接改成call GetProcAddress没什么区别吧。可能这就是fly说的那个地方吧。
2005-8-21 23:35
0
雪    币: 301
活跃值: (300)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
7
我也没仔细看,只是发现NOP掉这里可以避过IAT的加密了
2005-8-21 23:43
0
雪    币: 280
活跃值: (281)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
8
最初由 clide2000 发布
003D4BE2 85C0 test eax, eax
003D4BE4 74 0A je short 003D4BF0 //把这里NOP掉,就可以得到未加密的IAT了
003D4BE6 83C6 10 add esi, 10
003D4BE9 397E 08 cmp dword ptr ds:[esi+8], edi
003D4BEC ^ 75 DD jnz short 003D4BCB
........

不行的,NOP后程序都不能运行了
2005-8-22 00:14
0
雪    币: 223
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
9
nop掉只是为了弄出iat,可以分两步来的吗。
2005-8-22 09:14
0
雪    币: 14940
活跃值: (4728)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
10
要的是完整IAT而并非要程序运行.先DUMP文件.记住OEP地址.然后修改那里在用IMPR就能找到完整的IAT了.修复之前DUMP的文件就OK.还有其他方法修复IAT的.
2005-8-22 09:47
0
雪    币: 136
活跃值: (105)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
11
【作者声明】:初学Crack,只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!

【调试环境】:WinXP、Ollydbg、PEiD、LordPE、ImportREC 1.6

【软件简介】: 电子书编辑器

【下载地址】: http://www.thespringsoft.com

Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks [Overlay]

设置Ollydbg忽略所有的异常选项。老规矩:用IsDebug 1.4插件去掉Ollydbg的调试器标志。

005A80B9 >  55               push ebp
005A80BA    8BEC             mov ebp,esp
005A80BC    6A FF            push -1
005A80BE    68 68025C00      push eBookStu.005C0268
005A80C3    68 007B5A00      push eBookStu.005A7B00
005A80C8    64:A1 00000000   mov eax,dword ptr fs:[0]

一看是单进程的所以我们可以直接下BP GetModuleHandleA+5  shift+f9

7C80B52E    837D 08 00       cmp dword ptr ss:[ebp+8],0//到这里
7C80B532    74 18            je short kernel32.7C80B54C
7C80B534    FF75 08          push dword ptr ss:[ebp+8]
7C80B537    E8 682D0000      call kernel32.7C80E2A4

看堆栈

0012FF34  /0012FFC0
0012FF38  |005A8181  返回到 eBookStu.005A8181 来自 kernel32.GetModuleHandleA

0012ED64  /0012ED80
0012ED68  |77F45BB0  返回到 77F45BB0 来自 kernel32.GetModuleHandleA
0012ED6C  |77F44FF4  ASCII "KERNEL32.DLL"

0012E558  /0012E590
0012E55C  |5D175394  返回到 5D175394 来自 kernel32.GetModuleHandleA
0012E560  |5D1753E0  ASCII "kernel32.dll"

0012F56C  /0012F5C0
0012F570  |005A0E53  返回到 eBookStu.005A0E53 来自 kernel32.GetModuleHandleA
0012F574  |00000000
0012F578  |005BD56C  ASCII "RegisterServiceProcess"

0012DED4  /0012DF10
0012DED8  |003D471F  返回到 003D471F 来自 kernel32.GetModuleHandleA
0012DEDC  |003ED824  ASCII "kernel32.dll"//返回时机到了

取消段点返回

003D471F    8906             mov dword ptr ds:[esi],eax         ; kernel32.7C800000
003D4721    3BC3             cmp eax,ebx
003D4723    75 0B            jnz short 003D4730
003D4725    FF76 F8          push dword ptr ds:[esi-8]
003D4728    FF15 CCB03E00    call dword ptr ds:[3EB0CC]         ; kernel32.LoadLibraryA
003D472E    8906             mov dword ptr ds:[esi],eax
003D4730    391E             cmp dword ptr ds:[esi],ebx
003D4732    74 19            je short 003D474D//改je为jmp
003D4734    8B7E FC          mov edi,dword ptr ds:[esi-4]
003D4737    391F             cmp dword ptr ds:[edi],ebx
003D4739    74 12            je short 003D474D
003D473B    FF37             push dword ptr ds:[edi]
003D473D    FF36             push dword ptr ds:[esi]
003D473F    FF15 C8B03E00    call dword ptr ds:[3EB0C8]         ; kernel32.GetProcAddress

下内存访问断点直接到oep
005753A0    55             push ebp//oep
005753A1    8BEC           mov ebp,esp
005753A3    83C4 F0        add esp,-10
005753A6    B8 E04C5700    mov eax,eBookStu.00574CE0
005753AB    E8 C015E9FF    call eBookStu.00406970
005753B0    A1 70AC5700    mov eax,dword ptr ds:[57AC70]
005753B5    8B00           mov eax,dword ptr ds:[eax]
005753B7    E8 ECB1EFFF    call eBookStu.004705A8
005753BC    8B0D 70AC5700  mov ecx,dword ptr ds:[57AC70]      ; eBookStu.0057BB7C
005753C2    8B09           mov ecx,dword ptr ds:[ecx]
005753C4    B2 01          mov dl,1
005753C6    A1 44874A00    mov eax,dword ptr ds:[4A8744]
005753CB    E8 FC2AEFFF    call eBookStu.00467ECC

用loadpe   dump之 ImportREC选择 这个进程 oep=0057530-400000=1753A0 点IT AutoSearch,CUT掉无效函数。FixDump,运行程序出错

接着我看打开dump文件

005753A0 >  55             push ebp
005753A1    8BEC           mov ebp,esp
005753A3    83C4 F0        add esp,-10
005753A6    B8 E04C5700    mov eax,dumped2_.00574CE0
005753AB    E8 C015E9FF    call dumped2_.00406970//f7进入
005753B0    A1 70AC5700    mov eax,dword ptr ds:[57AC70]
005753B5    8B00           mov eax,dword ptr ds:[eax]

00406970    53             push ebx
00406971    8BD8           mov ebx,eax
00406973    33C0           xor eax,eax
00406975    A3 9C605700    mov dword ptr ds:[57609C],eax
0040697A    6A 00          push 0
0040697C    E8 2BFFFFFF    call <jmp.&kernel32.GetModuleHandl>//f7进入得到函数地址

004068AC  - FF25 7CE25700  jmp dword ptr ds:[<&kernel32.GetMo>; kernel32.GetModuleHandleA//jmp dword ptr ds:[57E27C]
004068B2    8BC0           mov eax,eax
004068B4  - FF25 78E25700  jmp dword ptr ds:[<&kernel32.Local>; kernel32.LocalAlloc
004068BA    8BC0           mov eax,eax
004068BC  - FF25 74E25700  jmp dword ptr ds:[<&kernel32.TlsGe>; kernel32.TlsGetValue
004068C2    8BC0           mov eax,eax
004068C4  - FF25 70E25700  jmp dword ptr ds:[<&kernel32.TlsSe>; kernel32.TlsSetValue
关闭这个程序 重新打开源程序

005A80B9 >  55             push ebp
005A80BA    8BEC           mov ebp,esp
005A80BC    6A FF          push -1
005A80BE    68 68025C00    push eBookStu.005C0268
005A80C3    68 007B5A00    push eBookStu.005A7B00
005A80C8    64:A1 00000000 mov eax,dword ptr fs:[0]
005A80CE    50             push eax
005A80CF    64:8925 000000>mov dword ptr fs:[0],esp
005A80D6    83EC 58        sub esp,58
005A80D9    53             push ebx
005A80DA    56             push esi
005A80DB    57             push edi
005A80DC    8965 E8        mov dword ptr ss:[ebp-18],esp
005A80DF    FF15 28D15B00  call dword ptr ds:[<&KERNEL32.GetV>; kernel32.GetVersion

下hr 57E27C断点 这个就不用我说了吧

003E4553    F3:A5          rep movs dword ptr es:[edi],dword >//取消断点
003E4555    FF2495 68463E0>jmp dword ptr ds:[edx*4+3E4668]
003E455C    8BC7           mov eax,edi
003E455E    BA 03000000    mov edx,3
003E4563    83E9 04        sub ecx,4
003E4566    72 0C          jb short 003E4574
003E4568    83E0 03        and eax,3
003E456B    03C8           add ecx,eax
003E456D    FF2485 80453E0>jmp dword ptr ds:[eax*4+3E4580]
003E4574    FF248D 78463E0>jmp dword ptr ds:[ecx*4+3E4678]
003E457B    90             nop

。。。。。。。。f8一直走

003E2219    8985 9CFEFFFF  mov dword ptr ss:[ebp-164],eax
003E221F    FFB5 64FCFFFF  push dword ptr ss:[ebp-39C]
003E2225    FFB5 88FCFFFF  push dword ptr ss:[ebp-378]
003E222B    E8 3629FFFF    call 003D4B66//这里 修改为 call kernel32.GetProcAddress
003E2230    8985 6CFCFFFF  mov dword ptr ss:[ebp-394],eax
003E2236    83BD 6CFCFFFF >cmp dword ptr ss:[ebp-394],0

F9运行 出错 点确定 这个时候程序中止了 ,不要管他
打开ImportREC选择 这个进程 oep=0057530-400000=1753A0 点IT AutoSearch,CUT掉无效函数。FixDump,程序运行了,它采用的的ARM的注册模块,壳脱掉了也就不需要注册了.

夜凉如水[bcg]
2005-8-22 11:17
0
雪    币: 280
活跃值: (281)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
12
用楼上的方法是可以的,但有没有修改Magic Jump不出错的方案呢?
看了另几篇文章好像不加密特殊api时是可以的。
2005-8-22 11:27
0
雪    币: 207
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
我也碰到了这种壳,要是FLY能做个详细的教程就好了,大家期盼呀
2005-8-22 11:35
0
雪    币: 214
活跃值: (86)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
14
汗~~~原来这个不是标准ARM,怪不得我弄不好,多谢两位大虾指点~~谢谢~!!
2005-8-22 12:00
0
雪    币: 61
活跃值: (160)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
15
2005-8-22 17:40
0
游客
登录 | 注册 方可回帖
返回
//