博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BiteFight 简单外挂开发之IE篇
阅读量:2442 次
发布时间:2019-05-10

本文共 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脚本,可以做的很复杂,自动完成许多任务。

基于IE的BiteFight外挂

在我的机器上我实现的功能主要包括:
1. Work : robbery human->work->robbery->...
  1) robbery human every 10 minutes to max times, or failed, goto 2);
  2) work in tomb for one hour, then goto 1)
2. Protect your Hero : robbery human->robbery hero->work->robbery human->.....
  1) robbery human every 10 minutes to max times, or failed, goto 2);
  2) robbery Hero, or failed, goto 3)
  3) work in tomb for one hour, then goto 1)
3. Training Upgrade : work->robbery human->training->work->....
  1) work in tomb for one hour, then goto 2)
  2) robbery human every 10 minutes to max times, or failed, goto 3)
  3) try to upgrade you skill's level, or failed, goto 1)
由于BiteFight使用cookie保存session, 每次提交form的时候都会提交保存的session,而IE只有一个profile,共用cookie,因此只能保存一个session,所以基于IE的HtmlView实现外挂在同一台PC上只能运行一个,无法同时练多个Hero。而在同一台PC上可以运行多个FireFox,其中每个FireFox使用自己的profile/cookie,所以基于FireFox Extension的外挂可以同时运行多个。

 

你可能感兴趣的文章
使用Opatch工具应用过渡性Patch
查看>>
ORACLE数据类型
查看>>
删除笔记本电脑EISA隐藏分区
查看>>
p3095277_9204_LINUX.zip
查看>>
Redhat Linux版本说明
查看>>
I cannot start the X server 问题的解决
查看>>
cp命令详解_cp命令
查看>>
next. js_如何更改Next.js应用程序端口
查看>>
ls命令输出格式算法_ls命令
查看>>
node util.log_如何解决Node.js中的util.pump不是函数错误
查看>>
cmd查找端口命令_如何查找使用端口的命令
查看>>
gatsby_Gatsby,修复“找不到模块gatsby-cli / lib / reporter”错误
查看>>
rmdir命令
查看>>
如何检测Adblocker是否与JavaScript一起使用
查看>>
如何从JavaScript中的函数返回多个值
查看>>
如何在JavaScript函数中接受无限的参数
查看>>
函数隐式声明警告如何解决_如何解决C语言中的隐式声明库函数警告
查看>>
暂存区和版本库_如何创建网站的暂存版本
查看>>
raspberry pi_如何确保Raspberry Pi始终具有相同的IP地址
查看>>
你知道我有多么喜欢看书吗_我喜欢书
查看>>