Поскольку прошлую тему удалили, выкладываю еще раз.
Получение базового адреса (БА) от адреса загруженной в память DLL.
Delphi7
// Основное тело функции, идет на экспорт, вызывается из кликера
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.
$_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 - указатель на таблицу персонажа, у моба структура аналогичная