下载页面: http://www.superrsoft.com/cn/srcom.htm 软件大小: 5794 KB 软件语言: 中文 软件类别: 国产软件 / 共享版 / 网络辅助 应用平台: Win9x/NT/2000/XP
【说明】:此破文结合了Fly、mysqladm、pyzpyz、jwh51、骨灰C( MM)大虾们所写的破文,在此谢谢他们了,这是我第一次学OLLYDBG和脱Armadillo的壳,请各位大侠多多指教!
【作者声明】:只作为学习技术用,没有其他任何商业目的,失误之处敬请诸位大侠赐教!
【调试环境】:Win2000、Ollydbg、PEiD、LordPE、ImportREC
————————————————————————————————— 【脱壳过程】:
设置Ollydbg忽略所有的异常选项。用IsDebug 1.4插件去掉Ollydbg的调试器标志。
———————————————————————— 一、使程序把自己当成子进程运行 00567000 > $Content$nbsp;60 PUSHAD //进入OD后停在这! 00567001 . E8 00000000 CALL iepro.00567006 00567006 $Content$nbsp;5D POP EBP 00567007 . 50 PUSH EAX 00567008 . 51 PUSH ECX 00567009 . EB 0F JMP SHORT iepro.0056701A
下断:BP OpenMutexA
77E89CE9 > 55 PUSH EBP //断在这,看看堆栈 77E89CEA 8BEC MOV EBP,ESP 77E89CEC 51 PUSH ECX 77E89CED 51 PUSH ECX 77E89CEE 837D 10 00 CMP DWORD PTR SS:[EBP+10],0 77E89CF2 56 PUSH ESI 77E89CF3 74 50 JE SHORT KERNEL32.77E89D45
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆ BP OpenMutexA 时的堆栈:
0012F574 0053E141 /CALL 到 OpenMutexA 0012F578 001F0001 |Access = 1F0001 0012F57C 00000000 |Inheritable = FALSE 0012F580 0012FBB4 \MutexName = "20C::DA3A38CB6B" 0012F584 0012FF04 0012F588 00000000 0012F58C 0055C5D9 iepro.0055C5D9 ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
Ctrl+G:401000 键入以下代码
00401000 60 pushad 00401001 9C pushfd 00401002 68 B4FB1200 push 12FBB4 ★ 堆栈里看到的值 00401007 33C0 xor eax,eax 00401009 50 push eax 0040100A 50 push eax 0040100B E8 B4B2A577 call kernel32.CreateMutexA 00401010 9D popfd 00401011 61 popad 00401012 E9 33F7A577 jmp kernel32.OpenMutexA
在401000处新建起源,F9运行,再次中断在OpenMutexA处。
————————————————————————————————— 二、Magic Jump,避开IAT加密
取消以前断点,下断:BP GetModuleHandleA(为什么不下BP GetModuleHandleA+5呢?因为我试了很多次,用这个断点断不下来,所以改用BP GetModuleHandleA)
77E80978 > 55 PUSH EBP //断在这里 77E80979 8BEC MOV EBP,ESP 77E8097B 837D 08 00 CMP DWORD PTR SS:[EBP+8],0 77E8097F 75 0E JNZ SHORT KERNEL32.77E8098F //重新设置断点在这里 77E80981 64:A1 18000000 MOV EAX,DWORD PTR FS:[18] 77E80987 8B40 30 MOV EAX,DWORD PTR DS:[EAX+30] 77E8098A 8B40 08 MOV EAX,DWORD PTR DS:[EAX+8] 77E8098D EB 14 JMP SHORT KERNEL32.77E809A3 77E8098F FF75 08 PUSH DWORD PTR SS:[EBP+8] 77E80992 E8 2E890000 CALL KERNEL32.77E892C5 77E80997 85C0 TEST EAX,EAX 77E80999 74 08 JE SHORT KERNEL32.77E809A3 77E8099B FF70 04 PUSH DWORD PTR DS:[EAX+4] 77E8099E E8 E2000000 CALL KERNEL32.GetModuleHandleW 77E809A3 5D POP EBP 77E809A4 C2 0400 RETN 4
取消断点,在77E8097F处重新下断点,在这里中断十几次,中间会出现无法处理异常的对话框,用SHIFT+F9跳过就行了;Alt+F9返回程序。判断返回程序的时机: ☆ ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆ 注意看BP GetModuleHandleA 时的堆栈变化:
0012BEF8 00BCE3B7 /CALL 到 GetModuleHandleA 来自 00BCE3B1 0012BEFC 00BDF700 \pModule = "kernel32.dll" 0012BF00 00BE0710 ASCII "VirtualAlloc"
0012BEF8 00BCE3D4 /CALL 到 GetModuleHandleA 来自 00BCE3CE 0012BEFC 00BDF700 \pModule = "kernel32.dll" 0012BF00 00BE0704 ASCII "VirtualFree"
//再F9下去就会出现无法处理异常的对话框
0012BC70 |00BB912E 返回到 00BB912E 来自 KERNEL32.GetModuleHandleA 0012BC74 |0012BDAC ASCII "kernel32.dll"
到这里时就用CTRL+F9返回主程序:
00BB912E 8B0D 0838BE00 MOV ECX,DWORD PTR DS:[BE3808] 00BB9134 89040E MOV DWORD PTR DS:[ESI+ECX],EAX 00BB9137 A1 0838BE00 MOV EAX,DWORD PTR DS:[BE3808] 00BB913C 393C06 CMP DWORD PTR DS:[ESI+EAX],EDI 00BB913F 75 16 JNZ SHORT 00BB9157 00BB9141 8D85 B4FEFFFF LEA EAX,DWORD PTR SS:[EBP-14C] 00BB9147 50 PUSH EAX 00BB9148 FF15 CCA0BD00 CALL DWORD PTR DS:[BDA0CC] KERNEL32.LoadLibraryA 00BB914E 8B0D 0838BE00 MOV ECX,DWORD PTR DS:[BE3808] 00BB9154 89040E MOV DWORD PTR DS:[ESI+ECX],EAX 00BB9157 A1 0838BE00 MOV EAX,DWORD PTR DS:[BE3808] 00BB915C 393C06 CMP DWORD PTR DS:[ESI+EAX],EDI 00BB915F 0F84 AD000000 JE 00BB9212 //这里就是我们常说的Magic Jump,把它改为JMP 00BB9165 33C9 XOR ECX,ECX 00BB9167 8B03 MOV EAX,DWORD PTR DS:[EBX] 00BB9169 3938 CMP DWORD PTR DS:[EAX],EDI 00BB916B 74 06 JE SHORT 00BB9173
这里所作的修改,可以不需要在IAT处理结束后再还原代码了。
—————————————————————————————————
1 2 下一页 |