如何把一个进程的某段内存数据保存到一个二进制文件?????200分(200分)

  • 主题发起人 主题发起人 jdti
  • 开始时间 开始时间
J

jdti

Unregistered / Unconfirmed
GUEST, unregistred user!
高手门,假如我已知道某个进程的虚拟内存的地址,比如说从00400000开始到004000ff这段
地址中和004001ff到004002ff中有我想需要的数据,那么我如何保存这两段数据到一个
二进制文件中呢??要源码的呀!还有就是要如何获得一个进程并且打开他找到我上面
所说的地址。然后保存这段数据到一个二进制文件中。急呀!!!!!!!
 
用内存映射文件可以作到,其实对于PE格式文件的内容在装入内存后是固定的,这样你只需要
用该程序的入口地址加上偏移量就可得到内存中数据的绝对地址,然后进行内存拷贝就行了,
说起来挺复杂,建议你对PE格式的文件仔细研究一下。
 
我已经可以找到地址,但是就是不知道如何对内存进行拷贝,并保存成一个二进制的 文件。
我需要例子,或源码。
 
内存映像文件的读取和一般文件数据读取不同。
首先用OpenFileMapping()打开一个用于内存映像访问的文件
然后由CreateFileMapping()创建一个文件映像对象并将其与上面已打开的文件相连结
在创建了映像对象以后﹐就可以调用MapViewOfFile()来查看映象对象
结束使用内存映像文件之后﹐通过UnmapViewOfFILE()取消映像对象的视图
最后调用CloseHandle()来关闭映像对象和文件自已(应该调用两次)
 
其实你所说的问题,是关于进程的内存空间的读取!
可以用CreateToolhelp32Snapshot()获得系统快照句柄,然后初始化FProcessEntry32的大小。
通过Process32First()和Process32Next()循环枚举出系统开启的所有进程,以便找出Kernel32.dll。
然后用OpenProcess()打开进程,ReadProcessMemory()读取进程的内存空间,
如 for i:=$004001ff to $004002ff do ...
最后读取完后记得FreeMem及CloseHandle即可!
 
你门说的这些我都已经清楚,但是如何把我想要的另一个进程中的数据保存成文件,这个才
是我急需要知道的,给我个例子或源码,还可以再加100分,谢谢。
我现在急需要用。快快。。。。。。。。^_^
 
唉!这么简单的一个问题,看来大家往往好高骛远,不注意基础!
你既然连内存进程的读写都知道了,却还不知道如何写二进制文件。说出来令人不敢相信,典型的中国特色!
你可以用intTobin()函数将存放在缓冲区的数据转换为二进制,然后通过memo的lines.Add()读取即可!
保存后的文件就是二进制的。这是最简单的方法,复杂点可以用流等等。
 
文件操作很简单的
比如:
assignfile()
rewrite
write
这三个函数就可以搞定
 
呵呵,不好意思,你说的我都脸红了,我接触delphi还才2~3个月,关于进程的读写我也是
从大富翁离线数据中看到的。到现在为止,我还没有系统的看过一本关于delphi的教程的
书,我门这里的书店都没有卖的,可怜。我以前就会点c语言。才开始接触delphi的。所以
我才来这里提问的,你门不会笑话新手吧,回到正题,我还是希望那位大虾能给我一个可以
把其他进程内存中的数据保存成二进制文件的源码,呵呵,快点呀,我好结束话题,分派
分数呀。谢谢。
 
你要读写的是和你毫不相干的另外一个进程的数据?还是这2个进程在相互配合,通过内存
传递数据?
前者你在应用程序级是无法办到的,后者才能通过内存影象文件进行数据传递。
如果我的观点不正确,望哪位大虾给我讲讲。:(
 
目前我已经通过ReadProcessMemory()把另一个进程中的内存中的某段数据读出来了,
但是读出来的在缓寸中的数据是pbyte类型的,我如何把这段缓寸中的数据保存到
一个二进制的文件中呢?delphi中好象没有inttobin这个函数吧?而文件操作是pchar类型
的如何才能保存为文件呢?希望给个例子,谢谢。
 
function IntToBin(Value: LongInt; Digits: Integer): String;
var
;i: Integer;
begin
;Result:='';
;for i:=Digits downto 0 do
; if Value and (1 shl i)<>0 then
; ;Result:=Result + '1'
; else
; ;Result:=Result + '0';
end;

function BinToInt(Value: String): LongInt;
var
;i,Digits: Integer;
begin
;Result:=0;
;Digits:=Length(Value);
;while Copy(Value,1,1)='0' do
; Value:=Copy(Value,2,Length(Value)-1);
;for i:=Digits downto 1 do
; if Copy(Value,i,1)='1' then
; ;Result:=Result+(1 shl (i-1));
end;
 
//文件操作是pchar类型的如何才能保存为文件呢?
s:=s+intTobin(lpBuffer^,2);
Memo1.Lines.Add(s);
 
谢谢,我回去试一下,如果ok了,我马上给分。
 
下面的方法也可!
var
MapFile: THandle;
MapFilePointer: Pointer;

CreateFileMapping(...)
MapFilePointer:=MapViewOfFile(MapFile,File_Map_All_Access,0,0,0);//访问整个映象文件,最后一个参数要为0
MEMO.Text:=PChar(MapFilePointer);//读出所有内容
 
接受答案了.
 
后退
顶部