【破文标题】:identify! 脱壳+破解
【参考教程】:
标 题: 【原创】PowerPoint to Flash 1.6.7 脱壳+破解
发帖人:KuNgBiM
时 间: 2005-08-19 16:42
原文链接:http://bbs.pediy.com/showthread.php?threadid=16342
【破文作者】:mjahuolong
【作者邮箱】:hhl760417@21cn.com
【软件名称】:identify! 4.0
【软件大小】:604k
【软件语言】:英文
【下载地址】:http://nj.onlinedown.net/soft/13656.htm
【软件简介】:利用来电显示功能的modem实现在电脑上来电显示,并可通过查询数据库,显示来电者的姓名等其他信息。
【保护方式】:注册码 + 30天试用限制
【加密保护】:peid查是:Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks
FI查是:Armadillo 2.85,根据英文网站上介绍的特征码,应该是2.85,搜遍精华1到7,竟然没有一篇关于2.85脱壳的例子。
【编译语言】:
【调试环境】:WinSer2003、PEiD、Ollydbg、LordPE、ImportREC
【破解日期】:2006-12-09
【破解目的】:学习arm推广使用Ollydbg手动脱壳
【作者声明】:初学Crack,只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
―――――――――――――――――――――――――――――――――
【脱壳过程】:
一、准备工作
侦壳:用PEiD查壳,Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks 加壳,打开LordPE看见该程序有2个进程,证明该软件具有双进程特征,下面我们就必须先分离父进程,要程序把自己当成子进程运行。
FI查是:Armadillo 2.85,根据英文网站上介绍的特征码,应该是2.85,搜遍精华1到7,竟然没有一篇关于2.85脱壳的例子。
再用Armadillo find protected 1.3 by vel检测显示:
★ 目标为Armadillo保护
★ 特征识别 = 041C0CD4
保护系统级别为 (标准版)
◆所用到的保护模式有◆
屏蔽调试器
双进程模式
使用 Nanomites 处理模式
【备份密钥设置】
无任何注册表操作
【程序压缩设置】
较好/较慢地压缩方式
【其它保护设置】
―――――――――――――――――――――――――――――――――
二、脱壳
1.分离父进程,使程序把自己当成子进程运行
设置Ollydbg自动隐藏,载入主程序:
004A00B9 >/$ 55 push ebp
004A00BA |. 8BEC mov ebp, esp
004A00BC |. 6A FF push -1
004A00BE |. 68 68824B00 push 004B8268
004A00C3 |. 68 00FB4900 push 0049FB00 ; SE 处理程序安装
004A00C8 |. 64:A1 0000000>mov eax, dword ptr fs:[0]
004A00CE |. 50 push eax
004A00CF |. 64:8925 00000>mov dword ptr fs:[0], esp
004A00D6 |. 83EC 58 sub esp, 58
004A00D9 |. 53 push ebx
004A00DA |. 56 push esi
004A00DB |. 57 push edi
004A00DC |. 8965 E8 mov dword ptr [ebp-18], esp
004A00DF |. FF15 28514B00 call dword ptr [<&KERNEL32.GetVersion>; kernel32.GetVersion
004A00E5 |. 33D2 xor edx, edx ;以上和教程一致
命令行下断:BP OpenMutexA 然后F9运行:
77E19E6B > 55 push ebp ;注意观察堆栈
77E19E6C 8BEC mov ebp, esp
77E19E6E 51 push ecx
77E19E6F 51 push ecx
77E19E70 837D 10 00 cmp dword ptr [ebp+10], 0
77E19E74 56 push esi
77E19E75 ^ 74 E8 je short 77E19E5F
77E19E77 FF75 10 push dword ptr [ebp+10]
77E19E7A 64:8B35 1800000>mov esi, dword ptr fs:[18]
77E19E81 8D45 F8 lea eax, dword ptr [ebp-8] ;以上和教程一致
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
注意看BP OpenMutexA 时的堆栈:
0012F5B8 0049990C /CALL 到 OpenMutexA 来自 Identify.00499906
0012F5BC 001F0001 |Access = 1F0001
0012F5C0 00000000 |Inheritable = FALSE
0012F5C4 0012FBF8 \MutexName = "120::DAF6C7C6AC" ;★注意这个地址:0012FBF8,与教程一致
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
在cpu的汇编窗口,Ctrl+G,输入:401000,确定,键入以下代码:
00401000 60 pushad
00401001 9C pushfd
00401002 68 F8FB1200 push 12FBF8 ; 堆里看到的值
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
//简便的方法可以在00401000上点击右键,选择在数据窗口中跟随,光标定位在数据窗口的00401000后的00上,按空格键打开编辑窗口,清除其中的内容
//复制以下二进制代码:60 9C 68 F8 FB 12 00 33 C0 50 50 E8 D9 BC A1 77 9D 61 E9 54 8E A1 77 00
//在编辑窗口最下边的HEX+00框中点击右键选择粘贴
在汇编窗口中的00401000上点击右键,选择:此处为新的EIP,新建起源,
弹出警告对话框:
标题:请确认可疑的EIP
内容:您指定的字节位于任何已知模块的可执行的代码外,无效EIP可能会严重影响调试的程序,您仍想更改EIP吗?
操作:确定
F9运行,
77E19E6B > 55 push ebp
77E19E6C 8BEC mov ebp, esp
77E19E6E 51 push ecx
77E19E6F 51 push ecx
77E19E70 837D 10 00 cmp dword ptr [ebp+10], 0
77E19E74 56 push esi
77E19E75 ^ 74 E8 je short 77E19E5F
77E19E77 FF75 10 push dword ptr [ebp+10]
77E19E7A 64:8B35 1800000>mov esi, dword ptr fs:[18]
77E19E81 8D45 F8 lea eax, dword ptr [ebp-8]
77E19E84 50 push eax
77E19E85 81C6 F80B0000 add esi, 0BF8
77E19E8B FF15 9010E177 call dword ptr [<&ntdll.RtlInitAnsiSt>; ntdll.RtlInitAnsiString
77E19E91 6A 00 push 0
77E19E93 8D45 F8 lea eax, dword ptr [ebp-8]
77E19E96 50 push eax
77E19E97 56 push esi
77E19E98 FF15 8C10E177 call dword ptr [<&ntdll.RtlAnsiString>; ntdll.RtlAnsiStringToUnicodeString
77E19E9E 85C0 test eax, eax
77E19EA0 7C 13 jl short 77E19EB5
堆栈显示:
0012F5B8 0049990C /CALL 到 OpenMutexA 来自 Identify.00499906
0012F5BC 001F0001 |Access = 1F0001
0012F5C0 00000000 |Inheritable = FALSE
0012F5C4 0012FBF8 \MutexName = "C50::DAF6C7C6AC"
此时Ctrl+G:401000 ,在数据窗口中,鼠标拖动选择刚才修改的范围(颜色为红色),点击右键,选择撤销刚才的修改的代码,使代码还原。
OK,父进程分离完毕!如果没有问题的话应该是这样了[把这段代码以二进制保存起来,下次用时直接粘贴,修改00401002处push的值就OK了。]
2、寻找Magic Jump,避开IAT加密
打开breakpoint窗口,删除以前所有的断点,下断:BP GetModuleHandleA 然后F9运行:
77E12CD1 > 837C24 04 00 cmp dword ptr [esp+4], 0
77E12CD6 74 18 je short 77E12CF0
77E12CD8 FF7424 04 push dword ptr [esp+4]
77E12CDC E8 92FFFFFF call 77E12C73
77E12CE1 85C0 test eax, eax
77E12CE3 74 08 je short 77E12CED
77E12CE5 FF70 04 push dword ptr [eax+4]
77E12CE8 E8 77520000 call GetModuleHandleW
77E12CED C2 0400 retn 4
77E12CF0 64:A1 18000000 mov eax, dword ptr fs:[18]
77E12CF6 8B40 30 mov eax, dword ptr [eax+30]
77E12CF9 8B40 08 mov eax, dword ptr [eax+8]
77E12CFC ^ EB EF jmp short 77E12CED
多次F9时堆栈依次显示:
0012EDD8 77B96960 /CALL 到 GetModuleHandleA 来自 msvcrt.77B9695A
0012EDDC 77B730F4 \pModule = "kernel32.dll"
***********************************************************************
0012EE18 77B98F12 /CALL 到 GetModuleHandleA 来自 msvcrt.77B98F0C
0012EE1C 77B730F4 \pModule = "kernel32.dll"
***********************************************************************
0012EE14 71B110E9 /CALL 到 GetModuleHandleA 来自 WSOCK32.71B110E3
0012EE18 71B12F8C \pModule = "kernel32.dll"
***********************************************************************
0012EDE4 4721B072 /CALL 到 GetModuleHandleA 来自 SHELL32.4721B06C
0012EDE8 472319A8 \pModule = "kernel32.dll"
***********************************************************************
0012EDE4 7717999D /CALL 到 GetModuleHandleA 来自 77179997
0012EDE8 771799D4 \pModule = "kernel32.dll"
***********************************************************************
0012EDE4 7713D3F0 /CALL 到 GetModuleHandleA 来自 OLEAUT32.7713D3EA
0012EDE8 770D41C4 \pModule = "kernel32.dll"
***********************************************************************
0012ECB0 770F0DB2 /CALL 到 GetModuleHandleA 来自 OLEAUT32.770F0DAC
0012ECB4 770D3618 \pModule = "KERNEL32.DLL"
***********************************************************************
0012ECB0 770F0DB2 /CALL 到 GetModuleHandleA 来自 OLEAUT32.770F0DAC
0012ECB4 770D3618 \pModule = "KERNEL32.DLL"
***********************************************************************
0012ECAC 770F0DB2 /CALL 到 GetModuleHandleA 来自 OLEAUT32.770F0DAC
0012ECB0 770D3618 \pModule = "KERNEL32.DLL"
***********************************************************************
0012F570 00498E53 /CALL 到 GetModuleHandleA 来自 Identify.00498E4D
0012F574 00000000 \pModule = NULL ;对比教程这里第一次出现NULL
***********************************************************************
0012DED8 003D471F /CALL 到 GetModuleHandleA 来自 003D4719
0012DEDC 003ED824 \pModule = "kernel32.dll"
***********************************************************************
0012DED8 003D471F /CALL 到 GetModuleHandleA 来自 003D4719
0012DEDC 003ED818 \pModule = "user32.dll" ;对比教程这里第一次出现user32.dll
***********************************************************************
0012DED8 003D471F /CALL 到 GetModuleHandleA 来自 003D4719
0012DEDC 003ED808 \pModule = "MSVBVM60.DLL" ;对比教程这里出现特别的dll
***********************************************************************
0012D81C 73441BC1 /CALL 到 GetModuleHandleA 来自 73441BBB
0012D820 73443DBC \pModule = "kernel32.dll"
***********************************************************************
0012D810 73442858 /CALL 到 GetModuleHandleA 来自 73442852
0012D814 73443DE8 \pModule = "KERNEL32"
***********************************************************************
0012D808 73443208 /CALL 到 GetModuleHandleA 来自 73443202
0012D80C 00000000 \pModule = NULL ;对比教程这里第二次出现NULL,应该是在这里Alt+F9返回程序了
73443202 FF15 70104473 call dword ptr [73441070] ; kernel32.GetModuleHandleA
73443208 FF35 D0065573 push dword ptr [735506D0] ;程序返回到这里,下边不仅有很多跳转,还有很多call,怎么寻找magic jump ?
7344320E A3 D4065573 mov dword ptr [735506D4], eax
73443213 E8 48000000 call 73443260
73443218 E8 4F000000 call 7344326C
7344321D 85C0 test eax, eax
7344321F 0F84 71410300 je 73477396
73443225 6A 00 push 0
73443227 6A 00 push 0
73443229 6A 00 push 0
7344322B FF15 7C104473 call dword ptr [7344107C] ; kernel32.HeapCreate
73443231 85C0 test eax, eax
73443233 A3 C8065573 mov dword ptr [735506C8], eax
73443238 0F84 58410300 je 73477396
7344323E 68 CC065573 push 735506CC
73443243 6A 01 push 1
73443245 FF15 90194473 call dword ptr [73441990] ; ole32.CoGetMalloc
根据坛主的提示,继续进行下去了几步,但是在alt+f9返回程序后,出现了很多call,和教程里显示的内容差别大,如果也是几个跳转的话,应该就可以确定magic jump,但是现在又无法进行下去了!看来照搬其他版本的教程是不可行的,请各位大虾协助阿!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)