powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Работа с памятью x86 приложения из x64
2 сообщений из 2, страница 1 из 1
Работа с памятью x86 приложения из x64
    #39768835
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
запускаемое 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
Работа с памятью x86 приложения из x64
    #39768848
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все, разобрался.
Надо проверять какая архитектура у запускаемого приложения, и если оно x86 - приводить результат ImageLoad к типу PloadedImage, у которого FileHeader будет иметь тип PImageNtHeaders32.

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

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


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