不使用ReadProcessMemory读取自己进程的内存
Read the memory of my own process without using ReadProcessMemory
使用这种方式我可以获得正确的值,但我想要一个示例,说明如何在不使用 ReadProcessMemory 的情况下读取我自己进程的内存。
var
Modulo : HMODULE;
Value1, Value2, Read : Cardinal;
GetWindowTextAAPI: function (hWnd: HWND; lpString: PChar; nMaxCount: integer):integer; stdcall;
begin
Modulo := GetModuleHandle('user32.dll');
if (Modulo <> 0) then
begin
@GetWindowTextAAPI := GetProcAddress(Modulo, 'GetWindowTextA');
if (@GetWindowTextAAPI <> nil) then
begin
ReadProcessMemory(GetCurrentProcess, Pointer(@GetWindowTextAAPI), Addr(Value1), 4, Read);
ReadProcessMemory(GetCurrentProcess, Pointer(DWORD(@GetWindowTextAAPI)+4), Addr(Value2), 4, Read);
ShowMessage(
IntToStr(Value1)
+ ' ' +
IntToStr(Value2)
);
end;
end;
end;
如何正确使用函数CopyMemory?
您无需执行任何特殊操作即可从您自己的进程中读取内存。这是您的程序已经一直所做的事情。你当然不需要ReadProcessMemory
。相反,您只需取消引用一个指针。
由于您似乎对调用 API 函数不感兴趣,您可以从简化函数指针声明开始:
var
GetWindowTextAAPI: PDWord;
然后,赋值指针并读取值:
GetWindowTextAAPI := GetProcAddress(Modulo, 'GetWindowTextA');
Value1 := GetWindowTextAAPI^;
使用这种方式我可以获得正确的值,但我想要一个示例,说明如何在不使用 ReadProcessMemory 的情况下读取我自己进程的内存。
var
Modulo : HMODULE;
Value1, Value2, Read : Cardinal;
GetWindowTextAAPI: function (hWnd: HWND; lpString: PChar; nMaxCount: integer):integer; stdcall;
begin
Modulo := GetModuleHandle('user32.dll');
if (Modulo <> 0) then
begin
@GetWindowTextAAPI := GetProcAddress(Modulo, 'GetWindowTextA');
if (@GetWindowTextAAPI <> nil) then
begin
ReadProcessMemory(GetCurrentProcess, Pointer(@GetWindowTextAAPI), Addr(Value1), 4, Read);
ReadProcessMemory(GetCurrentProcess, Pointer(DWORD(@GetWindowTextAAPI)+4), Addr(Value2), 4, Read);
ShowMessage(
IntToStr(Value1)
+ ' ' +
IntToStr(Value2)
);
end;
end;
end;
如何正确使用函数CopyMemory?
您无需执行任何特殊操作即可从您自己的进程中读取内存。这是您的程序已经一直所做的事情。你当然不需要ReadProcessMemory
。相反,您只需取消引用一个指针。
由于您似乎对调用 API 函数不感兴趣,您可以从简化函数指针声明开始:
var
GetWindowTextAAPI: PDWord;
然后,赋值指针并读取值:
GetWindowTextAAPI := GetProcAddress(Modulo, 'GetWindowTextA');
Value1 := GetWindowTextAAPI^;