游戏外挂内存数据读取
2019獨角獸企業重金招聘Python工程師標準>>>
源地址: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 "加血的按鍵"
補充一點..搜索基址的地址是會搜到不少個的..但是一般來說..第一個就是...
?
?
?
------------------------------------------------------------------------------------------------------------------------------
?
源地址:http://www.wgx4.com/article/html/257.html
?
?
從游戲中得到動態內存數據??
????????????作者:sbsummer??
????剛才我玩了幾把瘋狂坦克,輸了好幾盤,覺得無聊就搞搞這個,下面開始說說如何得到游戲中的動態數據(地址改變),以得到瘋狂坦克中坦克X坐標為例?
????????????------------------------------------------------------------------------------?
????????????工具:?
????????????SoftICE動態調試程序,游戲修改工具(金山游俠),反匯編(W32Dasm),Hex Workshop?
????????????------------------------------------------------------------------------------?
????????????一、找到內存中坦克X坐標?
????????????用金山游俠搜索,方法如下(金山游俠的使用我就不說了)?
????????????把坦克往左移動一些,就搜索“減少”;坦克往右移動,就搜索“增大”?
????????????反復搜索將會找到一個地址(當然其他游戲可能不止一個),這里是08BFAACC?
????????????注:動態的內存分配就是下次你如果再次搜索,地址將不再是08BFAACC??
????????????二、找到那條代碼修改了這個數據(X坐標)?
????????????加載 SoftIce?
????????????在游戲狀態 Ctrl+D 調出SoftIce,輸入 BPM 08BFAACC W,這里的W表示如果這個地 址被寫將中斷?
????????????回到游戲,移動坦克,左移一下,程序中斷,SoftIce指向的上面一句是?
????????????004640B3 MOV DWORD PTR [ESI+000001A4],EAX?
????????????這句就是修改坦克坐標的代碼,當然右移也能找到一句,這里就不重復了?
????????????三、修改程序使動態的數據變成靜態?
????????????這里說點題外話,修改程序包括兩種,一種是直接修改程序,一種是修改內存中的程序(內存補丁),這里由于我懶,所以用了第一種?
????????????修改程序:?
????????????瘋狂坦克程序存在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運行我們的代碼。
????????????四、實現我們自己的代碼,然后跳回?
????????????我們的代碼要做的是把動態變成靜態,?
????????????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;?
????????????}?
????????????-----------------------------------------------------------------------------?
轉載于:https://my.oschina.net/u/2260184/blog/540570
總結
以上是生活随笔為你收集整理的游戏外挂内存数据读取的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通过游戏策划阶段防治游戏外挂
- 下一篇: FPS游戏外挂屡禁不止,如何破局?