日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

游戏外挂内存数据读取

發(fā)布時間:2023/12/3 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 游戏外挂内存数据读取 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2019獨角獸企業(yè)重金招聘Python工程師標準>>>

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

網(wǎng)絡游戲.每一個數(shù)據(jù)比如你的血值.MP 值.怪的血值..在內存中是以16進制的形式存放的.而顯示給我們看的是10進制的形式顯示的,,[16進制轉就是123456789ABCDEF,好比 十進制的0123456789,逢16進1,十進制是逢十進1,不想算可以用windows自帶的計算器,在附件中有]



網(wǎng) 絡游戲幾乎全是動態(tài)內存存放[大話戰(zhàn)國居然不是.那天寫輔助工具時發(fā)現(xiàn)的],,就是每上線一次,數(shù)據(jù)在內存中分配位置會變,但是.數(shù)據(jù)間地址的差值是不變 的.就是所謂的偏移量..我們要做的工作就是要讓動態(tài)的,轉換成靜態(tài)的,只要找到一個就成了.別的根據(jù)偏移量可以知道.步驟如下:

1.我 們進游戲.首先要做的就是找動態(tài)內存地址[我以HP值舉例],找動態(tài)內存的工具軟件很多,我推薦金山游俠,FPE,CE,GE等...軟件用法很簡單.. 就好比你現(xiàn)在的HP值是1000.你先定位好程序.輸入1000搜索,會搜到一串地址..然后讓自己的血值變(比如穿件加HP的裝備,比如是加了50 血),再搜1050,這樣試幾次就找到了唯一的動態(tài)內存地址.[雖然唯一,但一下線就會變的],第一步工作完全了...

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

3.到這..有多種方法可以求得靜態(tài)地址..一種就是內存注入的方法.網(wǎng)上有很多這類的資料..主要是太麻煩..我就不 寫了.我講我自己的方法.我是用到指針的指針的思想..就是.我們的HP值是存放在一個動態(tài)內存地址中..地址其實也是數(shù)據(jù)..地址也是存放在地址中 的..當然.要基值的地址..所以我們要做的就是找存放基值地址的地址,可以用金山等軟件搜索到..不過地址是16進制的..所以要轉換成10進制.再找 存放基值地址的地址..比如說找到011076EC.好了.我們的工作完成了...現(xiàn)在就到了怎么寫讀語句..用C語言寫起來很簡單..用VB也可以 寫..[別人說VB沒指針.但并不代表不能用].因為按鍵是VBS語言.那我就用VB寫..當然.我要調用WIN32 API函數(shù)

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中的數(shù)值就是我們的血值了..非常精準的可以得到..比如我血有1000點.我要在666點時加血..你就可以if hp<666 then keypress "加血的按鍵"

補充一點..搜索基址的地址是會搜到不少個的..但是一般來說..第一個就是...

?

?

?

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

?

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

?

?

從游戲中得到動態(tài)內存數(shù)據(jù)??
????????????作者:sbsummer??
????剛才我玩了幾把瘋狂坦克,輸了好幾盤,覺得無聊就搞搞這個,下面開始說說如何得到游戲中的動態(tài)數(shù)據(jù)(地址改變),以得到瘋狂坦克中坦克X坐標為例?
????????????------------------------------------------------------------------------------?
????????????工具:?
????????????SoftICE動態(tài)調試程序,游戲修改工具(金山游俠),反匯編(W32Dasm),Hex Workshop?
????????????------------------------------------------------------------------------------?
????????????一、找到內存中坦克X坐標?
????????????用金山游俠搜索,方法如下(金山游俠的使用我就不說了)?
????????????把坦克往左移動一些,就搜索“減少”;坦克往右移動,就搜索“增大”?
????????????反復搜索將會找到一個地址(當然其他游戲可能不止一個),這里是08BFAACC?
????????????注:動態(tài)的內存分配就是下次你如果再次搜索,地址將不再是08BFAACC??
????????????二、找到那條代碼修改了這個數(shù)據(jù)(X坐標)?
????????????加載 SoftIce?
????????????在游戲狀態(tài) Ctrl+D 調出SoftIce,輸入 BPM 08BFAACC W,這里的W表示如果這個地 址被寫將中斷?
????????????回到游戲,移動坦克,左移一下,程序中斷,SoftIce指向的上面一句是?
????????????004640B3 MOV DWORD PTR [ESI+000001A4],EAX?
????????????這句就是修改坦克坐標的代碼,當然右移也能找到一句,這里就不重復了?

????????????三、修改程序使動態(tài)的數(shù)據(jù)變成靜態(tài)?
????????????這里說點題外話,修改程序包括兩種,一種是直接修改程序,一種是修改內存中的程序(內存補丁),這里由于我懶,所以用了第一種?
????????????修改程序:?
????????????瘋狂坦克程序存在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坐標的那條語句,現(xiàn)在我們要讓他每次修改完程序就能夠把X坐標存儲到一個固定的地址?
????現(xiàn)在要讓它運行到這里就JMP到一個我們自己的代碼的地方,于是在程序的尾部我們找到一段空白的區(qū)域00465A52,于是我修改004046BF為代碼 JMP??00465A52,機器碼為E98E130600,因為這句的長度不夠以前的那句長,所以要加入幾個NOP,機器碼為90,所以我們打開HEX??Workshop修改程序,CTRL+G跳到位移為000046BF的地方,看到了C744241001000000,我們把它修改為E98E130600909090,現(xiàn)在程序將一運行到這里就跳到00465A52運行我們的代碼。

????????????四、實現(xiàn)我們自己的代碼,然后跳回?
????????????我們的代碼要做的是把動態(tài)變成靜態(tài),?
????????????PUSH EAX?
????????????MOV EAX,[ESI+000001A4]?
????????????MOV [00470000],EAX?
????????????POP EAX?
????????????JMP 004046C7?
????????????這樣這個數(shù)值無論運行多少次,只要你移動(當然右移也要修改)就能在00470000中找到X坐標,這段機器碼為50 8B86A4010000??
????????????A300004700 58 E95BECF9FF?
????????????忘了說剛才我們把004046BF替換掉的那句MOV [ESP+10],00000001也必須加上,所以打開HEX??
????????????Workshop,CTRL+G跳到00465A52,修改加入?
????????????C744241001000000 50 8B86A4010000 A300004700 58 E95BECF9FF?
????????????這樣動態(tài)數(shù)據(jù)就變成了靜態(tài)?

????????????------------------------------------------------------------------------------?

????????????現(xiàn)在回顧一下?
????????????首先搜索坐標地址?
????????????找到改變這個地址的代碼?
????????????修改代碼讓他跳到自己的代碼中運行?
????????????在程序的空白段加入自己的代碼,當然要補上被替換了的那句,還有修改了寄存器,必須先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是一個我編寫的游戲修改類,以下是部分函數(shù)代碼:?

????????????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

總結

以上是生活随笔為你收集整理的游戏外挂内存数据读取的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。