您的位置:程序门 -> delphi -> windows sdk/api



关于一个读取内存地址的问题!


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


关于一个读取内存地址的问题!
发表于:2007-03-06 00:30:39 楼主
我要读取20个左右内存地址的值。比如a,b,c,d,e,f……等地址
那么这些地址下有的保存的是10进制。有的保存的是字符串,那么怎么读取?
我现在的读取办法有问题,有时正常,有时非法操作!我现在是这样做的:、
procedure   tmainform.rzbitbtn1click(sender:   tobject);
begin
  读取a地址;
  读取b地址;
  ……
end;
结果读的地址太多了。好像内存释放上有问题。所以想看看大家在这种顺序读取很多地址的情况下,应该怎么做最安全?还有就是10进制和字符串应该分别怎么读取?(大家不用考虑获得句柄和打开进程等问题,只是读取内存的问题)
发表于:2007-03-06 08:44:521楼 得分:0
api
readprocessmemory

数值
var
buf:integer;
begin
...
...
readprocessmemory(h,$01,buf,sizeof(integer),nil);
end;

字符
var
buf:array[0..255]of   char;   //每次读256个字符
begin
...
...
readprocessmemory(h,$01,buf,sizeof(buf),nil);
end;
发表于:2007-03-06 09:46:292楼 得分:0
不存在释放buf的问题吗?
发表于:2007-03-06 10:16:203楼 得分:0
readprocessmemory只是读出内存数据并不是锁定或是创建内存区域没有什么可释放的
要么就是释放由openprocess打开的进程closehandle(h)
发表于:2007-03-06 13:06:554楼 得分:0
本来我也觉得只需要读就可以了,但是每次readprocessmemory后,我都取出值放到相应的label中去显示,那么程序运行时,有时正常,有时就出错在某个给label赋值的地方。如果是因为没有取出值造成的话。但是程序又有正确的显示。不知道怎么回事
发表于:2007-03-06 15:21:285楼 得分:0
贴下你的代码看看
发表于:2007-03-06 15:53:256楼 得分:0
20个左右内存地址的值。比如a,b,c,d,e,f……等地址

那每个   地址   要读   多长   ???

用   move   不错
自己先分配   内存
或   静态   array     [0..4095]   of   byte;
发表于:2007-03-06 16:48:207楼 得分:0
procedure   tmainform.timer1timer(sender:   tobject);
var
    readok:   dword;
    lpbuffer   :pbyte;
begin
//省略了获得线程等代码,下面是开始读取内存地址中的字符串
lpbuffer:=allocmem(nsize);
readprocessmemory(pproc,   pointer($12308ec),lpbuffer,20,   readok);
label1.caption   :=   pchar(lpbuffer);//程序有时候在这一句出错。说是错误的指针。但是有时候不会。

……
下面还有很多个这样的读取代码。都一样,只是地址不同
end;
发表于:2007-03-06 17:02:028楼 得分:0
label1.caption   :=   pchar(lpbuffer);//
是错误的
看看   #0
发表于:2007-03-06 17:03:249楼 得分:0
pchar  
#0  
结尾
发表于:2007-03-06 17:06:4410楼 得分:0
什么意思?label1.caption   :=   pchar(lpbuffer);这句应该怎么写?
发表于:2007-03-07 09:19:1811楼 得分:0
label1.caption   :=   strpas(lpbuffer);
发表于:2007-03-07 10:53:1712楼 得分:0
没注意看类型,重写
var
    readok:   dword;
    lpbuffer   :pchar;
begin
//省略了获得线程等代码,下面是开始读取内存地址中的字符串
lpbuffer:=stralloc(nsize);
readprocessmemory(pproc,   pointer($12308ec),lpbuffer,nsize,   readok);
label1.caption   :=   strpas(lpbuffer);
……
end;
发表于:2007-03-07 13:09:5313楼 得分:0
g
发表于:2007-03-07 15:53:2014楼 得分:0
帮搂主顶下。
    我一般这样处理
    声明缓冲区   s:   array[0..nsize+1]   of   char;
    然后使用fillchar将缓冲区置为#0
    readprocessmemory(pproc,   pointer($12308ec),@s[0],nsize,   readok);
    ......
    //说点废话
    我认为需要注意的是pointer($12308ec)这个地方有点太绝对化,可以先查看$12308ec在读出进程的那个模块中,找出该模块的影像基地址。算出这个地址相对于dll基地址的偏移量,在自己的程序中可以先找到基地址,使用基地址+偏移量的方式来读取。
    如果你所要找的地址是别人的声明的局部变量,那情况又不同了...........
发表于:2007-03-07 17:44:5615楼 得分:0
关注
发表于:2007-03-31 09:58:3216楼 得分:0
zhu_jiang()     说的对
注意   nsize+1
或者   你用   move     copymem.....
发表于:2007-03-31 10:31:0017楼 得分:0
关注


快速检索

最新资讯
热门点击