-
Столкнулся с проблемой, при чтении данных из 64 битной программы. Открываю процесс, читаю данные, но результат неверный. Пробовал создавать 64 битный проект и DebugPrivilege. Delphi xe2, win 8.1, 64bit. Какие есть особенности при чтении данных из 64bit процесса?
-
Какие данные то, какой процесс открыл 32bit из 64bit, 64bit из 64bitтного?, код покажи то
-
Смотря какие данные
-
-
С чтением из 32 битного процесса трудностей не возникало. А вот с 64 возникли сложности. 1- Win8.1 64bit, создаю проект в delphi xe5 (delphi запущена от имени администратора), в качестве targets platforms указываю 64-bit Windows. 2-
var
PID: Cardinal;
ProcessHandle: THandle;
hProcess: SIZE_T;
buf, One_point, BytesCount: SIZE_T;
buf3: Integer;
begin
ProcessHandle := findwindow(nil, 'H1Z1');
GetWindowThreadProcessId(ProcessHandle, @PID);
hProcess := OpenProcess(PROCESS_VM_WRITE or PROCESS_VM_OPERATION or
PROCESS_VM_READ, False, PID);
if hProcess <> 0 then
begin
buf:=0;
One_point :=$142CD8648;
ReadProcessMemory(hProcess, Ptr(One_point), @buf, sizeof(buf), BytesCount);
ReadProcessMemory(hProcess, Ptr(buf+$11D8), @buf, sizeof(buf), BytesCount);
ReadProcessMemory(hProcess, Ptr(buf+$210), @buf3, sizeof(buf3), BytesCount);
Edit1.Text := Floattostr(buf3);
end;
end;
Первое же значение buf не совпадает с тем что считывает например Olly Debugger или другие программы. Пробовал добавлять дебаг привилегии, результат тот же. Вопрос в том, все ли формальные условия соблюдены для чтения 64 битного процесса? Если с кодом все в порядке и теоретически должно работать, буду ковырять программу.
-
Формально все правильно.
-
> Формально все правильно.
Мне посоветовали "поиграться" с типами переменных.
-
Нет, тут просто прав на чтение может не быть, вот тебе кусок из моей утилиты:
// // Функция читает данные с удаленного процесса // in Process - хэндл процесса // in Address - адрес с которого нужно читать // in OutBuffer - буффер в который происходит чтение // in/out Size - размер OutBuffer (после вызова, размер зачитанных данных) // out RegionSize - размер от Address до конца региона // in ReadCondition - параметры чтения // ВАЖНО!!! // Если в настройках не включен флаг SuspendProcess, то ReadCondition // установленный в rcReadAllwais трактуется как rcReadIfReadAccessPresent // ============================================================================= function ReadProcessData(Process: THandle; Address, OutBuffer: Pointer; var Size: NativeUInt; out RegionSize: NativeUInt; ReadCondition: TReadCondition): Boolean; var MBI: TMemoryBasicInformation;
function CanRead: Boolean; begin Result := MBI.State = MEM_COMMIT; if Result then Result := MBI.Protect and ( PAGE_EXECUTE_READ or PAGE_EXECUTE_READWRITE or PAGE_READONLY or PAGE_READWRITE) <> 0; if Result then Result := (MBI.Protect and PAGE_GUARD) = 0; end;
function CanWrite: Boolean; const PAGE_WRITECOMBINE = $400; begin Result := MBI.State = MEM_COMMIT; if Result then Result := MBI.Protect and ( PAGE_EXECUTE_WRITECOPY or PAGE_EXECUTE_READWRITE or PAGE_WRITECOPY or PAGE_READWRITE or PAGE_WRITECOMBINE) <> 0; if Result then Result := (MBI.Protect and PAGE_GUARD) = 0; end;
var dwLength: Cardinal; OldProtect: Cardinal; begin Result := False; if not Settings.SuspendProcess then if ReadCondition = rcReadAllwais then ReadCondition := rcReadIfReadAccessPresent; dwLength := SizeOf(TMemoryBasicInformation); RegionSize := 0; if VirtualQueryEx(Process, Address, MBI, dwLength) <> dwLength then Exit; RegionSize := MBI.RegionSize - (NativeUInt(Address) - NativeUInt(MBI.BaseAddress)); case ReadCondition of rcReadIfReadAccessPresent: if not CanRead then begin Size := 0; Exit; end; rcReadIfReadWriteAccessPresent: if not (CanRead and CanWrite) then begin Size := 0; Exit; end; rcReadAllwais: VirtualProtectEx(Process, MBI.BaseAddress, MBI.RegionSize, PAGE_READONLY, OldProtect); end; if Size > RegionSize then Size := RegionSize; Result := ReadProcessMemory(Process, Address, OutBuffer, Size, Size); if ReadCondition = rcReadAllwais then VirtualProtectEx(Process, MBI.BaseAddress, MBI.RegionSize, OldProtect, OldProtect); end;
-
Спасибо, попробую так.
-
Пока не получается, ковыряю дальше.
|