yangand 发表于 2011-11-15 13:48

秒到OEP,支持所有壳,包括VMP等。。。。。

本帖最后由 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:,ebp
004711E3    8DAD 9CFEFFFF   lea ebp,dword ptr ss:
004711E9    872C24          xchg dword ptr ss:,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   0044D4EASE处理程序
0012FF5C   0012FF70
0012FF60   00000000
0012FF64   00000000
0012FF68   7FFDE000
0012FF6C   014617CC
0012FF70   0012FF88
0012FF74   0044EDA0演示程序.0044EDA0
0012FF78   7FFDE000
0012FF7C   0012FFC4指向下一个 SEH 记录的指针
0012FF80   004039B0SE处理程序
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|FFFFFFFFSEH 链尾部
0012FFC8|76F2E0EDSE处理程序
0012FFCC|011BB90B
0012FFD0|00000000
0012FFD4\0012FFEC
0012FFD8   76F737C8返回到 ntdll.76F737C8 来自 ntdll.76F737CE
0012FFDC   004711DAoffset 演示程序.<ModuleEntryPoint>
0012FFE0   7FFDE000
0012FFE4   00000000
0012FFE8   00000000
0012FFEC   00000000
0012FFF0   00000000
0012FFF4   004711DAoffset 演示程序.<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:,al
0044ED59   |0000            add byte ptr ds:,al
0044ED5B   |0058 EB         add byte ptr ds:,bl
0044ED5E   |44            inc esp
0044ED5F   |0055 8B         add byte ptr ss:,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:
0044ED75   |8B00            mov eax,dword ptr ds:
0044ED77   |E8 F8E5FFFF   call 演示程序.0044D374
0044ED7C   |8B0D AC004500   mov ecx,dword ptr ds:          ; 演示程序.00451BD0
0044ED82   |A1 D0FF4400   mov eax,dword ptr ds:
0044ED87   |8B00            mov eax,dword ptr ds:
0044ED89   |8B15 14E94400   mov edx,dword ptr ds:          ; 演示程序.0044E960
0044ED8F   |E8 F8E5FFFF   call 演示程序.0044D38C
0044ED94   |A1 D0FF4400   mov eax,dword ptr ds:
0044ED99   |8B00            mov eax,dword ptr ds:
0044ED9B   \E8 6CE6FFFF   call 演示程序.0044D40C
0044EDA0    E8 7B4FFBFF   call 演示程序.00403D20

这里就是OEP的头部了。如果你熟悉各种语言的入口特征的话,马上就应该知道OEP的位置了。
看这里
0044ED5F   |0055 8B         add byte ptr ss:,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:
0044ED75    8B00            mov eax,dword ptr ds:
0044ED77    E8 F8E5FFFF   call 演示程序.0044D374
0044ED7C    8B0D AC004500   mov ecx,dword ptr ds:          ; 演示程序.00451BD0
0044ED82    A1 D0FF4400   mov eax,dword ptr ds:


OEP就这样被找到了,这个方法是可以秒到所有壳的OEP的,只要你的OD能够让程序跑起来。








      
      

aopo001 发表于 2011-11-15 13:56

没钱了;{:1_937:}

310608900 发表于 2011-11-15 13:56

VMP的壳也可以??

9月° 发表于 2011-11-15 13:49

{:1_932:}支持一下万一火了呢。

yangand 发表于 2011-11-15 14:01

回复 310608900 的帖子

VMP也可以。。。

等待奇迹 发表于 2011-11-15 14:10

好教程,学习学习

qq20036 发表于 2011-11-15 14:14

额 去试试这么强悍{:301_1009:}

沉默 发表于 2011-11-15 14:19

VMP都可以那就神器了

bob123 发表于 2011-11-15 14:27

1.真心感谢楼主热心分享心得。
2.简直就是奇思妙想啊,这心得也太坑跌了吧。{:1_908:}
3.与其这样做,那么断程序调用的第一个api岂不是更简单?

rainisa 发表于 2011-11-15 14:29

本帖最后由 rainisa 于 2011-11-15 14:39 编辑

找个VMP的程序试一下就知道。
估计我的OD不行,试了几个版本都是程序直接运行了。
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 秒到OEP,支持所有壳,包括VMP等。。。。。