PE格式:新建节并插入DLL
首先老样子,我们先来到PE节表位置处,并仿写一个.hack
的节,该节大小为0x1000
字节,在仿写前我们需要先来计算出.hack
的虚拟偏移与实际偏移,先来查询一下当前节表结构,如下:
接着我们通过公式计算一下.hack的虚拟偏移与实际偏移应该设置为多少,注意内存对齐,如加上2000是因为要遵循内存对齐,公式如下:
- .hack 虚拟偏移:虚拟偏移(.rsrc) + 虚拟大小(.hack) => 0x0001B000 + 0x00001000 + 2000 = 1E000
- .hack 实际偏移:实际偏移(.rsrc) + 实际大小(.rsrc) => 0x00007800 + 0x00002600 = 9E00
经过公式推导我们可得知要仿写.hack
节,虚拟偏移应设置为1E000
实际偏移设置为9E00
节区长度为0x1000
字节,将其填充到绿色位置即可,此外还需要注意节属性必须为E00000E0
可读可写属性,如下图:
使用WinHEX在文件末尾添加填充0字节数据,填充长度为4096
,我们的文件偏移为0x9E00
,并且跳转到0xF0
处将红色的06改为07,并将底部的1e000 + 1000
修正为1F000
此时我们的.hack
节添加完成,其对应的虚拟偏移为0x0001E000
实际偏移为0x00009E00
长度都是0x1000
字节。
接着使用工具找到导入表的位置,如下导入表位置0x00006DE0
长度是0x00000050
我们使用WinHex定位过去,将其拷贝一份,选中右键复制选快
->十六进制复制即可
接着定位到0x9E00
也就是.hack节的开头位置,将其复制到这里来,这里的留白位置就是我们需要添加进来的IID数组暂时为空。
先来把仿写的位置标注上序号,这里为大家具体解释一下原因,以及为什么这样来写。
首先红色位置代表的字段是: 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
由于我们增加了导入表,增加了一个结构,所以要跳转到170
处修正大小30+20=50
,并将导入表地址修正为FOA = 0x9E00
也就是RVA =0x0001E000
最后接触输入表绑定状态,也就是将1B0-1B8
处的内容全部清0即可。
当一切准备就绪以后,我们只需要编写一个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;
}
本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?