dll劫持

首先構建一個正常的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

相關文章
相關標籤/搜索