你Hook过魔兽吗?

a451618645 2009-04-11 10:36:07
魔兽争霸是一款局域网游戏,在我的DLL中我用修改输入节的方法hook了他的send函数,在替换函数中弹出对话框。游戏过程中始终没有弹出对话框,也就是说没有执行我的替换函数,但是用外部工具查看这个DLL确实加载到了魔兽争霸的进程里。我又编写了一个MFC的测试程序,却成功替换了。这是为什么啊?
...全文
179 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
W1nds 2011-05-24
  • 打赏
  • 举报
回复
用手机上的…你hook的是send to,试着 hook下wsock32的send试下
a451618645 2009-04-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bubu8633 的回复:]
把主要的几段程序贴出来看看。
[/Quote]


////////DllMain///////////
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
..........

MessageBox(NULL,"TextOutW","APIHook_Dll ---rivershan",MB_OK);
hmodDll=hModule;
HookAllAPI("Ws2_32.dll",GetProcAddress(GetModuleHandle("Ws2_32.dll"),
"sendto"),(PROC)&mysendto,NULL);
break;
}
//////////HookAllApi//////////
BOOL WINAPI HookAllAPI(LPCTSTR pszCalleeModuleName,PROC pfnOriginApiAddress,
PROC pfnDummyFuncAddress,HMODULE hModCallerModule)
{
if (pszCalleeModuleName == NULL)
{
return FALSE;
}
if (pfnOriginApiAddress == NULL)
{
return FALSE;
}
//如果没传进来要挂钩的模块名称,枚举被挂钩进程的所有引用的模块,
//并对这些模块进行传进来的相应函数名称的查找

if (hModCallerModule == NULL)
{
MEMORY_BASIC_INFORMATION mInfo;
HMODULE hModHookDLL;
HANDLE hSnapshot;
MODULEENTRY32 me = {sizeof(MODULEENTRY32)};
//MODULEENTRY32:描述了一个被指定进程所应用的模块的struct

VirtualQuery(HookOneAPI,&mInfo,sizeof(mInfo));
hModHookDLL=(HMODULE)mInfo.AllocationBase;

hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,0);
BOOL bOk = Module32First(hSnapshot,&me);
while (bOk)
{
//MessageBox(NULL,"TextOutA",me.szExePath,MB_OK);
if (me.hModule != hModHookDLL)
{
hModCallerModule = me.hModule;//赋值

//me.hModule:指向当前被挂钩进程的每一个模块
HookOneAPI(pszCalleeModuleName,pfnOriginApiAddress,
pfnDummyFuncAddress,hModCallerModule);
}
bOk = Module32Next(hSnapshot,&me);
}
return TRUE;
}
//如果传进来了,进行查找
else
{
HookOneAPI(pszCalleeModuleName,pfnOriginApiAddress,
pfnDummyFuncAddress,hModCallerModule);
return TRUE;
}
return FALSE;
}
/////////////HookOneApi/////////////
void WINAPI HookOneAPI(LPCTSTR pszCalleeModuleName,PROC pfnOriginApiAddress,
PROC pfnDummyFuncAddress,HMODULE hModCallerModule)
{
ULONG size;

//获取指向PE文件中的Import中IMAGE_DIRECTORY_DESCRIPTOR数组的指针

PIMAGE_IMPORT_DESCRIPTOR pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)
ImageDirectoryEntryToData(hModCallerModule,TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT,&size);

if (pImportDesc == NULL)
return;

//查找记录,看看有没有我们想要的DLL

for (;pImportDesc->Name;pImportDesc++)
{
LPSTR pszDllName = (LPSTR)((PBYTE)hModCallerModule+pImportDesc->Name);
if (lstrcmpiA(pszDllName,pszCalleeModuleName) == 0)
break;
}

if (pImportDesc->Name == NULL)
{
return;
}

//寻找我们想要的函数

PIMAGE_THUNK_DATA pThunk =
(PIMAGE_THUNK_DATA)((PBYTE)hModCallerModule+pImportDesc->FirstThunk);//IAT
for (;pThunk->u1.Function;pThunk++)
{
//ppfn记录了与IAT表项相应的函数的地址

PROC * ppfn= (PROC *)&pThunk->u1.Function;
if (*ppfn == pfnOriginApiAddress)
{
//如果地址相同,也就是找到了我们想要的函数,进行改写,将其指向我们所定义的函数
WriteProcessMemory(GetCurrentProcess(),ppfn,&(pfnDummyFuncAddress),
sizeof(pfnDummyFuncAddress),NULL);
return;
}
}
}


这是关键部分代码,请帮忙分析一下。
ylywyn136 2009-04-11
  • 打赏
  • 举报
回复
我又编写了一个MFC的测试程序,却成功替换了.
可能是人家不是用的send函数..或者做了特殊处理.很难说..
像一些大型软件的防护远比你自己的 测试小程序强
冷月清晖 2009-04-11
  • 打赏
  • 举报
回复
把主要的几段程序贴出来看看。
a451618645 2009-04-11
  • 打赏
  • 举报
回复
帮个忙啊,各位

15,472

社区成员

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

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