提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:少就是多,快就是慢:
静态注入对于小生来说花了很长时间才成功了,最大的坑就是dll版本不对导致一直失败
提示:以下是本篇文章正文内容,下面案例可供参考,小生在win10 64bit成功运行
一、准备阶段
用到的软件:PEview、WinHex、VScode
二、使用步骤
1.编写dll
代码如下(示例):
#include <windows.h>
extern "C" __declspec(dllexport) void SayHello(void){}
// DLL入口点函数
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
MessageBoxA(GetActiveWindow(), "DLL已进入目标进程。", "信息", MB_ICONINFORMATION); //弹出一个模态对话框
return TRUE;
}
打包一下,
g++ -m32 -shared -o hih.dll C:\Users\admin\Desktop\dll_dtudy\hi_dll.cpp
dll准备好后,用到上篇文章的test.exe,下面贴出源代码:
#include <windows.h>
int main(){
MessageBox(NULL, "hello32world", "32", MB_ICONINFORMATION); //弹出一个模态对话框
return 0;
}
忽略打包过程,记住dll是32位的,exe必须是32位
使用peview分析
在WinHex找到该区域地址,复制下来
粘贴到idata段的末尾,如图有大片空白段,物理地址是2780,
保存一下用PEview打开,找到新IID的File Offset地址,查看RVA=6580
用Win Hex更改导入表地址;
user32.dll的起始地址如图,复制下来,粘贴到新的IID(Image Import Directory)地址后面
其中,最前面4个字节是INT的RVA
之后8个字节留空
接着4个字节是dll名字,最后4个字节是要导入的函数,也就是IAT
在线把SayHello(要导出的函数)转为16进制
找一块空地写入字符串,小生找的是新IID的后面(为什么不找新建的区呢,主要是麻烦,鼠标要滑来滑去的)
选择ASCII Hex
SayHello(要导入的函数)的RVA=65E0,它前面的两个空字节是顺号
导入的函数Name的RVA=65D0
接着
在物理地址27A8写入Name的RVA=65D0
在物理地址279C写入INT的RVA=65F0
在物理地址27AC写入IAT的RVA=65F0
65F0指向要导入函数的RVA(SayHello)
简单来说就是RVA指向RVA
INT和IAT的值为什么一样,因为他们的值都是要导入函数(SayHello)的RVA
至此修改完毕,双击运行成功了
结语
勤能补拙,小生失败了上百次才完成"PE添加节"和"PE静态注入"的实验
路漫漫其修远兮,吾将上下而求索