如何在R3下用VC修改导出表?请贴出代码,急

AnyStayIsJk 2009-04-24 03:08:20
如何在R3下用VC修改导出表?(替换自己的函数地址)请贴出代码,急
...全文
67 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
捕鲸叉 2009-05-07
  • 打赏
  • 举报
回复
为什么不用编译器来做呢?研究一下PE格式吧
AnyStayIsJk 2009-04-27
  • 打赏
  • 举报
回复
我想HOOK掉DX中的d3dx9_28.dll文件的D3DXCreateTextW函数,每个文件的导入表均无引用该函数,可能是系统调用,以上方法都测了,都不可以。。。。。请高手指教
stjay 2009-04-26
  • 打赏
  • 举报
回复
修改 导出表 和 导入表 是用不同的方法吧
gyk120 2009-04-26
  • 打赏
  • 举报
回复
参考下看雪吧,那里类似的文章很多
老邓 2009-04-26
  • 打赏
  • 举报
回复



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 预处理
#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);
};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
老邓 2009-04-26
  • 打赏
  • 举报
回复



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 预处理
#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;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
biweilun 2009-04-25
  • 打赏
  • 举报
回复
这个是劫持系统的MessageBoxA,用自己的MyMessageBox来替换
biweilun 2009-04-25
  • 打赏
  • 举报
回复
用API Hook。需要一个dll,代码太多,我全贴出来也不现实。我这边自己用VS2005写了个用dll来抹掉API的导出表的例子,你不妨看看http://www.brsbox.com/filebox/down/fc/3dcebaa0f3fb26f02c60414639f48c4c

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧