我要读取20个左右内存地址的值。比如a,b,c,d,e,f……等地址
那么这些地址下有的保存的是10进制。有的保存的是字符串,那么怎么读取?
我现在的读取办法有问题,有时正常,有时非法操作!我现在是这样做的:、
procedure TMainForm.RzBitBtn1Click(Sender: TObject);
begin
读取A地址;
读取B地址;
……
end;
结果读的地址太多了。好像内存释放上有问题。所以想看看大家在这种顺序读取很多地址的情况下,应该怎么做最安全?还有就是10进制和字符串应该分别怎么读取?(大家不用考虑获得句柄和打开进程等问题,只是读取内存的问题)
那么这些地址下有的保存的是10进制。有的保存的是字符串,那么怎么读取?
我现在的读取办法有问题,有时正常,有时非法操作!我现在是这样做的:、
procedure TMainForm.RzBitBtn1Click(Sender: TObject);
begin
读取A地址;
读取B地址;
……
end;
结果读的地址太多了。好像内存释放上有问题。所以想看看大家在这种顺序读取很多地址的情况下,应该怎么做最安全?还有就是10进制和字符串应该分别怎么读取?(大家不用考虑获得句柄和打开进程等问题,只是读取内存的问题)
解决方案 »
- 请问VideoWindow视频控件哪里下载
- 恭喜二位新版主上任,散分
- 关于ADOquery局域网共享操作问题?
- 求MySQLDAC 2.0以上的D7可用版本,最好是FS!
- ADO能否连接dbase 5数据表?
- 可否在当前应用程序退出后激活另一个自己的实例?
- 关于Memo控件的两个问题
- 谁知道哪里有Delphi下载???告诉我呀!
- 快来救我啊!!不知怎的控件上的字全成乱码了,有点象韩文的那种,而且注释里的字体也变了,以前是斜体的,现在变正楷了,字体是在哪里调的啊?是中文显示不正常。长期在线,即答即得。
- 如何从TXT文件中导入数据到db中??????(万分感谢)
- 请问在Delphi中如何实现矩阵以及矩阵的运算
- 求一兼职程序员,非常感谢
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;
要么就是释放由OpenProcess打开的进程CloseHandle(h)
自己先分配 内存
或 静态 array [0..4095] of byte;
var
readok: DWORD;
lpBuffer :PByte;
begin
//省略了获得线程等代码,下面是开始读取内存地址中的字符串
lpBuffer:=AllocMem(nSize);
ReadProcessMemory(pProc, Pointer($12308EC),lpBuffer,20, readok);
label1.caption := PChar(lpBuffer);//程序有时候在这一句出错。说是错误的指针。但是有时候不会。……
下面还有很多个这样的读取代码。都一样,只是地址不同
end;
是错误的
看看 #0
#0
结尾
var
readok: DWORD;
lpBuffer :Pchar;
begin
//省略了获得线程等代码,下面是开始读取内存地址中的字符串
lpBuffer:=StrAlloc(nSize);
ReadProcessMemory(pProc, Pointer($12308EC),lpBuffer,nSize, readok);
label1.caption := strpas(lpBuffer);
……
end;
我一般这样处理
声明缓冲区 S: array[0..nsize+1] of char;
然后使用FillChar将缓冲区置为#0
ReadProcessMemory(pProc, Pointer($12308EC),@S[0],nSize, readok);
......
//说点废话
我认为需要注意的是Pointer($12308EC)这个地方有点太绝对化,可以先查看$12308EC在读出进程的那个模块中,找出该模块的影像基地址。算出这个地址相对于dll基地址的偏移量,在自己的程序中可以先找到基地址,使用基地址+偏移量的方式来读取。
如果你所要找的地址是别人的声明的局部变量,那情况又不同了...........
注意 nsize+1
或者 你用 move copymem.....