在内存中读取字符串,100分,不够再加100,再不够再加100

jamsir 2003-12-01 09:12:25
假如已经知道了某个进程的句柄,如何用ReadProcessMemory函数在该进程的内存中读取字符串?
这是别人问过的问题。
我也觉得应该用
BOOL ReadProcessMemory(

HANDLE hProcess, // 要读的进程的句柄
LPCVOID lpBaseAddress, // 要读字符串的地址
LPVOID lpBuffer, // 存放字符串的地址
DWORD nSize, // 要读的字符串的数目
LPDWORD lpNumberOfBytesRead // 实际传送字符串的数目的地址
);
这个东西,可是它tmd的就是不好使:<
我程序的句柄是$3004EE
要找的东西在$0B0C58D4
应该是一个数字123
可是我就是找不到.....
我是这么写的
cl:integer;
lpNumberOfBytesRead: DWORD ;
ReadProcessMemory(
$3004EE,
Pointer($0B0C58D4),
@cl,
6,
lpNumberOfBytesRead
);
edit1.Text:=inttostr(cl);
它就是返回一个0。。。
谁能写出几句测试过的代码呀。100分,不够再加100,再不够再加100。
...全文
66 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ly_liuyang 2003-12-02
  • 打赏
  • 举报
回复
这个问题很简单了,上面的几位都说得很清楚了
smalltalk 2003-12-02
  • 打赏
  • 举报
回复
TMD,这个问题谁都知道,楼主怎么如此没品位?
jamsir 2003-12-02
  • 打赏
  • 举报
回复
问题是我自己解决的。不过还是要给分的,一开始不行的原因是,没用OpenProcess()...
sundayboys 2003-12-01
  • 打赏
  • 举报
回复
procedure TForm1.Button1Click(Sender: TObject);
var
FSnapshotHandle:THandle;
FProcessEntry32:TProcessEntry32;
Ret : BOOL;
ProcessID : integer;
ProcessHndle : THandle;
lpBuffer:pByte;
nSize: DWORD;
lpNumberOfBytesRead: DWORD;
i:integer;
s:string;
begin
FSnapshotHandle:=CreateToolhelp32Snapshot(
TH32CS_SNAPPROCESS,0);
//创建系统快照
FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);
//先初始化 FProcessEntry32 的大小
Ret:=Process32First(FSnapshotHandle,FProcessEntry32);
while Ret do
begin
s:=ExtractFileName(FProcessEntry32.szExeFile);
if s='KERNEL32.DLL' then
begin
ProcessID:=FProcessEntry32.th32ProcessID;
s:='';
break;
end;
Ret:=Process32Next(FSnapshotHandle,FProcessEntry32);
end;
//循环枚举出系统开启的所有进程,找出“Kernel32.dll”
CloseHandle(FSnapshotHandle);
Memo1.Lines.Clear ;
memo1.lines.add('Process ID '+IntToHex(
FProcessEntry32.th32ProcessID,8));
memo1.lines.Add('File name '+FProcessEntry32.szExeFile);
////输出进程的一些信息
nSize:=4;
lpBuffer:=AllocMem(nSize);
ProcessHndle:=OpenProcess(PROCESS_VM_READ,false,ProcessID);
memo1.Lines.Add ('Process Handle '+intTohex(ProcessHndle,8));
for i:=$00800001 to $0080005f do
begin
ReadProcessMemory(
ProcessHndle,
Pointer(i),
lpBuffer,
nSize,
lpNumberOfBytesRead
);
s:=s+intTohex(lpBuffer^,2)+' ';
//读取内容
if (i mod 16) =0 then
begin
Memo1.Lines.Add(s);
s:='';
end;
//格式化输出
end;
FreeMem(lpBuffer,nSize);
CloseHandle(ProcessHndle);
//关闭句柄,释放内存
end;
午秋 2003-12-01
  • 打赏
  • 举报
回复
//下面代码读出Hello出来,假设进程是自己,要读出字符串“hello“出来
procedure TForm1.Button1Click(Sender: TObject);
var
hProcess,iRead:Cardinal;
hgl:HGLOBAL;
p: Pointer;
Buffer: Pointer;
begin
// 建立共享内存,并赋值"hello"
hgl :=GlobalAlloc(GMEM_SHARE,1024);
p:=GlobalLock(hgl);
strcopy(p,'hello');

// 下面是接收过程
// 创建空间用来接收字符串
GetMem(Buffer,1024);

// 打开自已
hProcess := OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, false, GetCurrentProcessId);
// 读数据
if ReadProcessMemory(hProcess,p,Buffer,1024,iRead) then
ListBox1.Items.Add(PChar(Buffer));
// 释放资源
GlobalUnlock(hgl);
FreeMem(Buffer,1024);
end;

// 上面代码调试通过,直接Copy可用,300分我全要了哈。
午秋 2003-12-01
  • 打赏
  • 举报
回复
The handle must have PROCESS_VM_READ access to the process.
hottey 2003-12-01
  • 打赏
  • 举报
回复
UP

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧