BiteFight 简单外挂开发之IE篇

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



在我的机器上我实现的功能主要包括:
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的外挂可以同时运行多个。

 

你可能感兴趣的:(JavaScript,IE,null,firefox,任务,extension)