sp; jmp short 0090D44B ; There is some Special API need Handed Repaired.
0090D44B 9D popfd
0090D44C EB 03 jmp short 0090D451
0090D451 E9 7D3C0500 jmp 009610D3 ; Jump StolenOEP ! Found by heXer & fly
//飞向光明之颠
看看堆栈:
0012FF78 FFFFFFFF
0012FF7C 00908BC4
0012FF80 00908BC8
寄存器:
ESP=0012FF78
EBP=0012FFC0
ESI=FFFFFFFF
找个Visual C++ 6.0的程序参考一下,Win98的WRITE.EXE
0040100C 55 push ebp
0040100D 8BEC mov ebp,esp
0040100F 83EC 44 sub esp,44
00401012 56 push esi
00401013 FF15 58204000 call dword ptr ds:[402058] ; kernel32.GetCommandLineA
Alt+M设置00960000区段为完整权限,否则会提示:
Unable to read memory of debugged process (00960000..00968FFF).
修复StolenOEPCode如下:
009610CC 55 push ebp
009610CD 8BEC mov ebp,esp
009610CF 83EC 44 sub esp,44
009610D2 56 push esi
009610D3 FF15 E0639600 call dword ptr ds:[9663E0] ; kernel32.GetCommandLineA
009610D9 8BF0 mov esi,eax
009610DB 8A00 mov al,byte ptr ds:[eax]
009610DD 3C 22 cmp al,22
009610DF 75 13 jnz short 009610F4
用LoadPE完全dump出Test.Obsidium V1.3.0.4.exe进程,区域dump出00960000-00969000段,Load入dump.exe,修改新区段VirtualAddress=00560000。只保留Rebuilder的Validate PE选项Rebuild dump.exe
—————————————————————————————————
四、输入表
在转存中察看输入表函数的开始和结束
地址。
运行ImportRec,OEP=005610CC、RVA=005662E0、Size=0000023C
会发现有几个无效指针,注意了,某些是填充在DLL之间的垃圾数据,而某些是待修复函数
如005662F4处明显是填充在DLL之间的垃圾数据,直接Cut掉
1 005662F0 advapi32.dll 01CE RegCreateKeyA
0 005662F4 ? 0000 0097070A
1 005662F8 gdi32.dll 01A6 GetStockObject
而下面这些则是需要修复的函数:
1 00566368 kernel32.dll 0252 LocalUnlock
0 0056636C ? 0000 00970090
1 00566370 kernel32.dll 024C LocalFree
1 00566374 kernel32.dll 0248 LocalAlloc
0 00566378 ? 0000 009700B4
1 0056637C kernel32.dll 01EB GlobalAlloc
下面再说说如何修复这些函数吧。
现在我们用UEStudio打开Obsidium V1.3.0.0.osc,找到下面这行
log FixCode1
//jmp Final
把//jmp Final前的//去掉,这样
脚本就不处理输入表,直接去OEP了
新开一个OllyDBG,载入Test.Obsidium V1.3.0.4.exe,运行修改后的
脚本,走至StolenOEP
设置目前
代码所在区段为完整权限,找到那些调用待修复函数的地方。如
搜索常数:96636C
009634C6 FF15 6C639600 call dword ptr ds:[96636C]
找到这里,Ctrl+* 在009634C6处新建EIP,跟进去