游戏外挂内存数据读取

源地址: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; 
            } 

            ----------------------------------------------------------------------------- 
函数

相关文章
相关标签/搜索