首先构建一个正常的dll 创建动态链接库
// dllmain.cpp : 定义 DLL 应用程序的入口点。 #include "pch.h" #include <stdio.h> BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: puts("init"); case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH:break; case DLL_PROCESS_DETACH:break; break; } return TRUE; }
void test1() { puts("test1"); }
void test2() { puts("test2"); }
写2个函数做测试 编写def 文件
LIBRARY
EXPORTS
test2
test1
让后生成 复制 dll和lib 文件到调用文件位置
接着编写调用这个dll 文件
#pragma comment(lib,"Dll1.lib") void test1(); void test2(); int main() { test1(); test2(); system("pause"); }
可以成功运行 后,编写一个dll 劫持刚刚那个dll 功能 先把他dll 改成old.dll b编一个新的dll1.dll 替换它
// dllmain.cpp : 定义 DLL 应用程序的入口点。 #include "pch.h" #include <stdio.h> void test(); BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: puts("int new"); break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH:break; case DLL_PROCESS_DETACH:break; break; } return TRUE; } typedef void (*fun)(); //函数转发 #pragma comment(linker,"/export:test2=old.test2") void test() { HMODULE hModule=LoadLibrary(L"old.dll"); //获取导出函数地址 fun pfn = (fun)GetProcAddress(hModule, "test1"); printf("%p", pfn); if (pfn!=NULL) { puts("success"); pfn(); } //卸载 FreeLibrary(hModule); }
def 编写
接着在运行exe 看到成功劫持原先函数
如果中间有什么问题 可以在 dll 项目添加调试断点
填写 调用方的exe 地址 就可以f5直接调试运行了