3.4 动态定位API函数地址(原理)
来源:http://www.tudoupe.com时间:2022-07-30
目录
一、Why?
二、How?
一、Why?
基于以前的代码嵌入实验和位置壳代码实验,我们发现这台机器的API输入地址与书上的API输入地址不同,因此,这导致API输入地址在机器上手动使用 dependency Walker被丢失在其他计算机上,它极大地影响了剥削的普遍性.这 一 现象 的 原因 主要 是 :
- 不同的操作系统版本: windows 200, windwos XP等将影响动态链接库的载荷基地址;
- 不同的补丁版本:许多安全补丁修改这些动态链接库中的函数,使得相应的动态链接库的内容不同于不同的补丁版本,包括动态链接库文件的大小和导出函数的极化地址。
二、How?
以Windows操作系统为例,Windows API通过动态链接库中的出口函数实现,例如,内存操作和其他功能在内核32中;在 dll中实现;许多与图像接口相关的API在user32中。Win_32平台shellcode使用最广泛的方法,通过从进程环境块中找到动态链接库的输出表,并搜索所需的API地址,然后注意调用。
所有的Win_32程序都会加载ntdll.dll和kernel32.dll这两个最基础的动态链接库。以定位kernel32.dll中的API地址为例,可以采用如下方法:
- 首先通过段选择字FS在内存中找到当前的线程环境块TEB。
- 线程环境块的偏移存储在0x30位置,带有指向方向进程环境块PEB的指针。
- 过程环境块中的偏移位置存储在0xOC指向的地方PEB_LDR_DATA结构存储由进程已经加载的动态链接库的信息的指针。
- PEB_LDR_DATA结构偏移位置为0xlC的地方存放着指向模块初始化链表的头指针InInitializationOrderModuleList。
- 模块初始化链表InInitializationOrderModuleList 中按顺序存放着PE装入运行时初始化模块的信息,表末端的第一个链接是ntdll.dll,第二个链接是 kernel32.DLL。
- 它属于32内核。 在 dll的结点之后,以0x08为基础的变换是在内存中载入DLL的基地址。
- 从32内核计算了DLL的装载基础地址,其中0x3C被移动PE头。
- PE头把Ox78移到存储指针的地方函数导出表的指针。
为此,我们可以用下列方法计算在函数输出表中所需的函数的输入地址:
- 表极化Ox1C的指针指向存储导数函数极化地址列表(RVAs)。
- 输出表的指针向0x20点移到存储输出函数的名称列表中。
- 函数的RVA地址和名称存储在上述两个列表中,我们可以在名称列表中找到它们
需要的函数是第一个,然后在地址列表中找到相应的RVA。 - 在获取RVA后,加上前面已经获得的动态链路库的加载基地址,您现在得到了所需的API
在内存中,虚拟地址是我们最终需要的地址,当调用shellcode时。
流程图如下:

相关新闻
- 2022-08-04 WPF的由来
- 2022-08-04 Win11勒索软件防护怎么打开?Win11安
- 2022-08-04 Windows系统jdk的配置
- 2022-08-04 Windows10 OneNote怎么重新登录?如何重
- 2022-08-04 超好用的 Windows 效率工具推荐
- 2022-08-04 Windows如何在CMD或PowerShell中配置代理
- 2022-08-04 powershell和cmd对比
- 2022-08-04 【QT】Windows下QT下载安装
- 2022-08-04 windows下 C++ 实现类属性的get和set方
- 2022-08-04 Win11快速助手在哪里?Win11打开快速
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
