首先構建一個正常的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 文件到調用文件位置spa
接着編寫調用這個dll 文件3d
#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 編寫code
接着在運行exe 看到成功劫持原先函數 blog
若是中間有什麼問題 能夠在 dll 項目添加調試斷點it
填寫 調用方的exe 地址 就能夠f5直接調試運行了io