Конференция "WinAPI" » Открытие и чтение данных из процесса (64bit)
 
  • colombo © (21.05.15 15:21) [0]
    Столкнулся с проблемой, при чтении данных из 64 битной программы.
    Открываю процесс, читаю данные, но результат неверный.
    Пробовал создавать 64 битный проект и DebugPrivilege.
    Delphi xe2, win 8.1, 64bit.
    Какие есть особенности при чтении данных из 64bit процесса?
  • p © (21.05.15 19:50) [1]
    Какие данные то, какой процесс открыл 32bit из 64bit, 64bit из 64bitтного?, код покажи то
  • Rouse_ © (21.05.15 20:32) [2]
    Смотря какие данные
  • Rouse_ © (21.05.15 20:34) [3]
    Изучи к примеру вот это: http://rouse.drkb.ru/winapi.php#pmm2
    Читает все что душе угодно
  • colombo © (22.05.15 02:06) [4]
    С чтением из 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 битного процесса?
    Если с кодом все в порядке и теоретически должно работать, буду ковырять программу.
  • Rouse_ © (22.05.15 12:55) [5]
    Формально все правильно.
  • Colombo © (22.05.15 13:50) [6]

    > Формально все правильно.

    Мне посоветовали "поиграться" с типами переменных.
  • Rouse_ © (22.05.15 14:04) [7]
    Нет, тут просто прав на чтение может не быть, вот тебе кусок из моей утилиты:

    //
    //  Функция читает данные с удаленного процесса
    //  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;
  • Colombo © (22.05.15 15:05) [8]
    Спасибо, попробую так.
  • colombo © (27.05.15 21:27) [9]
    Пока не получается, ковыряю дальше.
 
Конференция "WinAPI" » Открытие и чтение данных из процесса (64bit)
Есть новые Нет новых   [134454   +44][b:0][p:0.001]