Author Topic: Получение адреса DLL в памяти чужой программы (для нахождения БА)  (Read 1786 times)

0 Members and 1 Guest are viewing this topic.

ya12

  • Активный участник
  • ***
  • Posts: 165
    • View Profile
Поскольку прошлую тему удалили, выкладываю еще раз.

Получение базового адреса (БА) от адреса загруженной в память DLL.

Delphi7
Code: (Delphi7) [Select]
// Основное тело функции, идет на экспорт, вызывается из кликера

function execute(_mas: pInteger; _size: Integer): Integer; export; stdcall;
type
  pIntArr = array[0..0] of Integer;
var
  Snap: THandle;
  M32: TModuleEntry32;
  st,st1: string;
begin
  result:=0;
  st := 'Engine.dll';   
  // имя DLL которую нужно найти, чувствительно к регистру.
  // _mas  - указатель на начало массива параметров integer
  // _size - размер массива (число параметров)

  Snap := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pIntArr(_mas^)[0]);
  //if (Snap = 0) then
    //Exit;

  //ShowMessage(intTostr(snap));
  if Module32First(Snap, M32) then
    begin
      repeat
        st1:=M32.szModule;
        //ShowMessage(st1);
        if st1 = st then
          begin
            //ShowMessage(intTostr(Cardinal(M32.modBaseAddr)));
            Result := Cardinal(M32.modBaseAddr); //
            Break;
          end;
      until not Module32Next(Snap, M32);
    end;
  CloseHandle(Snap);
end;
//------------------------------------------------------------------------------

// список экспорта
exports execute;

begin
  // тело пусто
end.


Code: (clickermann) [Select]
      $_pid=HGETPID($_hwnd)
      call("BA_Engine.dll",$_pid)
      $_adr_Engine = $_return1

Поиск BA и смещения выполняется Cheat Engine.
Данные в памяти программы можно визуально определить и структурировать в шаблон с помощью ReClass2016.
https://disk.yandex.ru/d/YsInZJ3jJEh5GQ

Динамический массив в памяти выглядит так:

абсолютный адрес        указатель на начальный адрес
00000000                       <какое то число похожее на адрес>
00000001                       <число от 0 и больше; 0-первый элемент массива>

Увеличивая и уменьшая количество объектов хранящихся в динамическом массиве можно найти адрес, где храниться счетчик массива. В СЕ ищем инструкцию обращающуюся к этому адресу.
Для каждой найденной инструкции смотрим дизассемблер и пытаемся проследить как формируется адрес где хранится счетчик массива. Если результат записывается не в один и тот же регистр, то цепочка смещений разматывается легко.
Если до БА цепочка смещений не просматривается, то адрес до которого удалось определить смещения ищется в СЕ, определяются и дизассемблируются инструкции .

В итоге должно получится:
[[адр.DLL+смещение]+смещение]+смещение и тд]=счетчик массива

[0а00с561]=содержимое памяти с адресом 0а00с561

https://disk.yandex.ru/d/abXrHf4jzqJLyQ
По ссылке образец структурирования данных в памяти, смотреть через ReClass - Edit - Start_TO или Start_User.
TO - таблица объектов, не все объекты в таблице имеют тип User
User - указатель на таблицу персонажа, у моба структура аналогичная
« Last Edit: June 23, 2022, 01:10:36 PM by ya12 »