遊戲外掛內存數據讀取

源地址:http://hi.baidu.com/probill/blog/item/1d07d11efbd641f01ad576f3.html

網絡遊戲.每個數據好比你的血值.MP 值.怪的血值..在內存中是以16進制的形式存放的.而顯示給咱們看的是10進制的形式顯示的,,[16進制轉就是123456789ABCDEF,比如 十進制的0123456789,逢16進1,十進制是逢十進1,不想算能夠用windows自帶的計算器,在附件中有]



網 絡遊戲幾乎全是動態內存存放[大話戰國竟然不是.那天寫輔助工具時發現的],,就是每上線一次,數據在內存中分配位置會變,可是.數據間地址的差值是不變 的.就是所謂的偏移量..咱們要作的工做就是要讓動態的,轉換成靜態的,只要找到一個就成了.別的根據偏移量能夠知道.步驟以下:

1.我 們進遊戲.首先要作的就是找動態內存地址[我以HP值舉例],找動態內存的工具軟件不少,我推薦金山遊俠,FPE,CE,GE等...軟件用法很簡單.. 就比如你如今的HP值是1000.你先定位好程序.輸入1000搜索,會搜到一串地址..而後讓本身的血值變(好比穿件加HP的裝備,好比是加了50 血),再搜1050,這樣試幾回就找到了惟一的動態內存地址.[雖然惟一,但一下線就會變的],第一步工做徹底了...

2.而後咱們要用到調試工具設斷點,調試工具不少,好比OD或softice等,我以softice舉例:
比 如咱們搜索到HP的動態地址是044321A7..咱們按CRTL+D呼出SOFICE..下命令設斷點BPM 044321A7 W 而後按F5退出進遊戲..只要HP值一變.就會跳出調試的界面.好比說位置跳到了001B:0047EB17 mov eax,[edx+000000fc]處..其中..edx是基值[也能夠是esi等等],000000fc是一個固定的地址偏移量,每次進遊戲在變的就 是基值中的數值.

3.到這..有多種方法能夠求得靜態地址..一種就是內存注入的方法.網上有不少這類的資料..主要是太麻煩..我就不 寫了.我講我本身的方法.我是用到指針的指針的思想..就是.咱們的HP值是存放在一個動態內存地址中..地址其實也是數據..地址也是存放在地址中 的..固然.要基值的地址..因此咱們要作的就是找存放基值地址的地址,能夠用金山等軟件搜索到..不過地址是16進制的..因此要轉換成10進制.再找 存放基值地址的地址..好比說找到011076EC.好了.咱們的工做完成了...如今就到了怎麼寫讀語句..用C語言寫起來很簡單..用VB也能夠 寫..[別人說VB沒指針.但並不表明不能用].由於按鍵是VBS語言.那我就用VB寫..固然.我要調用WIN32 API函數

VB調 用API要申明,以下:Ddeclare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
dim edx as long
dim hp as long
ReadProcessMemory nOK, ByVal &H011076EC, edx, 4, 0
ReadProcessMemory nOK, ByVal edx+000000fc, hp, 4, 0
就這樣兩條語句..hp中的數值就是咱們的血值了..很是精準的能夠獲得..好比我血有1000點.我要在666點時加血..你就能夠if hp<666 then keypress "加血的按鍵"

補充一點..搜索基址的地址是會搜到很多個的..可是通常來講..第一個就是...
html

 

 

 

------------------------------------------------------------------------------------------------------------------------------windows

 

源地址:http://www.wgx4.com/article/html/257.html網絡

 

 

從遊戲中獲得動態內存數據  
            做者:sbsummer  
    剛纔我玩了幾把瘋狂坦克,輸了好幾盤,以爲無聊就搞搞這個,下面開始說說如何獲得遊戲中的動態數據(地址改變),以獲得瘋狂坦克中坦克X座標爲例 
            ------------------------------------------------------------------------------ 
            工具: 
            SoftICE動態調試程序,遊戲修改工具(金山遊俠),反彙編(W32Dasm),Hex Workshop 
            ------------------------------------------------------------------------------ 
            1、找到內存中坦克X座標 
            用金山遊俠搜索,方法以下(金山遊俠的使用我就不說了) 
            把坦克往左移動一些,就搜索「減小」;坦克往右移動,就搜索「增大」 
            反覆搜索將會找到一個地址(固然其餘遊戲可能不止一個),這裏是08BFAACC 
            注:動態的內存分配就是下次你若是再次搜索,地址將再也不是08BFAACC  
            2、找到那條代碼修改了這個數據(X座標) 
            加載 SoftIce 
            在遊戲狀態 Ctrl+D 調出SoftIce,輸入 BPM 08BFAACC W,這裏的W表示若是這個地 址被寫將中斷 
            回到遊戲,移動坦克,左移一下,程序中斷,SoftIce指向的上面一句是 
            004640B3 MOV DWORD PTR [ESI+000001A4],EAX 
            這句就是修改坦克座標的代碼,固然右移也能找到一句,這裏就不重複了 

            3、修改程序使動態的數據變成靜態 
            這裏說點題外話,修改程序包括兩種,一種是直接修改程序,一種是修改內存中的程序(內存補丁),這裏因爲我懶,因此用了第一種 
            修改程序: 
            瘋狂坦克程序存在Fortress2.dat當中,若是你把這個文件更名爲EXE文件同樣能夠運行,這裏咱們就把他修改爲Fortress2.exe 
            打開W32Dasm反彙編,SHIFT+F12跳到004046B3,你看到這幾行 
            004046B3 8986A4010000 MOV DWORD PTR [ESI+000001A4],EAX 
            004046B9 8B8644020000 MOV EAX,DWORD PTR [ESI+00000244] 
            004046BF C744241001000000 MOV [ESP+10],00000001 
            剛纔咱們說了004046B3是修改X座標的那條語句,如今咱們要讓他每次修改完程序就可以把X座標存儲到一個固定的地址 
    如今要讓它運行到這裏就JMP到一個咱們本身的代碼的地方,因而在程序的尾部咱們找到一段空白的區域00465A52,因而我修改004046BF爲代碼 JMP  00465A52,機器碼爲E98E130600,由於這句的長度不夠之前的那句長,因此要加入幾個NOP,機器碼爲90,因此咱們打開HEX  Workshop修改程序,CTRL+G跳到位移爲000046BF的地方,看到了C744241001000000,咱們把它修改成E98E130600909090,如今程序將一運行到這裏就跳到00465A52運行咱們的代碼。

            4、實現咱們本身的代碼,而後跳回 
            咱們的代碼要作的是把動態變成靜態, 
            PUSH EAX 
            MOV EAX,[ESI+000001A4] 
            MOV [00470000],EAX 
            POP EAX 
            JMP 004046C7 
            這樣這個數值不管運行多少次,只要你移動(固然右移也要修改)就能在00470000中找到X座標,這段機器碼爲50 8B86A4010000  
            A300004700 58 E95BECF9FF 
            忘了說剛纔咱們把004046BF替換掉的那句MOV [ESP+10],00000001也必須加上,因此打開HEX  
            Workshop,CTRL+G跳到00465A52,修改加入 
            C744241001000000 50 8B86A4010000 A300004700 58 E95BECF9FF 
            這樣動態數據就變成了靜態 

            ------------------------------------------------------------------------------ 

            如今回顧一下 
            首先搜索座標地址 
            找到改變這個地址的代碼 
            修改代碼讓他跳到本身的代碼中運行 
            在程序的空白段加入本身的代碼,固然要補上被替換了的那句,還有修改了寄存器,必須先PUSH,再POP 
            下面的工做就是寫一個程序讀取這個地址了,我用VC寫了一個,順便貼一下關鍵代碼 

            ------------------------------------------------------------------------------ 
            CProcess m_process; 
            bool m_ret=m_process.FindProcess("FortressII"); 
            if (m_ret) 
            { 
            BYTE tank1xL = m_process.ReadByte(0x00470000); 
            BYTE tank1xR = m_process.ReadByte(0x00470001); 
            WORD tank1x = tank1xL+tank1xR*256; 
            temp = tank1x; 
            str.Format("%d",temp); 
            m_tank1x=str;  
            UpdateData(FALSE); 
            return TRUE; 
            } 
            else return FALSE; 

            ----------------------------------------------------------------------------- 

            CProcess是一個我編寫的遊戲修改類,如下是部分函數代碼: 

            HANDLE CProcess::OpenProcess(char *p_ClassName, char *p_WindowTitle) 
            { 
            HWND hWindow; 
            DWORD pid; 
            hWindow = FindWindow(p_ClassName, p_WindowTitle); 
            if (hWindow) { 
            GetWindowThreadProcessId(hWindow, &pid); 
            return ::OpenProcess(PROCESS_ALL_ACCESS, false, pid); 
            } 
            return NULL; 
            } 
            bool CProcess::FindProcess(char *p_WindowTitle) 
            { 
            if (m_hProcess == NULL) { 
            m_hProcess = this->OpenProcess(NULL, p_WindowTitle); 
            if (m_hProcess) 
            m_bGameRunning = true; 
            return m_bGameRunning; 
            } 
            else 
            return false; 
            } 
            BYTE CProcess::ReadByte(DWORD p_Address) 
            { 
            DWORD bytes; 
            BYTE tmpValue; 
            if (m_bGameRunning) { 
            if (ReadProcessMemory(m_hProcess, (void*)p_Address,  
            (void *)&tmpValue, 1, &bytes) == 0) 
            return 0; 
            else 
            return tmpValue; 
            } 
            return 0; 
            } 

            ----------------------------------------------------------------------------- 
函數

相關文章
相關標籤/搜索