揭露AMR隐私 - OD 手脱带 KEY 的 ARM 程序
【脱壳作者】 刹那恍惚
【作者邮箱】 [email]RegKiller2002@yahoo.com.cn[/email]
【使用工具】 OllyDBG ,LordPE,ImportREC,PEiD v0.94
【脱壳平台】 WinXP SP2
【软件名称】 Win98 记事本
【软件大小】 568 KB
【保护选项】 Standard protection only 仅仅标准保护 + KEY 保护 (单进程)
【加壳方式】 Armadillo v4.40
【脱壳声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)
--------------------------------------------------------------------------------
【脱壳内容】
关于 ARM 带 KEY 的问题 N 多人问过了。再次解答一次,首先我们必须有一个可用的 KEY 否则程序是无法解码的(前辈的话,我只是站了一下他们的肩膀.嘿嘿),对于 ARM 我了解甚少,我的理解是如果你的程序无 KEY 的话就好像你有个 RAR 却没密码无法解压一样。又有人要说 RAR 可以穷举了,拜托,我加 RAR 密码从来都是中文做密码,你举出来的话可以发一份给我做纪念。呵呵。跑题了没?跑了大家记得把我叫回来。OK。我们继续,首先我们要弄个可用的 KEY,然后替换我们的机器指纹为可用 KEY 的机器指纹,注册正确之后开始脱壳基本上就跟没脱没 KEY 的 ARM 完全相同了。下面是这个程序的一个可用 KEY 是我用 ARM 在另一台机器上加壳的。
Hardware fingerprint: 5F48-DD41
Name: RegKiller
Key: 00001K-VKY502-J4WZFV-GXFK3Z-KD82T6-C0K6UK-6PCH59-WUAZP9-EX7HGD-4K9KVF-W0CRJZ
一、准备工作
侦壳:用PEiD查壳 Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks
老规矩设置Ollydbg忽略所有异常,用IsDebug 1.4插件去掉Ollydbg的调试器标志。
OD 载入
Shift+F9 运行,直到程序提示: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.
按 OK 按钮让程序弹出输入 KEY 的对话框,记下你自己的 Hardware fingerprint(我这里是 Hardware fingerprint: 0073-3907 这个值一会要用) 然后回到 OD下 he GetDlgItem 断点后回到程序随便输入一个名字和 KEY 后按 OK 按钮。断下后看堆栈提示
00128088 00C244FC /CALL 到 GetDlgItem 来自 00C244FA
0012808C 000607F0 |hWnd = 000607F0 (Enter Key,class=#32770)
00128090 00000407 ControlID = 407 (1031.)
ALT+F9 返回程序领空
00C244FC 85C0 TEST EAX,EAX ; 返回到此处
00C244FE 74 33 JE SHORT 00C24533
此时你可以找这段代码的开始处下硬件执行断点然后 Ctrl+F2 重载程序再分析。
这里我就不这么做了。删除刚才的硬件断点,向下找到这段代码
00C2467D /0F84 B7000000 JE 00C2473A
00C24683 |53 PUSH EBX
00C24684 |B9 98FAC300 MOV ECX,0C3FA98
00C24689 |E8 253CFEFF CALL 00C082B3 ; 右键跟随
00C2468E |53 PUSH EBX
00C2468F |B9 98FAC300 MOV ECX,0C3FA98
00C24694 |8945 08 MOV DWORD PTR SS:[EBP+8],EAX
00C24697 |E8 353CFEFF CALL 00C082D1
00C2469C |837D 14 01 CMP DWORD PTR SS:[EBP+14],1
00C246A0 |75 27 JNZ SHORT 00C246C9
00C246A2 |8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
00C246A5 |8BC8 MOV ECX,EAX
00C246A7 |81E1 FFFF0000 AND ECX,0FFFF
00C246AD |C1E8 10 SHR EAX,10
00C246B0 |51 PUSH ECX
00C246B1 |50 PUSH EAX
00C246B2 |8D85 00FFFFFF LEA EAX,DWORD PTR SS:[EBP-100]
00C246B8 |68 C496C300 PUSH 0C396C4 ; ASCII "%04X-%04X"
00C246BD |50 PUSH EAX
00C246BE |FF15 1063C300 CALL DWORD PTR DS:[C36310] ; msvcrt.sprintf
ASCII "%04X-%04X" 这个是谁?小谁家那小谁嘛,呵呵。向上看.我们再 00C24689 处的 CALL 右键跟随(也就是进入这个 CALL)来到下面代码处
00C082B3 56 PUSH ESI ; 来到此处
00C082B4 8BF1 MOV ESI,ECX
00C082B6 FF7424 08 PUSH DWORD PTR SS:[ESP+8]
00C082BA 8B8E 5C060000 MOV ECX,DWORD PTR DS:[ESI+65C]
00C082C0 6A 00 PUSH 0
00C082C2 E8 24D70000 CALL 00C159EB ; 右键跟随
00C082C7 3386 5C200000 XOR EAX,DWORD PTR DS:[ESI+205C] ; 问题 1 下面解答
00C082CD 5E POP ESI
00C082CE C2 0400 RETN 4
这里有 2 种方式(我测试了2个带KEY的ARM壳,所以我只碰到了2种方式。一会说明)
我们继续在 00C082C2 处的 CALL 右键跟随来到下面代码处
00C159EB 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4]
00C159EF C1E0 06 SHL EAX,6
00C159F2 034424 08 ADD EAX,DWORD PTR SS:[ESP+8]
00C159F6 8B4481 18 MOV EAX,DWORD PTR DS:[ECX+EAX*4+18]
00C159FA 35 8AC0E665 XOR EAX,65E6C08A
00C159FF C2 0800 RETN 8 ; 在此设置个断点
现在在 00C159FF 上设置一个硬件执行断点,然后 Ctrl+F2 重载程序并 SHIFT+F9 执行.断下后注意看 EAX 的值,我这里是 00733907,这个是什么?不就是刚才的 0073-3907 机器指纹吗?现在你应该知道怎么做了吧 ? 找个空白地方写个补丁代码就可以了。我这里用 OD 的动态分配内存插件分配个空间写个补丁.我得到的地址是 30000000 . 补丁代码入下,你也可以直接找个地方写代码而不用插件分配内存。
原代码:
00C159FA 35 8AC0E665 XOR EAX,65E6C08A
补丁代码:
00C159FA - E9 01A63E2F JMP 30000000