DLL劫持
原理
- 用我们自己的DLL替换原版DLL(原始DLL可以改名)
- 劫持我们需要操作的函数
- 其他函数原样转发回原始DLL
- 注意名称粉碎
注意点
#pragma comment(linker,*)
和def都可以劫持转发comment linker
功能更加丰富,但是相对于def
文件使用规范比较多- def 文件注释是
;
def
- 在程序中我们正常书写函数(不需要 extern "C")
- 在def文件中我们直接用函数名称就可以导出函数,不需要处理名称粉碎
- 函数转发只能转发到本DLL
comment_linker
- 可以将函数转发到 任意目录的DLL上(def文件做不到)
- 劫持某个函数到 本DLL的函数上时需要名称粉碎后的函数名
def 方式劫持
//def文件
LIBRARY
EXPORTS
//我们劫持f_name函数到本DLL的函数my_hack上
f_name=my_hack
//cpp文件
//劫持到这里
int my_hack(int a, int b) {
return 100;
}
comment_linker 劫持
//我们使用 C标准 处理函数名称
extern "C" {
//由于没有使用def文件,我们需要自己声明 dllexport
__declspec(dllexport) int my_hack(int a, int b) {
return 100;
}
}
//注意额,这里绑定的名称是 _my_hack ,要的是粉碎后的函数名称
#pragma comment(linker, "/EXPORT:f_name=_my_hack")
建议的处理方式
- 函数转发使用 comment_linker完成
- 劫持到本DLL的函数用def文件处理
混合劫持案例
//def文件
LIBRARY
EXPORTS
;方案2:替换原DLL的函数
;f_name=my_hack
;方案3:替换原DLL的函数,处理后 转发到原DLL函数
;f_name=my_hack_to_src
//cpp文件
#include "pch.h"
#include <iostream>
#include <windows.h>
//方案1:直接转发给原始DLL
//注意这里的寻址路径是当前exe的目录,不是当前本DLL的目录
#pragma comment(linker, "/EXPORT:f_name2=../../create_dll_normall.f_name")
//方案2:替换原DLL的函数
int my_hack(int a, int b) {
return 100;
}
//方案3:替换原DLL的函数,处理后 转发到原DLL函数
int my_hack_to_src(int a, int b) {
typedef int(*my_dll_export_fucation)(int, int);
int res=0;
//加载dll到内存中
//注意这里的寻址路径是当前exe的目录,不是当前本DLL的目录
HMODULE hSuper = LoadLibraryA("../../create_dll_normall.dll");
//准备函数指针
my_dll_export_fucation p_fx = NULL;
//获取函数指针
p_fx = (my_dll_export_fucation)GetProcAddress(hSuper, "f_name");
//获取执行结果
res=p_fx(2, 2)
//释放内存
freeResult = FreeLibrary(hSuper);
return res;
}