最初由 yuhong 发布
兄弟真的要向你指教了,我试了N次都无办法进入到正确的OEP处,狂晕了,我知道你是有正常进入OEP的。
用OD载入未脱壳的程序,bp DebugActiveProcess,F9断下。看堆栈窗口:
0012DAC4 00423BDB /CALL 到 DebugActiveProcess 来自 NOTEPAD.00423BD5
0012DAC8 00000324 \ProcessId = 324<=====子进程句柄(以看到的自己机器看到的为准)
0012DACC 0012FF2C
打开另一个OD附加324这个子进程。然后ALT+F9返回程序:
00433999 N> - EB FE jmp short NOTEPAD.<ModuleEntryPoint><====中断在此处,还原代码
0043399B EC in al,dx
0043399C |. 6A FF push -1
0043399E |. 68 503C4500 push NOTEPAD.00453C50
还原00433999处代码代码,EB FE改为55 8B。
OK,BP OpenMutexA,F9后中断
堆栈内容:
0012F59C 004145F1 /CALL 到 OpenMutexA 来自 NOTEPAD.004145EB
0012F5A0 001F0001 |Access = 1F0001
0012F5A4 00000000 |Inheritable = FALSE
0012F5A8 0012FBDC \MutexName = "614:A2AA26D13" //注意MutexName这个地址每个机器不同,以看到的为主。
找一块程序领空空地址,写入一些欺骗Arm的代码。
Ctrl+G 401000
00401000 0000 ADD BYTE PTR DS:[EAX],AL //都是空地址。
00401002 0000 ADD BYTE PTR DS:[EAX],AL
00401004 0000 ADD BYTE PTR DS:[EAX],AL
00401006 0000 ADD BYTE PTR DS:[EAX],AL
00401008 0000 ADD BYTE PTR DS:[EAX],AL
0040100A 0000 ADD BYTE PTR DS:[EAX],AL
0040100C 0000 ADD BYTE PTR DS:[EAX],AL
0040100E 0000 ADD BYTE PTR DS:[EAX],AL
00401010 0000 ADD BYTE PTR DS:[EAX],AL
00401012 0000 ADD BYTE PTR DS:[EAX],AL
OD直接双击修改,填入以下代码。
00401000 60 PUSHAD
00401001 9C PUSHFD
00401002 68 DCFB1200 PUSH 12FBDC //以上面堆栈中地址为准。
00401007 33C0 XOR EAX,EAX
00401009 50 PUSH EAX
0040100A 50 PUSH EAX
0040100B E8 687BA677 CALL KERNEL32.CreateMutexA
00401010 9D POPFD
00401011 61 POPAD
00401012 - E9 75C7A677 JMP KERNEL32.OpenMutexA
............................................................
将当前的 Eip 77E6D78C 切换到 401000 来。
点右键 选在此处新建 Eip ,看到Eip 变为 401000
F9运行,中断在OpenMutexA处,取消断点,Ctrl+G 401000,右键撤销选择,还原刚才的代码
然后下命令bp VirtualProtect,F9运行,中断几次,真至出现非法指令异常,取消断点,
再下bp GetModuleHandleA,Shift+F9运行,断下,把断点改为硬件执行,F9运行几次,直到
堆栈内容
0012BC98 00D97995 /CALL 到 GetModuleHandleA 来自 00A17995
0012BC9C 0012BDD4 \pModule = "kernel32.dll"
看到这个动态库就可以按Alt+F9返回了
00D97995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA
00D9799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]
00D979A1 89040E mov dword ptr ds:[esi+ecx],eax
00D979A4 A1 E011B300 mov eax,dword ptr ds:[B311E0]
00D979A9 393C06 cmp dword ptr ds:[esi+eax],edi
00D979AC 75 16 jnz short 00B079C4
00D979AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]
00D979B4 50 push eax
00D979B5 FF15 CC80B200 call dword ptr ds:[B280CC] ; KERNEL32.LoadLibraryA
00D979BB 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]
00D979C1 89040E mov dword ptr ds:[esi+ecx],eax
00D979C4 A1 E011B300 mov eax,dword ptr ds:[B311E0]
00D979C9 393C06 cmp dword ptr ds:[esi+eax],edi
00D979CC 0F84 AD000000 je 00B07A7F //这是文章中提到的magic jmp
我下了硬件执行断点,在401000段下内存断点,按F9然后不断修改标志位Z,最后中断在004010cc处,清除所有断点,用Imprec1.6f选择进程324,填入OEP地址10cc,填入RAV:72ec,size:244,不要按自动搜索IAT,直接按获取输入表,再按显示无效地址,剪掉修复抓取文件就OK了。
如果再不行我就没法了
。
:(