幻影 V2.33 脱壳+修复——dbpe.exe主程序
幻影下载: http://dbpe.allit.net/ (或者网上搜索)
软件大小: 2.94 M
【软件简介】:幻影 是一个为 WINDOWS 下的EXE,DLL,OCX.32位可运行文件加密系统。 它为程序加上一层坚硬的保护壳。还可以为程序设置限制注册功能。即使你没有程序的原代码你也可以用幻影在程序上加上运行次数限制,运行天数限制,运行有效日期限制。加密程序支持Windows98,Windows Me,Windows 2000,Windows XP。
【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
【调试环境】:WinXP、flyODBG、PEiD、LordPE、ImportREC、Idt Tool
—————————————————————————————————
【过 程】:
Ollydbg1.09D 中文修改版 —— flyODBG 下载页面:
http://tongtian.net/pediybbs/viewtopic.php?t=1532
OllyDbg各类插件:可以下载 花指令去除器、IsDebug等插件
http://www.pediy.com/tools/Debuggers/ollydbg/plugin.htm
设置Ollydbg忽略所有的异常选项。老规矩:用IsDebug 1.4插件去掉flyODBG的调试器标志。载入后弹出“是压缩代码——要继续进行分析吗?”,点“否”。
—————————————————————————————————
一、浅谈 幻影 的调试
幻影 是国产加壳程序的骄傲!虽然有了脱壳机,但幻影依旧是值得研究的。幻影 最大的特点可谓是其反跟踪了,幻影的Anti能力之强在Xtreme-Protector未出之前是首屈一指的。正如 CoDe_inJect 大侠所言:“这个壳在国内如日中天,奥妙在于哪里?就在于anti做得比较完善,它是我见到的最早使用驱动的壳,虽然驱动的运用仅仅是为了在NT下切到Ring0,但他开创了壳使用驱动的先例。对idt进行修改,改变了int 1 and int 3的地址。”
虽然 幻影 威力巨大,但还是有许多的Cracker不顾蓝屏死机、硬盘伤痕而潜心研究,共享出宝贵的资料!感谢 :-)
偶觉得用修改的Ollydbg+IsDebug+花指令去除器等插件能够比较“爽”的调试幻影。
对于 幻影 对IDT的修改,偶找了个小工具:tMD[CsP]的Idt Tool,这样用Ollydbg调试出错后用Idt Tool恢复一下调试前的IDT就不会让 幻影 来帮偶们自动重启啦。:-D
很忙,抽点时间再次分析一下,算是对前几天发的《1分钟寻找 幻影 V2.33 壳的OEP》的补充吧。
—————————————————————————————————
二、避开IAT加密,得到正确的输入表
004FE000 EB 20 jmp short dbpe.004FE022//进入OD后停在这!
F9运行,弹出要求注册的对话框。此时在GetProcAddress处下硬件执行断点。
当然要点“试用”啦,返回OD,再次中断。
77E5A5FD 55 push ebp//断在这!然后取消这个硬件断点
77E5A5FE 8BEC mov ebp,esp
77E5A600 51 push ecx
77E5A601 51 push ecx
77E5A602 53 push ebx
77E5A603 57 push edi
77E5A604 8B7D 0C mov edi,dword ptr ss:[ebp+C]
77E5A607 BB FFFF0000 mov ebx,0FFFF
77E5A60C 3BFB cmp edi,ebx
77E5A60E 0F86 6B83FFFF jbe kernel32.77E5297F
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
看看GetProcAddress堆栈:
0012FF78 7FF80D42 /CALL 到 GetProcAddress 来自 7FF80D3C ★★这里!:-)
0012FF7C 77DA0000 |hModule = 77DA0000 (advapi32)
0012FF80 004D0E7E ProcNameOrOrdinal = "RegCloseKey"
0012FF84 7FF8571A ASCII "user.dat"
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
Ctrl+G:7FF80D42 在7FF80D42处再下 硬件执行 断点!F9运行,断下!
运行 hoto 大侠的 花指令去除器 ,填入 地址=7FF7EEBB 大小=FFFF 呵呵,大范围搜索,弹出去除了1842个花指令,看看效果:牛!:-) 看来 hoto 大侠是在分析 幻影 的时候写这个插件的,呵呵。
7FF80D35 50 push eax
7FF80D36 FFB5 F9C64200 push dword ptr ss:[ebp+42C6F9]
7FF80D3C FF95 02854300 call dword ptr ss:[ebp+438502]; kernel32.GetProcAddress
7FF80D42 90 nop//断在这!然后取消断点
7FF80D43 90 nop
…… …… 省 略 …… ……
7FF80D9F 90 nop
7FF80DA0 90 nop
7FF80DA1 3985 45134300 cmp dword ptr ss:[ebp+431345],eax; //EAX=正确函数
7FF80DA7 75 4B jnz short 7FF80DF4
7FF80DA9 90 nop
7FF80DAA 90 nop
…… …… 省 略 …… ……
7FF80DD4 90 nop
7FF80DD5 90 nop
7FF80DD6 C685 547C4200 01 mov byte ptr ss:[ebp+427C54],1
7FF80DDD 90 nop
7FF80DDE 90 nop
…… …… 省 略 …… ……
7FF80E24 90 nop
7FF80E25 90 nop
7FF80E26 80BD 547C4200 01 cmp byte ptr ss:[ebp+427C54],1
7FF80E2D 0F85 59030000 jnz 7FF8118C
7FF80E33 90 nop
…… …… 省 略 …… ……
7FF81036 90 nop
7FF81037 90 nop
7FF81038 8B85 7CD84200 mov eax,dword ptr ss:[ebp+42D87C]
7FF8103E 90 nop
7FF8103F 90 nop
…… …… 省 略 …… ……
7FF8106F 90 nop
7FF81070 90 nop
7FF81071 33D2 xor edx,edx
7FF81073 90 nop
7FF81074 90 nop
…… …… 省 略 …… ……
7FF810C4 90 nop
7FF810C5 90 nop
7FF810C6 03F8 add edi,eax
7FF810C8 90 nop
7FF810C9 90 nop
…… …… 省 略 …… ……
7FF810F8 90 nop
7FF810F9 90 nop
7FF810FA 89BD 4C7C4200 mov dword ptr ss:[ebp+427C4C],edi
7FF81100 90 nop
7FF81101 90 nop
…… …… 省 略 …… ……
7FF811E1 39BD D7D14200 cmp dword ptr ss:[ebp+42D1D7],edi
7FF811E7 76 10 jbe short 7FF811F9
7FF811E9 90 nop
7FF811EA 90 nop
7FF811EB 90 nop
7FF811EC 90 nop
7FF811ED 90 nop
7FF811EE 89BD D7D14200 mov dword ptr ss:[ebp+42D1D7],edi//①、NOP掉! ★★★
…… …… 省 略 …… ……
7FF811DF 90 nop
7FF811E0 90 nop
7FF811E1 39BD D7D14200 cmp dword ptr ss:[ebp+42D1D7],edi
7FF811E7 76 10 jbe short 7FF811F9
…… …… 省 略 …… ……
7FF8122D 90 nop
7FF8122E 90 nop
7FF8122F 89BD D3D14200 mov dword ptr ss:[ebp+42D1D3],edi//②、NOP掉! ★★★
7FF81235 90 nop
…… …… 省 略 …… ……
7FF8126C 90 nop
7FF8126D 890F mov dword ptr ds:[edi],ecx ★★★
//③、改为mov dword ptr ds:[edi],eax 呵呵,正确的函数写入正确的地址 :-)
7FF81272 90 nop
7FF81273 90 nop
7FF81274 83C6 04 add esi,4
7FF81277 90 nop
7FF81278 90 nop
7FF81279 90 nop
7FF8127A 90 nop
7FF8127B 90 nop
7FF8127C 83C7 04 add edi,4
…… …… 省 略 …… ……
7FF81296 E9 71F9FFFF jmp 7FF80C0C//循环!
OK,修改3个地方偶就得到了完整的输入表啦!:-)
1、7FF811EE mov dword ptr ss:[ebp+42D1D7],edi//①、NOP掉!
2、7FF8122F mov dword ptr ss:[ebp+42D1D3],edi//②、NOP掉!
3、7FF8126D mov dword ptr ds:[edi],ecx
改为 mov dword ptr ds:[edi],eax//正确的函数写入正确的地址
1和2这两处NOP掉是避免 幻影 对 地址指针 的加密,这样函数就写入正确的地址了。
—————————————————————————————————
二、寻找OEP,DUMP程序
可以参看偶前几天发的笔记:《1分钟寻找 幻影 V2.33 壳的OEP》
http://tongtian.net/pediybbs/viewtopic.php?p=14280
不用麻烦,在改完上面的3个地方后,Ctrl+F在当前位置下查找命令:jmp eax 在7FF8BFE7处 ,这就是 ☆梦寐以求☆ 的OEP一跳 :-) 可以在其上的POPAD的7FF8BFDB内存处下 内存访问 断点,F9断在7FF8BFDB
7FF8BFDB 61 popad //断在这!
7FF8BFDC 58 pop eax ;00401000//这就是OEP值
7FF8BFDD 83F8 FF cmp eax,-1
7FF8BFE0 75 05 jnz short 7FF8BFE7
7FF8BFE2 33C0 xor eax,eax
7FF8BFE4 C2 0C00 retn 0C
7FF8BFE7 FFE0 jmp eax//飞向光明之巅!:-)
00401000 EB 10 jmp short 00401012//可以在这儿用LordPE纠正ImageSize后完全DUMP这个进程
00401002 66:623A bound di,dword ptr ds:[edx]
00401005 43 inc ebx
00401006 2B2B sub ebp,dword ptr ds:[ebx]
00401008 48 dec eax
00401009 4F dec edi
0040100A 4F dec edi
0040100B 4B dec ebx
0040100C 90 nop
0040100D E9 30844B00 jmp 008B9442
00401012 A1 23844B00 mov eax,dword ptr ds:[4B8423]
00401017 C1E0 02 shl eax,2
0040101A A3 27844B00 mov dword ptr ds:[4B8427],eax
0040101F 52 push edx
00401020 6A 00 push 0
00401022 E8 3B5F0B00 call 004B6F62 ; jmp to kernel32.GetModuleHandleA
————————————————————————
三、修正部分地址
幻影的主程序还有一些地址加密:
004B6E58 FF25 08014D80 jmp dword ptr ds:[804D0108]
004B6E5E FF25 0C014D80 jmp dword ptr ds:[804D010C]
…… …… 省 略 …… ……
004B7302 FF25 B8074D80 jmp dword ptr ds:[804D07B8]
004B7308 FF25 BC074D80 jmp dword ptr ds:[804D07BC]
这些地方的[804D0108]是经过修改了,此时修复输入表还是无法运行的。不过偶们可以再次简单处理使其指向正确的地址。
把上面地址段内的[80XXXXXX]前面的80全部替换成00,就OK啦。 呵呵 :-)
004B6E58 FF25 08014D00 jmp dword ptr ds:[4D0108] ; advapi32.RegCloseKey
004B6E5E FF25 0C014D00 jmp dword ptr ds:[4D010C] ; advapi32.RegCreateKeyExA
004B6E64 FF25 10014D00 jmp dword ptr ds:[4D0110] ; advapi32.RegFlushKey
004B6E6A FF25 14014D00 jmp dword ptr ds:[4D0114] ; advapi32.RegOpenKeyExA
004B6E70 FF25 18014D00 jmp dword ptr ds:[4D0118] ; advapi32.RegQueryValueExA
可以直接在Ollydbg里修改后再DUMP程序,也可以DUMP之后用16进制工具修改。
注意:不要“滥杀”无辜!:-D 也不能遗漏。改的只是jmp dword ptr ds:[80XXXXXX]的前2位:80->00
—————————————————————————————————
四、修复输入表
运行ImportREC,选择这个进程。把OEP改为00001000,RVA=000D0108 大小=00000CF0 点IT AutoSearch,点“Get Import”,CUT掉几个无效函数。FixDump,正常运行!
虽然 幻影 主程序能够正常运行了,但是执行加壳功能时会提示“建立数据文件错误!加密失败!”,呵呵,这个暗桩偶就不追了,有兴趣就自己再去研究吧,或者对比swift大侠的破解版分析。
相信 D Boy 老师的 幻影 新版加壳系统就快“出炉”了。:-)
—————————————————————————————————
, _/
/| _.-~/ _ , 青春都一饷
( /~ / ~-._ |
`\ _/ ~ ) 忍把浮名
_-~~~-.) )__/;;,. _ //'
/'_, --~ ~~~- ,;;___( (.-~~~-. 换了破解轻狂
`~ _( ,_..-- ( ,;'' / ~-- /._`
/~~//' /' `~ ) /--.._, )_ `~
" `~" " `" /~'` `\~~
" " "~' ""
Cracked By 巢水工作坊——fly [OCN][FCG][NUKE][DCM]
2004-01-08 22:22