下载页面: http://bbs.pediy.com/showthread.php?s=&threadid=5850
或 点击此处本地下载。
软件大小: 52 KB
软件简介: Protector for exe files with cool import protection
【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
【调试环境】:WinXP、Ollydbg V1.10、PEiD、LordPE、ImportREC
—————————————————————————————————
【脱壳过程】:
Alex Protector V1.0是今天在exetools论坛发布的壳。
这个壳的花指令和输入表跳转地址加密有些麻烦。
今年涌现不少新壳,不知道这个Alex Protector以后会如何变态。
—————————————————————————————————
一、搞定输入表跳转地址加密
设置Ollydbg忽略除了“内存访问异常”之外的所有其它异常选项。老规矩:用IsDebug V1.4插件去掉Ollydbg的调试器标志。
00438000 60 pushad
//进入OD后暂停在这
00438001 E8 00000000 call alexprot.00438006
00438006 5D pop ebp
00438007 81ED 06104000 sub ebp,alexprot.00401006
0043800D E8 24000000 call alexprot.00438036
00438012 EB 01 jmp short alexprot.00438015
Shift+F9运行,暂停在内存访问异常处。
003B13C2 3300 xor eax,dword ptr ds:[eax]
//内存访问异常处
003B13C4 83C4 04 add esp,4
003B13C7 FFE3 jmp ebx
Shift+F9运行,会在003B13C2处中断3次。
Alt+M 打开内存察看窗口,在00401000段“设置内存写入断点”。
Shift+F9,中断在003B0C05处。中断后取消内存断点。
看看寄存器值,你会发现这里就是壳写入加密跳转地址的地方!
我在这里Patch,使壳写入程序中的地址作为输入表的跳转地址,这样就可以Dump下来了。
003B0C04 61 popad
003B0C05 8901 mov dword ptr ds:[ecx],eax
//中断在这里
//修改为:JMP 003BB000 ★
003B0C07 83C7 04 add edi,4
003B0C0A FECB dec bl
003B0C0C 58 pop eax
003B0C0D 80FB 00 cmp bl,0
003B0C10 0F87 42FFFFFF ja 003B0B58
003B0C16 803F C3 cmp byte ptr ds:[edi],0C3
003B0C19 0F84 A1FDFFFF je 003B09C0
003B0C1F 833F 00 cmp dword ptr ds:[edi],0
003B0C22 0F84 DE000000 je 003B0D06
//输入表处理完毕则跳转
003B0C28 E9 8AFDFFFF jmp 003B09B7
003B0C2D 47 inc edi
003B0C2E 8B1F mov ebx,dword ptr ds:[edi]
003B0C30 53 push ebx
003B0C31 60 pushad
003B0C32 EB 03 jmp short 003B0C37
————————————————————————
在下面找点空白处(003BB000)写入Patch代码:
003BB000 53 push ebx
003BB001 56 push esi
003BB002 3E:8B9C24 08FFFFFF mov ebx,dword ptr ds:[esp-F8]; USER32.77D10000
//[esp-F8]处保存的是处理DLL的基址 ★
003BB00A 3B1D 00C03B00 cmp ebx,dword ptr ds:[3BC000]; USER32.77D10000
//提前在[3BC000]处写入当前处理DLL的基址 ★
003BB010 74 0D je short 003BB01F
//比较处理的DLL是否相同 ★
003BB012 891D 00C03B00 mov dword ptr ds:[3BC000],ebx
//保存新的DLL基址 ★
003BB018 8305 08C03B00 04 add dword ptr ds:[3BC008],4
//不同则跳转地址+4,方便修复输入表 ★
003BB01F 8B1D 08C03B00 mov ebx,dword ptr ds:[3BC008] ; alexprot.00429000
//提前在[3BC008]处写入准备放跳转地址的地址,呵呵,有点拗口了 ★
//我选择的是程序的第4个区段,写入00429000
003BB025 3E:8BB424 58FFFFFF mov esi,dword ptr ds:[esp-A8]; USER32.TranslateMessage
//[esp-A8]处保存的是正确的函数 ★
003BB02D 8933 mov dword ptr ds:[ebx],esi
//函数写入修改的地址
003BB02F 8919 mov dword ptr ds:[ecx],ebx
//[ecx]是程序中的呼叫地址,写入修改后的跳转地址 ★
003BB031 8305 08C03B00 04 add dword ptr ds:[3BC008],4
//跳转地址+4
003BB038 5E pop esi
003BB039 5B pop ebx
//恢复堆栈
003BB03A 83C7 04 add edi,4
//003B0C07处代码挪到这里执行
003BB03D E9 C85BFFFF jmp 003B0C0A
//跳回去继续流程
————————————————————————
修改完以上部分后在003B0D06处下断,Shift+F9中断下来,输入表处理完毕了。
003B0D06 E8 97060000 call 003B13A2
//这里下断
003B0D0B 8D9D 31254000 lea ebx,dword ptr ss:[ebp+40253>
003B0D11 60 pushad
003B0D12 EB 03 jmp short 003B0D17
此时[3BC008]处是004290D8,这就是结束的地址了。
Size=004290D8-00429000=D8
OK,第一部分处理完毕。
—————————————————————————————————
二、OEP、Dump
Shift+F9运行,来到最后一次内存异常处。当然,这步可以省略。
003B13C2 3300 xor eax,dword ptr ds:[eax]
//最后一次内存异常
003B13C4 83C4 04 add esp,4
003B13C7 FFE3 jmp ebx
Alt+M 打开内存察看窗口,在00401000段“设置内存访问断点”。
Shift+F9 中断在00406B07处!
00406B05 0000 add byte ptr ds:[eax],al
00406B07 E8 4E2B0000 call alexprot.0040965A ; jmp to kernel32.GetModuleHandleA
//中断在这里
00406B0C A3 1CC64000 mov dword ptr ds:[40C61C],eax
00406B11 E8 382B0000 call alexprot.0040964E ; jmp to kernel32.GetCommandLineA
00406B16 E8 872B0000 call alexprot.004096A2 ; jmp to comctl32.InitCommonControls
看看堆栈:
0012FFA0 00000000
根据汇编语言编译程序的特点和堆栈,补上Stolen Code:
00406B05 6A 00 push 0
//用LordPE纠正ImageSize后完全DUMP这个进程
运行ImportREC,选择这个进程。把OEP改为00006B05,RVA=00029000、Size=000000D8,获取输入表。
FixDump,正常运行!
—————————————————————————————————
, _/
/| _.-~/ \_ , 青春都一晌
( /~ / \~-._ |\
`\\ _/ \ ~\ ) 忍把浮名
_-~~~-.) )__/;;,. \_ //'
/'_,\ --~ \ ~~~- ,;;\___( (.-~~~-. 换了破解轻狂
`~ _( ,_..--\ ( ,;'' / ~-- /._`\
/~~//' /' `~\ ) /--.._, )_ `~
" `~" " `" /~'`\ `\\~~\
" " "~' ""
UnPacked By : fly
2004-10-17 23:00