1.OD的SFX自动寻找法:
2.内存断点法:
首先我们要知道,壳的原理是先解密,然后填充代码,填充完后才开始从OEP开始运行真正的源程序。那么我们的壳不管他怎么运行,他运行完成后肯定会执行原始程序的。如果壳和原始程序不在同一个段里。我们就可以使用该方法。
我们在程序段下一个内存执行代码,按F9一下。暂停后即可成功到达OEP。
这里我们拿一个最简单的upx为例子。
我们可以看到upx他总有一个upx段和一个多个upx0段。我们在第一个upx0段下一个内存断点。等个几秒钟就到达OEP了。
3.ESP定律法(堆栈平衡法):
简单说一下我的理解。首先pushad会压栈嘛,把程序的东西都压进去,他是按顺序从上往下的压的,popad的时候弹栈也是从上往下的弹出来。所以程序在弹栈的时候第一个执行的代码就是此时堆栈里最上面的那个代码。那这个代码现在正好是在esp里。那我们就对esp下一个硬件访问断点。然后按F9即可到达popad。然后不出意外的话OEP就在附近不远了。
4.第一个dll函数调用法。
5.最后一次异常法
这个方法说白了,就是利用最后一次异常,程序就运行了,那我们就定位到最后一次异常就表示离OEP不远了,我们到了之后,下一个内存执行断点即可了。(但是这个方法不建议你用太新的调试器,因为……太新了,就没有异常了哈哈哈哈!)
6.利用壳的常用函数定位OEP
壳一般会用到这三个函数。
GetProcAddress
这个函数的主要作用是从已加载的动态链接库中获取指定函数或变量的内存地址。如果 DLL 模块中不存在函数(例如,如果函数仅在 Windows Vista 上可用,但应用程序可能在 Windows XP 上运行),则按名称(而不是序号值)指定函数,并将应用程序设计为处理函数不可用时的情况。
我们来简单介绍这个函数的代码:
函数的原型:
FARPROC GetProcAddress(
HMODULE hModule,
LPCSTR lpProcName
);
参数说明: hModule: 包含需要获取函数地址的DLL的句柄。 lpProcName: 要获取的函数或变量的名称。
返回值 :如果函数成功,返回值是指定函数或变量的地址。如果失败,返回值为NULL。
LoadLibrary系列
功能: LoadLibrary 用于加载指定的动态链接库,并将其映射到调用进程的地址空间。 函数原型:
HMODULE LoadLibrary(
LPCSTR lpLibFileName
);
参数: lpLibFileName:要加载的 DLL 文件的名称。可以是完整路径,也可以是仅文件名(此时会在系统搜索路径中查找)。
返回值: 如果函数成功,返回值是已加载模块的句柄(HMODULE)。 如果函数失败,返回值是 NULL。可以使用 GetLastError 函数获取更多错误信息。
GetProcAddress
LoadLibrary
ExitThread
- 最新
- 最热
只看作者