本文共 3633 字,大约阅读时间需要 12 分钟。
<script type="text/javascript"> </script>
BiteFight 简单外挂开发之IE篇
最近在玩BiteFight(黑暗传说),这是一个简单的休闲性质的网页游戏,模式就是练功、做任务、升级,类似于文字MUD。因为手动练功做任务太麻烦了,而且不能7*24小时进行,于是想做一个外挂。 做的思路有很多,我选择了其中比较简单的两种: 一、基于IE的HtmlView用VC做一个程序,每次刷新页面的时候执行JavaScript任务脚本; 二、做一个FireFox扩展(extension),监听“DOMContentLoaded”事件,执行JavaScript任务脚本。 两种思路我都做了实现,而且运行良好,但是FireFox extension具有一些优势,我将在文章的末尾进行比较。(游戏明确反外挂,所以只提供源码片段和演示程序(适用S1服务器): ) 本篇着重介绍基于IE的HtmlView的关键开发步骤和部分代码: 1. 创建一个基于HtmlView的单文档应用; 2. 增加菜单项,例如:“Robbery Human”,并增加处理函数 void CWebMudView::OnStartRobberyHuman() { m_iCurrentWorkType = ERobberyHuman; // 设置当前的任务类型 CString url; url.LoadString(IDS_STRING_ATTACK_URL); // 从Resource 中读取Robbery Human的页面url // 把任务脚本内容读取到m_strCurrentScript变量中 GetFileContent(GetCurrWorkingDir() + "//RobberyHuman.js", m_strCurrentScript); Navigate2(url, NULL, NULL); } 3. 重载HtmlView的OnDocumentComplete()虚函数 void CWebMudView::OnDocumentComplete(LPCTSTR lpszURL) { CString title; title.Format("[%s] %s", WorkTypeArray[m_iTargetWorkType], lpszURL); gGetMainFrame()->UpdateTitle(title); switch(m_iCurrentWorkType) { .... case ERobberyHuman: m_iCurrentWorkType = EIdle; // 把当前的任务类型置空,防止重入 RunScript(m_strCurrentScript); break; .... } CHtmlView::OnDocumentComplete(lpszURL); } 4. 增加执行JavaScript脚本函数 void CWebMudView::RunScript(CString strCode) { CString strLang("javascript"); // LPDISPATCH pDisp = NULL; IHTMLDocument2 *pHTMLDoc = NULL; IHTMLWindow2 *pHTMLWnd = NULL; try{ if (!(::IsWindow(this->m_hWnd)))//!! must do this, for m_hWnd=0xcccc return; pDisp = this->GetHtmlDocument(); if( pDisp ) { if (SUCCEEDED(pDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pHTMLDoc))) { if(SUCCEEDED(pHTMLDoc->get_parentWindow( &pHTMLWnd ))) { BSTR bstrCode = strCode.AllocSysString(); BSTR bstrLang = strLang.AllocSysString(); VARIANT vRet; vRet.vt = VT_BOOL; BOOL bRet = SUCCEEDED(pHTMLWnd->execScript(bstrCode,bstrLang,&vRet)); // 执行脚本 if (bRet==FALSE && m_bShowScriptResult) { TRACE("/n!!!!!!!!!!!!!!!!Run Script error!!!!!!!!!!!!!!!!!/n"); AfxMessageBox("Run Script error!!"); } SysFreeString(bstrCode); SysFreeString(bstrLang); } } } }catch(...){} try{ if(pHTMLWnd != NULL) pHTMLWnd->Release(); if(pHTMLDoc != NULL) pHTMLDoc->Release(); if(pDisp != NULL) pDisp->Release(); }catch(...){} } 5. 编译生成可执行文件 6. 编写RobberyHuman.js,并保存到可执行文件所在的目录 function robbery() { // 如果当前页面不是robbery页面,则延迟并跳转到robbery页面 if (document.URL.indexOf("robbery.php") == -1) { // alert("Wrong page!!!"); window.setTimeout("window.location.href='http://s2.bitefight.cn/bite/robbery.php';", 5*1000); return; } if (document.forms.length > 0) { // 分析form,提交post请求 if (document.getElementById('mjz')==null) { alert("Robbery human times to max!!"); } else { window.setTimeout("document.forms[0].submit();", 5*1000); } } } robbery(); 7. 运行测试 注:外挂的核心其实是JavaScript脚本,可以做的很复杂,自动完成许多任务。