协议型网络游戏外挂制作之APIHOOK.docx
- 文档编号:235133
- 上传时间:2022-10-07
- 格式:DOCX
- 页数:7
- 大小:14.45KB
协议型网络游戏外挂制作之APIHOOK.docx
《协议型网络游戏外挂制作之APIHOOK.docx》由会员分享,可在线阅读,更多相关《协议型网络游戏外挂制作之APIHOOK.docx(7页珍藏版)》请在冰豆网上搜索。
协议型网络游戏外挂制作之APIHOOK
上一节中我们说了外挂平台的搭建,我们做完了Hook.dll和wg.exe,但如何让wg.exe调用Hook.dll中的函数,可以自己查看CB的教程或者到网上查查。
在这里我是在wg.exe的Hook按钮事件中添加了下面的语句来实现:
if(gamethreadid)
{
if(EnableHook(gamethreadid)==false)
ShowMessage("error");
}
你可以点击Hook按钮在游戏界面出来之后,然后在游戏界面中按F12键调出外挂的窗口。
昨天的尾巴完事之后,开始今天的教程。
今天我想说说APIHOOK。
虽然APIHOOK在大话游戏的外挂制作中不是必须的,但为了按照一般的制作流程顺序,就先将这部分加入到里面去了。
使用APIHOOK的原因也很简单,游戏肯定要调用某些系统函数,使用APIHOOK可以简单的查看一些关键的信息并进行修改(就这么简单的理由?
是的,我们一向再用杀牛的刀宰鸡的。
。
。
)。
JeffreyRichter用了大量的篇幅来讲如何插入DLL和挂接API,如果你不知道JeffreyRichter是谁的话,总该知道《Windows核心编程》的作者吧,如果不知道,我倒,系统抛出例外,你是外星人吧。
我们的程序运行在用户层上,J。
R提出了两种办法,一种是改写代码,我刚开始也试图用这种办法,后来发现这种办法确实存在的漏洞多多,和J。
R说的一样。
最后还是采用操作模块的输入节了。
在查看资料的过程中,我发现J。
R的代码在中文Windows2000上并不能运行(难道是外国人用的系统和中国的不一样?
),后来只好J。
R的思路,重新安排了一下函数,但大部分函数都一样的。
为了方便,我没有在类中捕获LoadLibraryA、LoadLibraryW、LoadLibraryExA和LoadLibraryExW,也是因为我们的外挂程序运行的时候游戏的窗口已经出来了,该加载的一般都加载了。
下面是我的APIHOOK类的源代码,该源代码是根据J.R的思路重新整理他的源代码来的:
/*HookAPI.h*/
#include"windows.h"
classCAPIHOOK
{
public:
CAPIHOOK(PSTRpszCalleeModName,PSTRpszFuncName,PROCpfnHook,HANDLEprochandle,HMODULEhmod);
~CAPIHOOK();
operatorPROC(){return(m_pfnOrig);};
public:
staticPVOIDsm_pvMaxAppAddr;
staticCAPIHOOK*sm_pHead;
CAPIHOOK*m_pNext;
PCSTRm_pszCalleeModName;
PCSTRm_pszFuncName;
PROCm_pfnOrig;
PROCm_pfnHook;
BOOLm_fExcludeAPIHookMod;
HMODULEm_module;
HANDLEm_handle;
private:
pfnOrig,PROCpfnHook,BOOLfExcludeAPIHookMod);
voidWINAPIReplaceIATEntryInOneMod(PCSTRpszCalleeModName,PROCpfnOrig,PROCpfnHook,HMODULEhmodcaller,HANDLEhandle);
voidWINAPIFixupNewlyLoadedModule(HMODULEhmod,DWORDdwFlags);
FARPROCWINAPIGetProcAddress(HMODULEhmod,PCSTRpszProcName);
};
/*HookApi.cpp*/
#include"hookapi.h"
#include
#include"imagehlp.h"
PVOIDCAPIHOOK:
:
sm_pvMaxAppAddr=NULL;
constBYTEcPushOpCode=0x68;
CAPIHOOK*CAPIHOOK:
:
sm_pHead=NULL;
CAPIHOOK:
:
CAPIHOOK(PSTRpszCalleeModName,PSTRpszFuncName,PROCpfnHook,
HANDLEprochandle,HMODULEhmod)
{
m_handle=prochandle;
if(sm_pvMaxAppAddr==NULL)
{
SYSTEM_INFOsi;
GetSystemInfo(&si);
sm_pvMaxAppAddr=si.lpMaximumApplicationAddress;
}
m_pNext=sm_pHead;
sm_pHead=this;
m_pszCalleeModName=pszCalleeModName;
m_pszFuncName=pszFuncName;
m_pfnHook=pfnHook;
m_pfnOrig=:
:
GetProcAddress(GetModuleHandleA(pszCalleeModName),m_pszFuncName);
assert(m_pfnOrig!
=NULL);
if(m_pfnOrig==NULL)
{
return;
}
if(m_pfnOrig>sm_pvMaxAppAddr)
{
PBYTEpb=(PBYTE)m_pfnOrig;
if(pb[0]==cPushOpCode)
{
PVOIDpv=*(PVOID*)&pb[1];
m_pfnOrig=(PROC)pv;
}
}
m_module=GetModuleHandle(pszCalleeModName);
ReplaceIATEntryInOneMod(m_pszCalleeModName,m_pfnOrig,m_pfnHook,m_module,prochandle);
}
CAPIHOOK:
:
~CAPIHOOK()
{
ReplaceIATEntryInOneMod(m_pszCalleeModName,m_pfnHook,m_pfnOrig,m_module,m_handle);
CAPIHOOK*p=sm_pHead;
if(p==this)
{
sm_pHead=p->m_pNext;
}
else
{
BOOLfFound=FALSE;
for(;!
fFound&&(p->m_pNext!
=NULL);p=p->m_pNext)
{
if(p->m_pNext==this)
{
p->m_pNext=p->m_pNext->m_pNext;
break;
}
}
assert(fFound);
}
}
voidWINAPICAPIHOOK:
:
FixupNewlyLoadedModule(HMODULEhmod,DWORDdwFlags)
{
if((hmod!
=NULL)&&((dwFlags&LOAD_LIBRARY_AS_DATAFILE)==0))
{
for(CAPIHOOK*p=sm_pHead;p!
=NULL;p=p->m_pNext)
{
ReplaceIATEntryInOneMod(p->m_pszCalleeModName,p->m_pfnOrig,p->m_pfnHook,hmod,m_handle);
}
}
}
FARPROCWINAPICAPIHOOK:
:
GetProcAddress(HMODULEhmod,PCSTRpszProcName)
{
FARPROCpfn=:
:
GetProcAddress(hmod,pszProcName);
CAPIHOOK*p=sm_pHead;
for(;(pfn!
=NULL)&&(p!
=NULL);p=p->m_pNext)
{
if(pfn==p->m_pfnOrig)
{
pfn=p->m_pfnHook;
break;
}
}
return(pfn);
}
voidWINAPICAPIHOOK:
:
ReplaceIATEntryInOneMod(PCSTRpszCalleeModName,PROC
pfnCurrent,PROCpfnHook,HMODULEhmodcaller,HANDLEhandle)
{
ULONGulSize;
PIMAGE_IMPORT_DESCRIPTORpImportDesc=(PIMAGE_IMPORT_DESCRIPTOR)
ImageDirectoryEntryToData(hmodcaller,TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT,&ulSize);
if(pImportDesc==NULL)
{
return;
}
for(;pImportDesc->Name;pImportDesc++)
{
PSTRpszModName=(PSTR)((PBYTE)hmodcaller+pImportDesc->Name);
if(lstrcmpiA(pszModName,pszCalleeModName)==0)
{
break;
}
}
if(pImportDesc->Name==0)
{
return;
}
PIMAGE_THUNK_DATApThunk=(PIMAGE_THUNK_DATA)((PBYTE)hmodcaller+
pImportDesc->FirstThunk);
for(;pThunk->u1.Function;pThunk++)
{
PROC*ppfn=(PROC*)&pThunk->u1.Function;
BOOLfFound=(*ppfn==pfnCurrent);
if(!
fFound&&(*ppfn>sm_pvMaxAppAddr))
{
PBYTEpbInFunc=(PBYTE)*ppfn;
if(pbInFunc[0]==cPushOpCode)
{
ppfn=(PROC*)&pbInFunc[1];
fFound=(*ppfn==pfnCurrent);
}
}
if(fFound)
{
HANDLEhandle1=OpenProcess(PROCESS_ALL_ACCESS,FALSE,
GetCurrentProcessId())
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 协议 网络游戏 外挂 制作 APIHOOK