DLL劫持

原理

  1. 用我们自己的DLL替换原版DLL(原始DLL可以改名)
  2. 劫持我们需要操作的函数
  3. 其他函数原样转发回原始DLL
  4. 注意名称粉碎

注意点

  1. #pragma comment(linker,*) 和def都可以劫持转发
  2. comment linker功能更加丰富,但是相对于def文件使用规范比较多
  3. def 文件注释是;

def

  1. 在程序中我们正常书写函数(不需要 extern "C")
  2. 在def文件中我们直接用函数名称就可以导出函数,不需要处理名称粉碎
  3. 函数转发只能转发到本DLL

comment_linker

  1. 可以将函数转发到 任意目录的DLL上(def文件做不到)
  2. 劫持某个函数到 本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")

建议的处理方式

  1. 函数转发使用 comment_linker完成
  2. 劫持到本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;

}



Last modification:October 26, 2018
如果觉得我的文章对你有用,请随意赞赏