好友
阅读权限 25
听众
最后登录 1970-1-1
本帖最后由 yangand 于 2011-11-20 22:30 编辑
你可以怀疑这个方法,真的假的一试就知道,如果不知道怎么找,可以把你的试验品传到网盘,有空我把针对你试验品的步骤帖给你。
有的OEP被抽了代码的只能找到伪OEP,也就是被抽掉之后剩下的头部地址。
你也可以直接无视这个方法,对你少一个选择,对我没有任何损失。
首先讲一下方法的原理。
每一个程序都是由无数个CALL加其参数组成了,在程序里,每一个CALL都是有返回地址的。当在程序领空的时候,返回到不能返回的时候。这个返回地址就是在程序的main函数里。
所以只要找到了最终程序领空的返回地址,也就找到了main函数的地方。main函数的起始位置也就是oep了。而OD是会记录每一个返回地址的。我们用OD就可以迅速找到OEP了,而且适合所有壳(除了有注册框的壳,因为你不过掉注册框就到不了程序的领空)。
下面以一个加ZP的壳为例(无注册框),来说明如何操作。
1. OD载入程序,入口点为 004711DA > E8 01000000
call 演示程序.004711E0
004711DF 5C pop esp
004711E0 872C24 xchg dword ptr ss:[esp],ebp
004711E3 8DAD 9CFEFFFF lea ebp,dword ptr ss:[ebp-0x164]
004711E9 872C24 xchg dword ptr ss:[esp],ebp
004711EC ^ E9 8AFEFFFF jmp 演示程序.0047107B
004711F1 B0 1D mov al,0x1D
004711F3 ^ 7C E8 jl X演示程序.004711DD
2.直接shift+F9让程序跑起来,然后来到OD的堆栈窗口。直接拉到最下面。
0012FF54 0012FF7C 指向下一个 SEH 记录的指针
0012FF58 0044D4EA SE处理程序
0012FF5C 0012FF70
0012FF60 00000000
0012FF64 00000000
0012FF68 7FFDE000
0012FF6C 014617CC
0012FF70 0012FF88
0012FF74 0044EDA0 演示程序.0044EDA0
0012FF78 7FFDE000
0012FF7C 0012FFC4 指向下一个 SEH 记录的指针
0012FF80 004039B0 SE处理程序
0012FF84 0012FF88
0012FF88 /0012FF94
0012FF8C |75BEED6C 返回到 kernel32.75BEED6C
0012FF90 |7FFDE000
0012FF94 ]0012FFD4
0012FF98 |76F737F5 返回到 ntdll.76F737F5
0012FF9C |7FFDE000
0012FFA0 |77FF54A7
0012FFA4 |00000000
0012FFA8 |00000000
0012FFAC |7FFDE000
0012FFB0 |00000000
0012FFB4 |00000000
0012FFB8 |00000000
0012FFBC |0012FFA0
0012FFC0 |00000000
0012FFC4 |FFFFFFFF SEH 链尾部
0012FFC8 |76F2E0ED SE处理程序
0012FFCC |011BB90B
0012FFD0 |00000000
0012FFD4 \0012FFEC
0012FFD8 76F737C8 返回到 ntdll.76F737C8 来自 ntdll.76F737CE
0012FFDC 004711DA offset 演示程序.<ModuleEntryPoint>
0012FFE0 7FFDE000
0012FFE4 00000000
0012FFE8 00000000
0012FFEC 00000000
0012FFF0 00000000
0012FFF4 004711DA offset 演示程序.<ModuleEntryPoint>
0012FFF8 7FFDE000
0012FFFC 00000000
从下往上,找到第一个返回到程序领空的地址。0012FF74 0044EDA0 演示程序.0044EDA0,
然后汇编窗口中跟随,
来到这里
0044ED9F FF db FF
0044EDA0 E8 db E8
0044EDA1 7B db 7B ; CHAR '{'
0044EDA2 4F db 4F ; CHAR 'O'
0044EDA3 FB db FB
0044EDA4 FF db FF
0044EDA5 8D db 8D
0044EDA6 40 db 40 ; CHAR '@'
0044EDA7 00 db 00
0044EDA8 00 db 00
0044EDA9 00 db 00
0044EDAA 00 db 00
0044EDAB 00 db 00
0044EDAC 00 db 00
0044EDAD 00 db 00
0044EDAE 00 db 00
0044EDAF 00 db 00
3. 点右键,选择分析-->从模块中删除分析,变成这样
0044ED55 /EB 44 jmp X演示程序.0044ED9B
0044ED57 |0000 add byte ptr ds:[eax],al
0044ED59 |0000 add byte ptr ds:[eax],al
0044ED5B |0058 EB add byte ptr ds:[eax-0x15],bl
0044ED5E |44 inc esp
0044ED5F |0055 8B add byte ptr ss:[ebp-0x75],dl
0044ED62 |EC in al,dx
0044ED63 |83C4 F0 add esp,-0x10
0044ED66 |B8 80EB4400 mov eax,演示程序.0044EB80
0044ED6B |E8 586EFBFF call 演示程序.00405BC8
0044ED70 |A1 D0FF4400 mov eax,dword ptr ds:[0x44FFD0]
0044ED75 |8B00 mov eax,dword ptr ds:[eax]
0044ED77 |E8 F8E5FFFF call 演示程序.0044D374
0044ED7C |8B0D AC004500 mov ecx,dword ptr ds:[0x4500AC] ; 演示程序.00451BD0
0044ED82 |A1 D0FF4400 mov eax,dword ptr ds:[0x44FFD0]
0044ED87 |8B00 mov eax,dword ptr ds:[eax]
0044ED89 |8B15 14E94400 mov edx,dword ptr ds:[0x44E914] ; 演示程序.0044E960
0044ED8F |E8 F8E5FFFF call 演示程序.0044D38C
0044ED94 |A1 D0FF4400 mov eax,dword ptr ds:[0x44FFD0]
0044ED99 |8B00 mov eax,dword ptr ds:[eax]
0044ED9B \E8 6CE6FFFF call 演示程序.0044D40C
0044EDA0 E8 7B4FFBFF call 演示程序.00403D20
这里就是OEP的头部了。如果你熟悉各种语言的入口特征的话,马上就应该知道OEP的位置了。
看这里
0044ED5F |0055 8B add byte ptr ss:[ebp-0x75],dl
0044ED62 |EC in al,dx
其实这个就是被混淆了的OEP。他只是在558B的前面加了个00, 我们想办法把00去掉。
00的地址是0044ED5F,那么55的地址是0044ED60,我们CTRL+G,输入0044ED60,回车。我们的OEP就回来了,如下:
0044ED60 55 push ebp
0044ED61 8BEC mov ebp,esp
0044ED63 83C4 F0 add esp,-0x10
0044ED66 B8 80EB4400 mov eax,演示程序.0044EB80
0044ED6B E8 586EFBFF call 演示程序.00405BC8
0044ED70 A1 D0FF4400 mov eax,dword ptr ds:[0x44FFD0]
0044ED75 8B00 mov eax,dword ptr ds:[eax]
0044ED77 E8 F8E5FFFF call 演示程序.0044D374
0044ED7C 8B0D AC004500 mov ecx,dword ptr ds:[0x4500AC] ; 演示程序.00451BD0
0044ED82 A1 D0FF4400 mov eax,dword ptr ds:[0x44FFD0]
OEP就这样被找到了,这个方法是可以秒到所有壳的OEP的,只要你的OD能够让程序跑起来。
演示程序3.zp.rar
(415.95 KB, 下载次数: 4248)
免费评分
查看全部评分
发帖前要善用【论坛搜索 】 功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。