如何在R3下用VC修改导出表?(替换自己的函数地址)请贴出代码,急

解决方案 »

  1.   

    用API Hook。需要一个dll,代码太多,我全贴出来也不现实。我这边自己用VS2005写了个用dll来抹掉API的导出表的例子,你不妨看看http://www.brsbox.com/filebox/down/fc/3dcebaa0f3fb26f02c60414639f48c4c
      

  2.   

    这个是劫持系统的MessageBoxA,用自己的MyMessageBox来替换
      

  3.   


    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 预处理
    #include "PoBind.h"
    #include "ApiHook.h"#include <TlHelp32.h>#pragma warning(disable: 4312)
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 成员变量
    HMODULE CApiHook::m_hModule = NULL;
    CApiHook *CApiHook::m_pHead = NULL;CApiHook CApiHook::m_ahLoadLibraryA("Kernel32.dll", "LoadLibraryA", CApiHook::AHLoadLibraryA);
    CApiHook CApiHook::m_ahLoadLibraryW("Kernel32.dll", "LoadLibraryW", CApiHook::AHLoadLibraryW);
    CApiHook CApiHook::m_ahLoadLibraryExA("Kernel32.dll", "LoadLibraryExA", CApiHook::AHLoadLibraryExA);
    CApiHook CApiHook::m_ahLoadLibraryExW("Kernel32.dll", "LoadLibraryExW", CApiHook::AHLoadLibraryExW);
    CApiHook CApiHook::m_ahGetProcAddress("Kernel32.dll", "GetProcAddress", CApiHook::AHGetProcAddress);
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 构造函数
    CApiHook::CApiHook(PCSTR pszModName, PCSTR pszApiName, PVOID pvNew)
    {
    m_pszModName = pszModName;
    m_pszApiName = pszApiName;
    m_pvNew = pvNew;
    m_pvOrg = GetProcAddress(GetModuleHandleA(pszModName), pszApiName); m_pNext = m_pHead;
    m_pHead = this;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 析购函数
    CApiHook::~CApiHook()
    {
    CApiHook *p = m_pHead; 
    if (p == this)
    {
    m_pHead = p->m_pNext;
    }
    else
    {
    for (; p->m_pNext; p = p->m_pNext)
    {
    if (p->m_pNext == this)

    p->m_pNext = m_pNext;
    break;
    }
    }
    }
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 挂接函数
    PVOID CApiHook::Hook(PBYTE pbModule)
    {
    PIMAGE_NT_HEADERS p = (PIMAGE_NT_HEADERS) (pbModule + ((PIMAGE_DOS_HEADER) pbModule)->e_lfanew);
    PIMAGE_IMPORT_DESCRIPTOR q = (PIMAGE_IMPORT_DESCRIPTOR) (pbModule +
    p->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress); for (; q->Name; q++)
    {
    if (strcmpi(m_pszModName, (PCSTR) (pbModule + q->Name)) == 0)
    {
    for (PIMAGE_THUNK_DATA r = (PIMAGE_THUNK_DATA) (pbModule + q->FirstThunk); r->u1.Function; r++)
    {
    if ((FARPROC) r->u1.Function == m_pvOrg)
    {
    WriteProcessMemory(GetCurrentProcess(), &r->u1.Function, &m_pvNew, sizeof(PVOID), NULL);
    return m_pvOrg;
    }
    }
    }
    } return NULL;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 挂接所有函数
    VOID CApiHook::Hook(HMODULE hModule)
    {
    for (CApiHook *p = m_pHead; p; p = p->m_pNext)
    {
    if (p->m_pvOrg)
    {
    p->Hook((PBYTE) hModule);
    }
    }
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 挂接所有模块
    VOID CApiHook::Hook()
    {
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetCurrentProcessId());
    if (hSnap != INVALID_HANDLE_VALUE)
    {
    MODULEENTRY32 meModule = {sizeof(MODULEENTRY32)};
    for (BOOL bResult = Module32First(hSnap, &meModule); bResult; bResult = Module32Next(hSnap, &meModule))
    {
    if (meModule.hModule != m_hModule)
    {
    Hook(meModule.hModule);
    }
    }
    CloseHandle(hSnap);
    }
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 载入
    HMODULE WINAPI CApiHook::AHLoadLibraryA(PCSTR pszPath)
    {
    HMODULE hModule = LoadLibraryA(pszPath);
    if (hModule)
    {
    Hook(hModule);
    }
    return hModule;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 载入
    HMODULE WINAPI CApiHook::AHLoadLibraryW(PCWSTR pwzPath)
    {
    HMODULE hModule = LoadLibraryW(pwzPath);
    if (hModule)
    {
    Hook(hModule);
    }
    return hModule;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 载入
    HMODULE WINAPI CApiHook::AHLoadLibraryExA(PCSTR pszPath, HANDLE hFile, DWORD dwFlags)
    {
    HMODULE hModule = LoadLibraryExA(pszPath, hFile, dwFlags);
    if (hModule && !(dwFlags & LOAD_LIBRARY_AS_DATAFILE))
    {
    Hook(hModule);
    }
    return hModule;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 载入
    HMODULE WINAPI CApiHook::AHLoadLibraryExW(PCWSTR pwzPath, HANDLE hFile, DWORD dwFlags)
    {
    HMODULE hModule = LoadLibraryExW(pwzPath, hFile, dwFlags);
    if (hModule && !(dwFlags & LOAD_LIBRARY_AS_DATAFILE))
    {
    Hook(hModule);
    }
    return hModule;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 获取地址
    EXTERN_C PVOID _ReturnAddress();
    FARPROC WINAPI CApiHook::AHGetProcAddress(HMODULE hModule, PCSTR pszName)
    {
    FARPROC pfn = GetProcAddress(hModule, pszName);
    if (pfn)
    {
    MEMORY_BASIC_INFORMATION m = {0};
    VirtualQuery(_ReturnAddress(), &m, sizeof(MEMORY_BASIC_INFORMATION));
    if (hModule != (HMODULE) m.AllocationBase)
    {
    for (CApiHook *p = m_pHead; p; p = p->m_pNext)
    {
    if (p->m_pvOrg == NULL)
    {
    p->m_pvOrg = GetProcAddress(GetModuleHandleA(p->m_pszModName), p->m_pszApiName);
    } if (pfn == p->m_pvOrg)
    {
    pfn = (FARPROC) p->m_pvNew;
    break;
    }
    }
    }
    } return pfn;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      

  4.   


    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 预处理
    #pragma once
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // CApiHook 类
    class CApiHook
    {
    private:
    PCSTR m_pszModName;
    PCSTR m_pszApiName;
    PVOID m_pvNew;
    PVOID m_pvOrg; CApiHook *m_pNext;
    static CApiHook *m_pHead;public:
    static HMODULE m_hModule;public:
    template <typename T> operator T() {return (T) m_pvOrg;}
    CApiHook(PCSTR pszModName, PCSTR pszApiName, PVOID pvNew);
    ~CApiHook(); public:
    PVOID Hook(PBYTE pbModule);
    static VOID Hook(HMODULE hModule);
    static VOID Hook();

    private:
    static CApiHook m_ahLoadLibraryA;
    static CApiHook m_ahLoadLibraryW;
    static CApiHook m_ahLoadLibraryExA;
    static CApiHook m_ahLoadLibraryExW;
    static CApiHook m_ahGetProcAddress;private:
    static HMODULE WINAPI AHLoadLibraryA(PCSTR pszPath);
    static HMODULE WINAPI AHLoadLibraryW(PCWSTR pwzPath);
    static HMODULE WINAPI AHLoadLibraryExA(PCSTR pszPath, HANDLE hFile, DWORD dwFlags);
    static HMODULE WINAPI AHLoadLibraryExW(PCWSTR pwzPath, HANDLE hFile, DWORD dwFlags);
    static FARPROC WINAPI AHGetProcAddress(HMODULE hModule, PCSTR pszName);
    };
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      

  5.   

    链接:http://www.yonsm.net/read.php?25
    http://www.yonsm.net/read.php?7
    http://www.yonsm.net/read.php?8
      

  6.   

    我想HOOK掉DX中的d3dx9_28.dll文件的D3DXCreateTextW函数,每个文件的导入表均无引用该函数,可能是系统调用,以上方法都测了,都不可以。。请高手指教