• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            聚星亭

            吾笨笨且懶散兮 急須改之而奮進(jìn)
            posts - 74, comments - 166, trackbacks - 0, articles - 0
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            —— besterChen

                   其實(shí)說(shuō)實(shí)話,我寫這類文章有些牽強(qiáng),因?yàn)槲乙彩切率帧倢W(xué)習(xí)這個(gè)技術(shù)所以我所了解的東西實(shí)在是太少,沒(méi)有什么太多的東西分享給大家,只希望寫這點(diǎn)東西能幫助到那些跟我一樣或者比我還菜的新手朋友。

             

                   做外掛,貌似是很多高手所不齒的一個(gè)偏行,但似乎又是在現(xiàn)在這個(gè)游戲橫行年代中很流行的技術(shù)話題,但若是我們仔細(xì)探究其根源:做外掛似乎也沒(méi)什么太高的技術(shù)含量,說(shuō)到底就是編程。

             

                   今天,就由我來(lái)帶領(lǐng)大家了解一下做外掛這個(gè)“技術(shù)”的方方面面吧。

            一、        引子

            由于我在外掛方面也是一個(gè)剛?cè)腴T的新人,這里所講的也僅僅是我所接觸層面上的一些知識(shí),肯定是不全面的,因此,我在這里就盡量把我所了解到的知識(shí)講的盡可能詳細(xì),以彌補(bǔ)我知識(shí)面上的欠缺,希望大家能夠諒解,也希望大家莫要笑話我……

             

            本文,我將從基礎(chǔ)的數(shù)據(jù)分析開始著手,到程序?qū)崿F(xiàn),再到過(guò)保護(hù),再到節(jié)省系統(tǒng)資源等,以這樣層層遞進(jìn)的方式來(lái)講述我要展現(xiàn)給大家的東西。

             

            在每個(gè)知識(shí)點(diǎn)講解的時(shí)候,我會(huì)盡量的分好每一個(gè)小節(jié),爭(zhēng)取讓它更有條理,希望這樣講述大家能夠接受也希望大家在技術(shù)上有所突破。

             

            在正式開始我們的旅程之前,希望大家能夠提前了解下如下一些知識(shí):

            1、    OD的使用方法。

            2、    了解些內(nèi)存搜索工具的用法。

            3、    掌握些基礎(chǔ)的編程思想

             

            希望大家在思考所有問(wèn)題的時(shí)侯,都能從編程的角度去考慮,因?yàn)檫@樣就可以有更多的思路、更多的分析方法,更多的技巧,這些是那些不懂編程的朋友永遠(yuǎn)得不到的強(qiáng)處。

            二、        關(guān)于數(shù)據(jù)分析

            在網(wǎng)上,尤其像廣海,斷點(diǎn)這樣的外掛論壇,上面有很多關(guān)于數(shù)據(jù)分析的教程,其中很多文章講的就是用搜索工具查找數(shù)據(jù)指針,而且似乎很多人都不厭其煩的在講,在寫,在討論,但是當(dāng)我仔細(xì)去問(wèn)究為什么的時(shí)候,似乎沒(méi)幾個(gè)人能給一個(gè)令我滿意的答案。

             

            相信看這個(gè)文章的讀者肯定看過(guò)很多像我剛才說(shuō)的那樣的文章了,我也相信很多的朋友都會(huì)也知道為什么用搜索工具搜數(shù)據(jù)指針。當(dāng)然也有很多的朋友不知道的,這里我就從最基礎(chǔ)的開始說(shuō)。

            1、基礎(chǔ)屬性數(shù)據(jù)的分析

            A.        需求分析

            當(dāng)我們?cè)谧鰭斓臅r(shí)候,我們需要根據(jù)角色的血量,魔法量的多少來(lái)吃藥,以保證角色不死掉來(lái)提高掛機(jī)的效率。在掛機(jī)的時(shí)候,怕角色亂跑,所以我們需要根據(jù)坐標(biāo)來(lái)定一個(gè)掛機(jī)范圍,因此,我們需要分析角色的基礎(chǔ)屬性。

             

            B.        起始思路

            找基礎(chǔ)屬性,有這么幾個(gè)方法,思路是這樣的:

                                                               i.              想很多教程中寫的,根據(jù)血量、等級(jí)、經(jīng)驗(yàn)、攻擊等任何一個(gè)屬性值的變化,來(lái)搜索變化的值,然后用CE找數(shù)據(jù)指針。

                                                              ii.              從編程角度來(lái)考慮,任何一個(gè)在屏幕上顯示的數(shù)據(jù)都是字符,游戲中顯示的屬性信息都是字符,比如血量在游戲的數(shù)據(jù)結(jié)構(gòu)中應(yīng)該是整型數(shù)據(jù),在顯示到屏幕上需要進(jìn)行類型轉(zhuǎn)換,調(diào)用類似sprintf這樣的函數(shù),比如:

            004E8E01  |.  8B86 B0020000 mov     eax, dword ptr [esi+0x2B0]  ; 取出當(dāng)前血量

            004E8E07  |.  8B8E 78020000 mov     ecx, dword ptr [esi+0x278]  ; 取出最大血量

            004E8E0D  |.  50                    push    eax

            004E8E0E  |.  51                    push    ecx

            004E8E0F  |.  8D5424 58             lea     edx, dword ptr [esp+0x58]

            004E8E13  |.  68 88BE9C00           push    009CBE88       ;  UNICODE "%d / %d"

            004E8E18  |.  52                    push    edx

            004E8E19  |.  FFD5                  call    ebp         ; sprintf函數(shù)

            這樣,我們就可以通過(guò)在OD中搜索相應(yīng)的字符串來(lái)定位到如上這樣的代碼,在仔細(xì)分析ESI的來(lái)歷,這樣我們就可以得到相應(yīng)數(shù)據(jù)結(jié)構(gòu)的指針。

             

            C.       調(diào)試過(guò)程

            這里我舉一個(gè)例子,就像我前些日子分析的口袋西游。

            內(nèi)存搜索,找力量值,得到結(jié)果如下:

            106CC99C      6

             

            內(nèi)存訪問(wèn)斷點(diǎn),來(lái)到如下代碼:

             

            004E8F01  |.  8B86 18030000 mov     eax, dword ptr [esi+0x318]       ;  最大力量

            004E8F07  |.  8B8E 14030000 mov     ecx, dword ptr [esi+0x314]       ;  最小力量

            004E8F0D  |.  50            push    eax

            004E8F0E  |.  51            push    ecx

            004E8F0F  |.  8D5424 58     lea     edx, dword ptr [esp+0x58]

            004E8F13  |.  68 24969C00   push    009C9624                ;  UNICODE "%d-%d"

            004E8F18  |.  52            push    edx

            004E8F19  |.  FFD5          call    ebp                              ;  顯示出來(lái)

             

            這些代碼由此向下,有很多的數(shù)據(jù)都是這個(gè)結(jié)構(gòu)體的成員,具體的含義大家可以跟一下,對(duì)比游戲中顯示的數(shù)據(jù)猜出其具體含義。

             

            004E8B19  |.  E8 3249FEFF   call    004CD450

            {

                   004CD450  /$  A1 4C28A200   mov     eax, dword ptr [0xA2284C]

                   004CD455  |.  8B48 1C       mov     ecx, dword ptr [eax+0x1C]

                   004CD458  |.  8B41 28       mov     eax, dword ptr [ecx+0x28]

                   004CD45B  \.  C3            retn

            }

            004E8B1E  |.  8BF0          mov     esi, eax

            下面總結(jié)一下:

            0xA2284C]+0x1C]+0x28]

                   +3C X

                   +40  Z

                   +44  Y

                   +264   角色ID

                   +26C   角色職業(yè)       1:靈劍,2:日羽,3:槍俠,4:薩滿,5:法皇,6:藥王

                   +270   角色等級(jí)

                   +278   當(dāng)前血量

                   +27C   當(dāng)前魔法

                   +280   當(dāng)前異能

                   +284   當(dāng)前精力

             

                   +2B0   最大血量

                   +2B4   最大魔法

                   +2B8   最大異能

                   +2BC   最大精力

             

                   +348   背包金錢

                   +434   名字

                   +704   移動(dòng)速度

                   +8F4   選擇的目標(biāo)ID

            這樣我們的角色基礎(chǔ)屬性就算是分析完成了,可以根據(jù)編程需要將它整理成對(duì)應(yīng)的結(jié)構(gòu)體。比如:

            // 個(gè)人屬性信息結(jié)構(gòu)

            typedef struct _GAME_CHAR_INFO

            {

                 DWORD         UnKnown1[15];          //   未知 offset   0

                 float         fX;                    //   X坐標(biāo)    offset   0x3C

                 float         fZ;                    //   Z坐標(biāo)    offset   0x40

                 float         fY;                    //   Y坐標(biāo)    offset   0x44

                 DWORD         UnKnown2[135];         //   未知 offset   0x48

                 DWORD         dwSID;                 //   角色ID   offset   0x264

                 DWORD         UnKnown3;              //   未知 offset   0x268

                 DWORD         dwZhiYe; //   職業(yè) offset 0x26C 1:靈劍,2:日羽,3:槍俠,4:薩滿,5:法皇,6:藥王

                 DWORD         dwLv;                       //   等級(jí) offset   0x270

                 DWORD         UnKnown4;              //   未知 offset   0x274

                 DWORD         dwCurHP;               //   當(dāng)前HP   offset   0x278

                 DWORD         dwCurMP;               //   當(dāng)前MP   offset   0x27C

                 DWORD         dwCurYN;               //當(dāng)前異能    offset   0x280

                 DWORD         dwCurJL;               //當(dāng)前精力    offset   0x284

                 DWORD         UnKnown5[10];          //   未知 offset   0x28C

                 DWORD         dwMaxHP;               //   最大HP   offset   0x2B0

                 DWORD         dwMaxMP;               //   最大MP   offset   0x2B4

                 DWORD         dwMaxYN;               //最大異能    offset   0x2B8

                 DWORD         dwMaxJL;               //最大精力    offset   0x2BC

                 DWORD         UnKnown6[34];          //   未知 offset   0x2C0

                 DWORD         dwMoney;               //   金錢 offset   0x348

                 DWORD         UnKnown7[58];          //   未知 offset   0x34C

                 wchar_t* strName;               //人物名稱    offset   0x434

                 DWORD         UnKnown8[0x12F];       //   未知 offset   0x438

                 DWORD         dwTSID;                //   目標(biāo)實(shí)例offset     0x8F4

                 DWORD         UnKnown9[0x2B];        //   未知 offset   0x8F8

                 PGAME_BAG_FIRST    pGBF;              // 背包結(jié)構(gòu)指針offset 0x9A4

                 PGAME_BAG_FIRST    pGBF;              // 裝備結(jié)構(gòu)指針offset 0x9A8

                 DWORD         UnKnown10[0x28];       // 未知       offset 0x9AC

                 PGAME_SKILL_LIST pGSL;               // 技能列表   offset 0xA4C

                 DWORD         nCurSkillNum;          // 當(dāng)前技能數(shù)量offset 0xA50(基礎(chǔ)是x17,學(xué)一個(gè)技能加)

                 DWORD         nMaxSkillNum;          // 最大技能數(shù)量offset 0xA54

            } GAME_CHAR_INFO, *PGAME_CHAR_INFO;

            到這里,無(wú)論是從分析的角度還是從編程的角度,這個(gè)數(shù)據(jù)的分析就算是完工了。下面我們來(lái)看一下怎么用代碼來(lái)操作這些數(shù)據(jù)。

             

            D.       代碼實(shí)現(xiàn)

            關(guān)于讀取內(nèi)存的代碼幾乎不同的人都有不同的寫法,當(dāng)然各有利弊,我這里寫我比較習(xí)慣的方法吧。

            關(guān)于定位數(shù)據(jù)結(jié)構(gòu)的首地址:

            /************************************************************************/

            /* 獲取人物信息指針                                                    */

            /* [g_dwBasePointAddr]+0x1C]+0x28]                                      */

            /************************************************************************/

            __declspec(naked) PGAME_CHAR_INFO WINAPI GetCharInfoPoint()

            {

                 __asm

                 {

                     mov      eax, dword ptr [g_dwBasePointAddr]

                     test      eax, eax

                     je       NULL_POINT

                     mov      eax, dword ptr [eax]

                     test      eax, eax

                     je       NULL_POINT

                     mov      eax, dword ptr [eax+0x1C]

                     test      eax, eax

                     je       NULL_POINT

                     mov      eax, dword ptr [eax+0x28]

            NULL_POINT:

                     retn

                 }

            }

             

            這樣,只要我們調(diào)用這個(gè)函數(shù)就可以定位到PGAME_CHAR_INFO結(jié)構(gòu),關(guān)于這個(gè)結(jié)構(gòu)的定義和分析參考本數(shù)據(jù)的分析部分。

                                 具體的使用,我給出我的MFC的顯示函數(shù):

            /************************************************************************/

            /* 功能:顯示人物信息                                                   */

            /* 參數(shù):無(wú)                                                             */

            /* 返回:無(wú)                                                             */

            /************************************************************************/

            void CFirstTask::ShowRoleInfo()

            {

                 wchar_t            szTemp[512] = {0};

                 PGAME_CHAR_INFO pGCI = GetCharInfoPoint();

             

                 SetDlgItemTextW(IDC_MYNAME,pGCI->strName);

             

                 switch (pGCI->dwZhiYe)

                 {

                 case 1:

                     lstrcpyW(szTemp, L"靈劍\0");

                     break;

                 case 2:

                     lstrcpyW(szTemp, L"日羽\0");

                     break;

                 case 3:

                     lstrcpyW(szTemp, L"槍俠\0");

                     break;

                 case 4:

                     lstrcpyW(szTemp, L"薩滿\0");

                     break;

                 case 5:

                     lstrcpyW(szTemp, L"法皇\0");

                     break;

                 case 6:

                     lstrcpyW(szTemp, L"藥王\0");

                     break;

                 default:

                     lstrcpyW(szTemp, L"未知\0");

                     break;

                 }

             

                 SetDlgItemTextW(IDC_MYZHIYE, szTemp);

             

                 wsprintfW(szTemp, L"%d/%d", pGCI->dwCurHP,pGCI->dwMaxHP);

                 SetDlgItemTextW(IDC_MYHP, szTemp);

             

                 wsprintfW(szTemp, L"%d/%d", pGCI->dwCurMP,pGCI->dwMaxMP);

                 SetDlgItemTextW(IDC_MYMP, szTemp);

             

                 wsprintfW(szTemp, L"%d/%d", pGCI->dwCurYN,pGCI->dwMaxYN);

                 SetDlgItemTextW(IDC_MYYN, szTemp);

             

                 wsprintfW(szTemp, L"%d/%d", pGCI->dwCurJL,pGCI->dwMaxJL);

                 SetDlgItemTextW(IDC_MYJL, szTemp);

             

             

                 swprintf(szTemp, L"%.0f,%.0f,%.0f", pGCI->fX, pGCI->fY, pGCI->fZ);

                 SetDlgItemTextW(IDC_MYXYZ, szTemp);

             

                 wsprintfW(szTemp, _T("%d%d%d"),

                     pGCI->dwMoney / 10000, (pGCI->dwMoney % 10000) / 100, (pGCI->dwMoney % 10000) % 100);

             

                 SetDlgItemTextW(IDC_MYMONEY, szTemp);

             

                 wsprintfW(szTemp, L"%d", pGCI->dwLv);

                 SetDlgItemTextW(IDC_MYLEVEL, szTemp);

            }

                                 貼一下顯示的效果:
                        

            Feedback

            # re: 淺析游戲輔助工具的開發(fā)(一)  回復(fù)  更多評(píng)論   

            2009-12-06 23:58 by besterChen
            由于學(xué)校規(guī)定在校期間不得參與外掛、破解黑客攻擊等行為,所以,這個(gè)系列暫停,等我畢業(yè)不全它~

            # re: 淺析游戲輔助工具的開發(fā)(一)  回復(fù)  更多評(píng)論   

            2010-07-22 10:32 by 碧空翔
            謝謝~~期待后續(xù)!

            # re: 淺析游戲輔助工具的開發(fā)(一)  回復(fù)  更多評(píng)論   

            2010-07-30 05:27 by hoodlum1980
            請(qǐng)問(wèn)lz使用的反匯編工具是什么,除了IDA還有什么工具輔助你呢?

            # re: 淺析游戲輔助工具的開發(fā)(一)[未登錄](méi)  回復(fù)  更多評(píng)論   

            2010-07-30 18:02 by besterChen
            @hoodlum1980
            一般用調(diào)試器比較多,需要具體看代碼了才搬IDA出來(lái)的~

            # re: 淺析游戲輔助工具的開發(fā)(一)  回復(fù)  更多評(píng)論   

            2010-07-31 02:46 by hoodlum1980
            @besterChen
            期待lz能把做外掛那部分文章繼續(xù)寫完~~。~

            # re: 淺析游戲輔助工具的開發(fā)(一)[未登錄](méi)  回復(fù)  更多評(píng)論   

            2010-08-01 22:12 by besterChen
            @hoodlum1980

            會(huì)的~,不過(guò)得等我畢業(yè)以后~
            (*^__^*) 嘻嘻……

            # re: 淺析游戲輔助工具的開發(fā)(一)  回復(fù)  更多評(píng)論   

            2010-11-02 18:03 by mifei
            我有個(gè)問(wèn)題,描述如下,只是脫殼的部分,不曉得博主有時(shí)間幫忙看下,謝謝了~~~
            http://bbs.pediy.com/showthread.php?p=882000
            久久精品国产一区二区三区| 久久久这里有精品| 蜜桃麻豆www久久| 国产精品内射久久久久欢欢| 国产精品va久久久久久久| 久久精品国产精品亚洲人人| 热综合一本伊人久久精品| 久久久久久免费视频| 日本人妻丰满熟妇久久久久久| 日产精品久久久久久久性色| 99久久综合狠狠综合久久止| 91久久精品国产成人久久| 久久免费视频6| 久久精品成人欧美大片| 99久久精品影院老鸭窝| 久久99国产精品成人欧美| 久久久久久精品久久久久| 国产精品久久久福利| 日本精品久久久久久久久免费| 国产色综合久久无码有码| 精品国产福利久久久| 亚洲国产小视频精品久久久三级 | 色综合久久久久网| 久久亚洲国产精品五月天婷| 色妞色综合久久夜夜| 精品无码人妻久久久久久| 精品多毛少妇人妻AV免费久久| 精品国产一区二区三区久久久狼| 久久久青草青青国产亚洲免观| 午夜精品久久久久久久| 99久久99久久精品国产片| 偷窥少妇久久久久久久久| 久久青草国产精品一区| 久久亚洲国产精品成人AV秋霞| 久久青草国产精品一区| 狠狠色婷婷久久综合频道日韩| 久久久久中文字幕| 精品综合久久久久久98| 久久久久亚洲AV无码专区桃色 | 国产精品毛片久久久久久久| 亚洲国产日韩综合久久精品|