内存指针问题,希望高人指点,感激不尽! ( 积分: 200 )

  • 主题发起人 主题发起人 精灵猪
  • 开始时间 开始时间

精灵猪

Unregistered / Unconfirmed
GUEST, unregistred user!
var<br>&nbsp;P:Pointer;<br>&nbsp;s:string;<br>begin<br>P&nbsp;:=&nbsp;Pointer($006FC6B4);<br>s:=pchar(p);&nbsp;<br>end;<br>这里的s可以得到$006FC6B4里的字符串数据,可是如果006FC6B4这里是个内存地址&nbsp;比如<br>08&nbsp;F3&nbsp;D6&nbsp;08&nbsp;我如何才能得到这个地址?<br>-----------------------------------<br>另外比如搜索内存比如我要搜索的内存数据是<br>0C&nbsp;00&nbsp;00&nbsp;00&nbsp;54&nbsp;92&nbsp;4D&nbsp;07&nbsp;48&nbsp;34&nbsp;49&nbsp;07&nbsp;0C&nbsp;00&nbsp;00&nbsp;00<br>如何得到内存的地址?<br>-----------------------------------<br>如果想把&nbsp;0C&nbsp;00&nbsp;00&nbsp;00&nbsp;54&nbsp;92&nbsp;4D&nbsp;07&nbsp;48&nbsp;34&nbsp;49&nbsp;07&nbsp;0C&nbsp;00&nbsp;00&nbsp;00<br>的数据改为&nbsp;08&nbsp;00&nbsp;00&nbsp;00&nbsp;08&nbsp;00&nbsp;00&nbsp;00&nbsp;08&nbsp;3C&nbsp;49&nbsp;07&nbsp;00&nbsp;00&nbsp;00&nbsp;00<br>应该如何操作<br>----------------------------------<br>这3个问题都是操作进程自身内存的&nbsp;所以最好不要用到&nbsp;ReadProcessMemory&nbsp;和&nbsp;WriteProcessMemory<br>这3个问题困饶小弟一段时间了,一直没有解决&nbsp;希望达人能给点指点&nbsp;或者资料
 
没接触过,不过在内存中搜索和在文件中搜索会有什么很大的不同吗,都是一个一个字节读,判断是不是要找的字节,只不过在内存中用的读写数据的函数和文件中不一样吧。
 
是的肯定不一样&nbsp;内存比较大&nbsp;期待高人指点一二
 
没搞过,帮忙顶,学习!~赫赫
 
搜索本地进程的用户空间当然无需调用ReadProcessMemory&nbsp;和&nbsp;WriteProcessMemory。<br><br>在4GB的空间中,&nbsp;有很多空洞的,还有一部分是二进制代码只读页,你可以按你自己的需求有选择地搜索非空洞的页,这是很多游戏修改器的快速搜索基本原理。<br><br>具体的API资料一时没记起,我去找找,&nbsp;一会贴上相关网址
 
在进程中有些段是不可读的<br>搜索之前先把它变为可读可写的<br>然后定义一个缓冲区,读一段找一段<br>找到后,直接修改就行了<br>变量也是在内存中的<br>也就是说不用专门去处理字节排列顺序<br>把指定位置的值转换成指针,赋给变量<br>然后就和正常编程一样了
 
期待Writer的相关资料或者网址&nbsp;谢谢你的热心<br>Mike1234567890可能理解错了&nbsp;我就是操作的本进程内存&nbsp;所以不存在读写权限的问题&nbsp;还有就是如果读一段找一段的方法应该如何做?可有例子,如果是从头读到尾会不会死机啊?
 
期待中&nbsp;,&nbsp;那未高人可以指点一二&nbsp;2天过去了&nbsp;我一直没解决问题
 
没有人回答了吗?
 
你自己的进程中也有你通过正常途径不能读的,如果真要找你可以自己编写直接操作页目录及页表的程序,应该是最快的,因为这里你可以知道那些内存是分配的那些还没有用。
 
問題1.<br>var<br>&nbsp;P:Pointer;<br>&nbsp;s:string;<br>begin<br>P&nbsp;:=&nbsp;Pointer($006FC6B4);<br>s:=pchar(p);&nbsp;<br>end;<br>这里的s可以得到$006FC6B4里的字符串数据,可是如果006FC6B4这里是个内存地址&nbsp;比如<br>08&nbsp;F3&nbsp;D6&nbsp;08&nbsp;我如何才能得到这个地址?<br><br>&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;<br>這樣取:&nbsp;&nbsp;var&nbsp;&nbsp;<br>var<br>&nbsp;P:Pointer;<br>&nbsp;pi:&nbsp;PInteger;<br>begin<br>&nbsp;&nbsp;P&nbsp;:=&nbsp;Pointer($006FC6B4);<br>&nbsp;&nbsp;pi&nbsp;:=&nbsp;Pointer(Integer(P));&nbsp;&nbsp;//Integer(p)&nbsp;是獲取到&nbsp;p&nbsp;所指向的地址(指針所指向的地址就是指針的值)<br>&nbsp;&nbsp;pi^&nbsp;就是你要取的那個地址<br><br>問題2.<br>另外比如搜索内存比如我要搜索的内存数据是<br>0C&nbsp;00&nbsp;00&nbsp;00&nbsp;54&nbsp;92&nbsp;4D&nbsp;07&nbsp;48&nbsp;34&nbsp;49&nbsp;07&nbsp;0C&nbsp;00&nbsp;00&nbsp;00<br>如何得到内存的地址?<br><br>既然你都知道了你要獲取的數據了,當然就從進程邊界開始搜吧,一個個字節比較,如果是比較一串的話自己不大清楚,水平有限,只知道整數在內存中存儲的順序是相反的,比如值為:0x4D&nbsp;07&nbsp;48&nbsp;34,&nbsp;那在內存中可能是&nbsp;0x34&nbsp;48&nbsp;07&nbsp;4D,&nbsp;可以用一個PByte類型指針去遍歷一個Integer&nbsp;類型變量的值就知道了,&nbsp;&nbsp;在內存中存儲的順序是相反的,以前曾問過老大的,只是人笨沒記住&nbsp;&nbsp;,<br><br>第三個問題,在本進程內讀一般是沒問題的,但寫就不一定了,你可以去查更改內存屬性的API,其實就那幾個,前段時間用過,現在忘了(嘿嘿,別T我啊)。可以用API改掉屬性之後直接用指針操作,最簡單測試方法的就是用這種方法改一個變量的值:)
 
操作內存的可以去盒子裡面下游戲修改器,道理是差不多的,只是他用API讀寫,你可以直接用指針。
 
自己的内存空间简单啊!<br><br>{$H+}<br><br>implementation<br>procedure&nbsp;StartProc;<br>begin<br>end;<br><br>其他过程<br><br>procedure&nbsp;EndProc;<br>begin<br>end;<br><br>var<br>&nbsp;&nbsp;Ps,pe:pointer;<br>&nbsp;&nbsp;plen:integer;<br>&nbsp;&nbsp;mychr:pchar;<br>begin<br>&nbsp;&nbsp;ps:=@StartProc;<br>&nbsp;&nbsp;pe:=@EndProc;<br>&nbsp;&nbsp;plen=integer(pe)-integer(ps);<br>&nbsp;&nbsp;mychr:=pchar(ps);<br>&nbsp;&nbsp;对string(mychr)进行操作吧!呵呵!<br>end;
 
11111111111111111111111111111111111111111
 
后退
顶部