我们的目标就是数据包,即拦截游戏通讯间的数据来进行相应的修改或者进行发送伪数据包。我大概定了一个计划,不过这一节肯定不能全部讲完,我只能在下班之后写上一点,时间有限,能写多少就写多少吧。
目标程序:大话西游II客户端。(你手上有服务器端吗?有的话我也想要)
目标:数据包
目的:数据包拦截,修改,伪发送
编程软件:这个无所谓吧,不过我这里用的是C Builder 6,前段时间做CB 6相关的项目,而且CB 对于程序界面的编写是最方便不过的了,就是编译的有点慢和生成的程序有点大。(旁白:又不是做手机项目,担心容量吗?)我做受限程序做惯了,养成了不良习惯,没办法了。
思路:我们的程序要干扰别的程序的运行,最好的办法是使用debug的办法,不过,我并没有打算使用debug的办法,我对程序的debug并不太熟悉,而且讨厌编写没用的代码。我准备采用线程注入的办法,至于线程注入,和为什么要线程注入才能干预,这方面的知识最好自己看看《Windows 核心编程》里面讲的,否则这个教程要没完没了了。当我们的线程注入到目标程序之后就方便多了,就可以为所欲为了。因此我们的第一目的是将线程注入到目标程序中。
预备活动:
线程注入最简单的莫过于hook了,如果连这都不知道的话,最好赶快到网上查查或者翻翻《Windows核心编程》。为了防止游戏内部存在反hook的存在和外挂的检测,我将用自己的程序来启动目标程序。由于网游的不定期更新,因此在启动程序的时候最好将升级跳过去,至少在大话这样的程序中我是这样做的,因为频繁升级和版本检测总让我等的时间太长。
下面来进行具体的做法,我尽可能的弄出详细的步骤,如果你用的是VC或者其它的话,只要注意核心的代码就可以了。
新建一个工程,在窗体上添加两个按钮(TButton或者其它类型的按钮),一个将标题改为启动游戏,另一个标题改为启动外挂。再添加一个TOpenDialog。对于默认的窗体那么大的界面有点浪费,因此将窗体弄得小点,别大大的怪吓人的。
双点启动游戏的按钮就可以进行编写该按钮的事件了,默认的是OnClick事件。下面就是事件的代码:
if(FileExists(ExtractFileDir(Application->ExeName) "\path.ini")==FALSE)
{ /*我将目标程序的路径保存到了当前程序目录中的path.ini文件中,但如果当前程序第一次运行的话,是不存在这个文件的,所以就可以用TOpdnDialog来打开了,做这点只是为了方便,不用每次都得点目标程序*/
if(OpenFile->Execute())
{
AnsiString AppPath="path=" ExtractFilePath(OpenFile->FileName);
WritePrivateProfileSection("XY2PATH",AppPath.c_str(),(ExtractFileDir(Application->ExeName)
"\path.ini").c_str());//将目标程序的路径存到path.ini文件中。
}
else
{
return;
}
}
//下面的代码开始启动目标程序
PROCESS_INFORMATION pi;
STARTUPINFO si;
si.cb=sizeof(si);
si.lpReserved=NULL;
si.lpDesktop=NULL;
si.lpTitle=NULL;
si.cbReserved2=0;
si.lpReserved2=NULL;
si.dwFlags=STARTF_USEPOSITION;
si.dwX=0;
si.dwY=0;
char Appname[300];
GetPrivateProfileString("XY2PATH","path","",Appname,250,(ExtractFileDir(Application->ExeName)
"\path.ini").c_str());
strcat(Appname,"\xy2.exe");
/*以上都在构建目标程序的环境设置,下面调用CreateProcess来启动目标程序,
注意将倒数第3个参数要填为目标程序的路径,
第6个参数为CREATE_SUS