查找内存的一点问题(50)

  • 主题发起人 主题发起人 枝上柳绵
  • 开始时间 开始时间

枝上柳绵

Unregistered / Unconfirmed
GUEST, unregistred user!
程序目的是实现,在本进程中读入一BMP图片,然后查找本进程,找到这一BMP内存流目前遇到的问题是,我在formcreate里只加载了一个12738byte的BMP图片,但是在本进程的内存里找到的 BMP 都是文件大小超大的一些内存流,根本没有找到刚才加载的那一个图片不知道我的描述您明白吗,不明白就看代码吧,呵呵procedure TForm1.FormCreate(Sender: TObject);beginimg1.Picture.Bitmap.LoadFromFile('d:/78eaed.bmp');end;procedure TForm1.btn2Click(Sender: TObject);var procHandle:thandle;pid:Cardinal;buf:array[0..4095] of Byte;position:Cardinal;lpNumberOfBytes:DWORD;i:integer;beginIdx:Integer;bmpHead:BITMAPFILEHEADER;ms:TMemoryStream;bmp:pbyte;begin//prochandle:=GetCurrentProcess; position:=$00400000;//私有虚拟进程起始地址 beginIdx:=0;while position<$7FFFFFFF do//私有虚拟进程终止地址begin ReadProcessMemory(procHandle,Pointer(position),Pointer(@buf[0]),4096,lpNumberOfBytes) ; //开始查找 $4D42 i:= Pos('BM',StrPas(PChar(@buf[0]))) ; if i >0 then begin //ShowMessage('找到了'); beginIdx:=position+i-1;//beginIdx是BMP内存流的首地址//读取BMP 文件的头文件 ReadProcessMemory(procHandle,Pointer(beginIdx),Pointer(@bmpHead),SizeOf(bitmapfileheader),lpNumberOfBytes) ; if bmpHead.bfType =$4D42 then begin//显示文件大小,这里显示的文件都是超大的数字,如:287057205 bytes,这么大???//可以检索到共3-4个 BMP 标志的,当然有可能有一个是常量"BM" ShowMessage(IntToStr(bmpHead.bfSize )); { //下面是将内存流保存到文件中GetMem(bmp,bmpHead.bfSize); ReadProcessMemory(procHandle,Pointer(beginIdx),Pointer(bmp),bmpHead.bfSize,lpNumberOfBytes) ; ms:=TMemoryStream.Create ; ms.WriteBuffer(bmp,bmpHead.bfSize ); ms.SaveToFile('d:/'+IntToStr(bmpHead.bfSize)+'.bmp'); ms.Free; } end; //Break; position:= beginIdx +2; Continue; end; position:=position+4096-1;end; end;
 
帮顶一下~
 
谢谢liuls帮顶,呵呵,我记得资源文件(*.rsc),DLL文件等是原封不动地拷入虚拟内存里,那么地址应当是连续的但是像这样加载一个BMP图片,不知道是不是连续的?也不清楚,内存中的BMP文件流与文件BMP在格式上有没有什么不同??
 
谢谢liuls帮顶,呵呵,我记得资源文件(*.rsc),DLL文件等是原封不动地拷入虚拟内存里,那么地址应当是连续的但是像这样加载一个BMP图片,不知道是不是连续的?也不清楚,内存中的BMP文件流与文件BMP在格式上有没有什么不同??
 
后退
顶部