这一篇是外挂开发的基础。可能对初学者而言听起来很麻烦,其实不然。因为这方面的技术也已很成熟了,源码都是公开的,剩下来就是怎么用了。在多线程环境下,理论上有两种方法实现挂截API,一是Jeffery的修改IAT算法,二是用detours开发包。我建议大家用detours。因为只需要少量几行代码就可实现挂截。以1.5版本为例:
typedef int (WINAPI *PFN_TCP)(SOCKET s,const char FAR *buf,int len,int nflag);
PFN_TCP _send = NULL;
int WINAPI mysend(SOCKET s,const char FAR *buf,int len,int nflag)
{
//your code goes here:
//...
return ((PFN_TCP)_send)(s,buf,len,nflag);
}
这样实现挂截
PBYTE pfn = (PBYTE)GetProcAddress( hwsock32,"send");
_send = (PFN_TCP)DetourFunction(pfn,(PBYTE)mysend);
这样清除挂截
DetourRemove((PBYTE)_send,(PBYTE)mysend);
到这里,如果通过别的什么工具知道send函数的buf里传输的是什么含义后,在mysend中加入你的补丁代码,已经完成核心功能了。恭喜你。
可是,以上代码用什么方法组织起来呢?答案是DLL。写法如下:
extern BOOL SpyInit();
extern BOOL SpyInit();
BOOL APIENTRY DllMain( HANDLE hModule, DWORD r, LPVOID lpReserved )
{
if( r==DLL_PROCESS_ATTACH )
{
return SpyInit();
}
else if( r==DLL_PROCESS_DETACH )
{
SpyExit();
}
return TRUE;
}
其中,SpyInit()就是DetourFunction包装后的样子;
接下来,我们得考虑怎么把以上代码“安装”到目标进程中去。好在算法Jerffrey早就为我们准备好了(见《windows核心编程》),用这个算法写个工具,专门用来装/卸动态库。这样做的好处是,当我们的DLL成功安装到指定进程后,这个工具就可以关掉了。
#include "stdafx.h"
#include "Injectlib.h"