1.
Можно вопользоваться функциями
ReadProcessMemory/WriteProcessMemory.
Пример использования приведен
ниже:
Файл Researcher.dpr
program Researcher;
{$APPTYPE CONSOLE}
uses Windows, SysUtils;
const
BUFFER_SIZE = 4096;
BUFFER_LIMIT = BUFFER_SIZE - 1;
ReadBase: Pointer = Pointer($00401000);
var
SI: TStartupInfo;
PI: TProcessInformation;
ExeFile: string = 'GuineaPig.exe';
Buf: array [0..BUFFER_LIMIT] of Byte;
ReadBytes: Cardinal;
I: Integer;
begin
try
if ParamCount > 0 then ExeFile := ParamStr(1);
FillChar(SI, SizeOf(SI), $00);
FillChar(PI, SizeOf(PI), $00);
SI.cb := SizeOf(SI);
if not CreateProcess(PChar(ExeFile), '', nil, nil, False, 0, nil, nil, SI, PI) then
RaiseLastOSError;
try
if not ReadProcessMemory(PI.hProcess, ReadBase, @Buf, BUFFER_SIZE, ReadBytes) then
RaiseLastOSError;
WriteLn('Read ', ReadBytes, ' bytes:');
for I := 0 to ReadBytes-1 do
begin
Write(IntToHex(Buf[I], 2));
if (I+1) mod 16 = 0
then WriteLn
else Write(' ');
end;
finally
CloseHandle(PI.hProcess);
CloseHandle(PI.hThread);
end;
except
on E: EXception do
begin
WriteLn(E.Message);
Halt(1);
end;
end;
end.
Файл
GuineaPig.dpr
program GuineaPig;
{$APPTYPE CONSOLE}
uses Windows;
begin
Write('Processing...');
Sleep(1000);
WriteLn('OK');
end.
2.
Второй вариант состоит во внедрении DLL в адресное пространство чужого
процесса. В этом
случае вы получите поток, выполняющийся в чужом адресном
пространстве. Дынный путь описан в
книге Дж. Рихтера "Windows для
профессионалов".
|
Copyright ©
"Мастера DELPHI" E-mail:
delphi@mastak.com
http://www.delphimaster.ru |
Источник получения информации: http://www.delphimaster.ru
|