Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Работа с памятью x86 приложения из x64 / 2 сообщений из 2, страница 1 из 1
03.02.2019, 10:46
    #39768835
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с памятью x86 приложения из x64
запускаемое x86 из своего x86 читается и модифицируется без проблем. Специально проверил, то же самое для x64-x64 (хотя мне и не надо патчить x64 приложение, только x86).
А вот читать и писать в память x86 приложения из своего x64 - никак.

Кратко - сначала получаю инфу по образу приложения, чтобы узнать размеры кода и данных. Потом запускаю процесс с флагом SUSPENDED. Пытаюсь вычитать память, получаю ошибку 998 ERROR_NOACCESS

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
type
  TClientImage = record
    codeBase : Pointer;
    codeSize : SIZE_T;

    rdataBase : Pointer;
    rdataSize : Cardinal;

    dataBase : Pointer;
    dataSize : SIZE_T;

    rdataBuff : Pointer;
    dataBuff :  Pointer;
    codeBuff :  Pointer;

    hProcess : THandle;
  end;


var
  cln : TClientImage;
  LoadedImage : PLoadedImage;
...
  LoadedImage := ImageLoad(PAnsiChar(AnsiString(client.FullPath)),nil);
...//проверки

  FillChar(cln, SizeOf(cln), 0);
  cln.codeBase := Pointer(LoadedImage.FileHeader.OptionalHeader.BaseOfCode + LoadedImage.FileHeader.OptionalHeader.ImageBase);
  cln.codeSize := LoadedImage.FileHeader.OptionalHeader.SizeOfCode;

  CreateProcessResult := CreateProcess(nil, PChar(CMDLine), nil, nil, False, CREATE_DEFAULT_ERROR_MODE or CREATE_UNICODE_ENVIRONMENT or CREATE_SUSPENDED, nil, PChar(ExtractFilePath(client.FullPath)), s_i, p_i);
  if CreateProcessResult then
  begin
    cln.hProcess := p_i.hProcess;

    GetMem(cln.codeBuff, cln.codeSize);
    GetMem(cln.dataBuff, cln.dataSize);

      BytesReaded := 0;
      Res := ReadProcessMemory(cln.hProcess, cln.codeBase, cln.codeBuff, cln.codeSize, BytesReaded);
...
      if cln.codeSize <> bytesReaded then
        LastErrorCode := GetLastError;
//в Res - False, в LastError - 998.



Добавлял флаг DEBUG_PROCESS в CreateProcess, не помогло.
LoadedImage.FileHeader.OptionalHeader.BaseOfCode при загрузке из x86 и x64 одинаковый (что логично)
При загрузке из x86 LoadedImage.FileHeader.OptionalHeader.ImageBase = $400000, а из x64 =$40000000264000

Подскажите, в какую сторону копать? Не хочется городить костыли и выносить весь патчинг памяти в отдельное приложение.
...
Рейтинг: 0 / 0
03.02.2019, 11:31
    #39768848
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с памятью x86 приложения из x64
все, разобрался.
Надо проверять какая архитектура у запускаемого приложения, и если оно x86 - приводить результат ImageLoad к типу PloadedImage, у которого FileHeader будет иметь тип PImageNtHeaders32.

Можно еще проще - проверять у результата из ImageLoad размер из FileHeader.FileHeader.SizeOfOptionalHeader и если отличается - приводить к нужному типу.

И сразу все становится правильно.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Работа с памятью x86 приложения из x64 / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]