PE格式:新建节并插入DLL

简介: PE格式是 Windows下最常用的可执行文件格式,理解PE文件格式不仅可以了解操作系统的加载流程,还可以更好的理解操作系统对进程和内存相关的管理知识,而有些技术必须建立在了解PE文件格式的基础上,如文件加密与解密,病毒分析,外挂技术等。

PE格式是 Windows下最常用的可执行文件格式,理解PE文件格式不仅可以了解操作系统的加载流程,还可以更好的理解操作系统对进程和内存相关的管理知识,而有些技术必须建立在了解PE文件格式的基础上,如文件加密与解密,病毒分析,外挂技术等。

首先老样子,我们先来到PE节表位置处,并仿写一个.hack的节,该节大小为0x1000字节,在仿写前我们需要先来计算出.hack的虚拟偏移与实际偏移,先来查询一下当前节表结构,如下:

image.png

接着我们通过公式计算一下.hack的虚拟偏移与实际偏移应该设置为多少,注意内存对齐,如加上2000是因为要遵循内存对齐,公式如下:

.hack 虚拟偏移:虚拟偏移(.rsrc) + 虚拟大小(.hack) => 0x0001B000 + 0x00001000 + 2000 = 1E000
.hack 实际偏移:实际偏移(.rsrc) + 实际大小(.rsrc) => 0x00007800 + 0x00002600 = 9E00

经过公式推导我们可得知要仿写.hack节,虚拟偏移应设置为1E000实际偏移设置为9E00节区长度为0x1000字节,将其填充到绿色位置即可,此外还需要注意节属性必须为E00000E0可读可写属性,如下图:

image.png

使用WinHEX在文件末尾添加填充0字节数据,填充长度为4096,我们的文件偏移为0x9E00,并且跳转到0xF0处将红色的06改为07,并将底部的1e000 + 1000修正为1F000 此时我们的.hack节添加完成,其对应的虚拟偏移为0x0001E000实际偏移为0x00009E00长度都是0x1000字节。

image.png

接着使用工具找到导入表的位置,如下导入表位置0x00006DE0 长度是0x00000050

image.png

我们使用WinHex定位过去,将其拷贝一份,选中右键【复制选快】->【十六进制复制即可】

image.png

接着定位到0x9E00也就是.hack节的开头位置,将其复制到这里来,这里的留白位置就是我们需要添加进来的IID数组暂时为空。

image.png

先来把仿写的位置标注上序号,这里为大家具体解释一下原因,以及为什么这样来写。

首先红色位置代表的字段是: OriginalFirstThunk 其指向中间变量 FOA = 9E80而中间变量则需要指向一个Image_Thunk_Data结构,这里我们使用 FOA = 9E90来模仿,该结构前两个字节为hInt值默认为0,后面则是一个导入的函数字符串。
绿色位置代表的是需要导入的DLL文件名,此处没有中间值,可以直接指向字符串。
棕色部分代表的是FirstThunk 其同样需要指向Image_Thunk_Data结构 FOA = 9E90

我们来转换一下,具体的地址:

红色OriginalFirstThunk需要指向FOA=9E80也就是RVA=0x0001E080 ,然后9E80里面需要再次指向FOA=9E90也就是指向RVA=0x0001E090,9E90里面存储的是MsgBox 你的导入函数字符串。
绿色 DllName 则直接指向FOA=9EB0 也就是指向RVA=0x0001E0B0 里面是导入DLL名称,此处是 lyshark.dll
棕色 FirstThunk 则需要指向FOA=9ED0 也就是指向 RVA= 0x0001E0D0 而9ED0则需要指向FOA=9E90也就是指向RVA=0x0001E090

image.png

由于我们增加了导入表,增加了一个结构,所以要跳转到170处修正大小30+20=50,并将导入表地址修正为FOA = 0x9E00 也就是RVA =0x0001E000

image.png

最后接触输入表绑定状态,也就是将1B0-1B8处的内容全部清0即可。
image.png

编写一个DLL,然后放入同一目录下,运行后可弹出窗口.

#include <Windows.h>
#include <stdio.h>

extern "C"__declspec(dllexport) void MsgBox()
{
    MessageBox(0, "hello lyshark", "inject", MB_OK);
}

DWORD WINAPI ThreadShow(LPVOID lpParameter)
{
    char szPath[MAX_PATH] = { 0 };
    char szBuf[1024] = { 0 };

    GetModuleFileName(0, szPath, MAX_PATH);
    sprintf(szBuf, "路径: %s ---> PID: %d ", szPath, GetCurrentProcessId());
    MessageBox(0, szBuf, 0, 0);

    return 0;
}

BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    if (ul_reason_for_call == DLL_PROCESS_ATTACH)
    {
        CreateThread(0, 0, ThreadShow, 0, 0, 0);
    }

    return TRUE;
}
目录
相关文章
|
4月前
|
IDE API 开发工具
visual studio 生成dll文件以及修改输出dll文件名称操作
visual studio 生成dll文件以及修改输出dll文件名称操作
88 0
|
8月前
|
安全 编译器 API
2.5 PE结构:导入表详细解析
导入表(Import Table)是Windows可执行文件中的一部分,它记录了程序所需调用的外部函数(或API)的名称,以及这些函数在哪些动态链接库(DLL)中可以找到。在Win32编程中我们会经常用到导入函数,导入函数就是程序调用其执行代码又不在程序中的函数,这些函数通常是系统提供给我们的API,在调用者程序中只保留一些函数信息,包括函数名机器所在DLL路径。
131 1
|
JSON 数据格式
批量遍历指定类型的文件及文件夹,并将其复制到新的文件夹
批量遍历指定类型的文件及文件夹,并将其复制到新的文件夹
86 0
|
程序员
win10怎么改文件后缀名格式(win10怎么显示修改文件扩展名)
win10怎么改文件后缀名格式(win10怎么显示修改文件扩展名)
682 0
|
安全 小程序 Shell
PE格式:新建节并插入代码
PE格式是 Windows下最常用的可执行文件格式,理解PE文件格式不仅可以了解操作系统的加载流程,还可以更好的理解操作系统对进程和内存相关的管理知识,而有些技术必须建立在了解PE文件格式的基础上,如文件加密与解密,病毒分析,外挂技术等。
222 0
PE格式:新建节并插入代码
|
存储 安全 小程序
PE格式:手工给程序插入ShellCode
PE格式是 Windows下最常用的可执行文件格式,理解PE文件格式不仅可以了解操作系统的加载流程,还可以更好的理解操作系统对进程和内存相关的管理知识,而有些技术必须建立在了解PE文件格式的基础上,如文件加密与解密,病毒分析,外挂技术等,本次实验的目标是手工修改或增加节区,并给特定可执行程序插入一段ShellCode代码,实现程序运行自动反弹一个Shell会话。
362 0
PE格式:手工给程序插入ShellCode
Win10系统下如何在某个特定的文件夹内输出所有文件路径
Win10系统下如何在某个特定的文件夹内输出所有文件路径
221 0
|
安全 API 索引
PE结构讲解2--导入和导出表
本文为转载文章,整理自小甲鱼老师讲的PE结构课程; 一、导入表的结构 在 PE文件头的 IMAGE_OPTIONAL_HEADER32 结构中的 DataDirectory(数据目录表) 的第二个成员就是指向输入表(导入表)的。
2343 0