chips777

Базовый адрес указателя вида "GTAIV.exe"+0093D584 в cheat engine

20 сообщений в этой теме

Привет Всем! Программирую в delphi, хочу читать и записывать в игре значения через указатель. Посмотрел видеоурок kenga "Читаем указатели C". Вроде все понял, нашел сканером указатель (по второму варианту) и тут возник вопрос в строке базовый адрес значение вида: "GTAIV.exe"+0093D584, где 0093D584-постоянное значение, а значение "GTAIV.exe" меняется после перезагрузки игры. Объясните профессионалы, что значит запись вида "GTAIV.exe"+0093D584 и как находить базовый адрес в таком случае, для использования в моем приложении.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Привет Всем! Программирую в delphi, хочу читать и записывать в игре значения через указатель. Посмотрел видеоурок kenga "Читаем указатели C". Вроде все понял, нашел сканером указатель (по второму варианту) и тут возник вопрос в строке базовый адрес значение вида: "GTAIV.exe"+0093D584, где 0093D584-постоянное значение, а значение "GTAIV.exe" меняется после перезагрузки игры. Объясните профессионалы, что значит запись вида "GTAIV.exe"+0093D584 и как находить базовый адрес в таком случае, для использования в моем приложении.

"GTAIV.exe" - это базовый адрес .. а приставка +0093D584 это число которое прибавляеться к базовому адресу ....

чтобы найти базовый адрес юзай программу PEiD или в СЕ просто перейди по адресу "GTAIV.exe" вот и будет тебе базовый адресс ....

С Указателями все не так просто )) сам програмирую на делпхи .... была морока с указателями ... ну я решыл ее )))

например :

image.png

Смотри тут начальный адрес это SaintsRow4.exe + смещение ..... этот адрес , а точнее его значение указывает на адрес 513D8000

а адрес 513D8000 точнее его значение + 398 будет равно 3D16F0EC

делай вывод нужно читать адреса функцией ReadProcessMemory и все найденные значение переводить в Hex значение тоисть

1362984960 = 513D8000 и таким образом можно писать трейнер по поинтерах ))) ну это я так )) ведь в интернете не искал инфы ... а способ сам придумал ....)))

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо за подробный ответ. Подскажи как же мне написать функцию для нахождения базового адреса, чтобы не юзать PEiD? Можно ли посмотреть какой нибудь пример из твоих работ с указателями на делфи?

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо за подробный ответ. Подскажи как же мне написать функцию для нахождения базового адреса, чтобы не юзать PEiD? Можно ли посмотреть какой нибудь пример из твоих работ с указателями на делфи?

Дружище ну очень много мороки ))) завтра в 5 утра вставать ... жди до следующей суботы !

только в конце недели освобожусь (((

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если ты хочешь избавиться от приставки "GTAIV.exe",то просто к 0093D584 прибавь 400000 и получиться 00D3D584 и этот адрес будет ровняться адресу "GTAIV.exe"+0093D584.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Влад, проверил твой совет, не помогло. Значение приставки "GTAIV.exe" каждый раз изменяется, после перезагрузки игры.Так и не понял, что это за адрес и как его можно найти используя язык программирования.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Влад, проверил твой совет, не помогло. Значение приставки "GTAIV.exe" каждый раз изменяется, после перезагрузки игры.Так и не понял, что это за адрес и как его можно найти используя язык программирования.

Это модуль. Тебе нужно читать про структуру MODULEENTRY32.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Влад, проверил твой совет, не помогло. Значение приставки "GTAIV.exe" каждый раз изменяется, после перезагрузки игры.Так и не понял, что это за адрес и как его можно найти используя язык программирования.

Сейчас набросаю по быстрому пример

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Сейчас набросаю по быстрому пример

Что... Уже неделя прошло? :mellow:

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Что... Уже неделя прошло? :mellow:

да нет на роботу после 3 дня )) можно посидеть пиписать ))

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Так сейчас поищем инфу. Буду с нетерпением ждать пример)

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Посмотрел исходник, но по значению приставки "****.exe" ничего не увидел, да видно это сложная задача.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Посмотрел исходник, но по значению приставки "****.exe" ничего не увидел, да видно это сложная задача.

Нет тебе повезло )) вот дописал исходник (( мороки было ппц просто (((

В большенстве случаев начальный адрес $400000

Посмотрел исходник, но по значению приставки "****.exe" ничего не увидел, да видно это сложная задача.

Все завершыл .... вот тебе силка на тему

http://forum.gamehacklab.ru/topic/2400-pointer-trainer-by-denka003-example%D1%81%D0%BE%D0%BB%D0%B4%D0%B0%D1%82%D0%B8%D0%BA%D0%B8-2/

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Благодарю за пример!Все правильно, кроме одной вещи не во всех приложениях a:= 400000, это переменная которая зависит от того куда грузит данный exe свои данные.И это был основной вопрос который меня интересовал, который не был затронут.Попробуйте подставить ваш 400000 в другие игры и поймете, что работать не будет.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Благодарю за пример!Все правильно, кроме одной вещи не во всех приложениях a:= 400000, это переменная которая зависит от того куда грузит данный exe свои данные.И это был основной вопрос который меня интересовал, который не был затронут.Попробуйте подставить ваш 400000 в другие игры и поймете, что работать не будет.

вечером с роботы прийду посижу подумаю )))) пока не могу нужно на роботу бежать )))

Только что глянул Saints Row IV базовый $400000

Outlast базовый $00060000

ну в большенстве )))$400000

GTA Vice City - 100% = $400000

Заменил b:=5426252 на b:= 100662372; и смещение поменял из $34 на $17C вуаля бесконечные патроны ))) и не думал что так хорошо будет работать код )))

не много полазив по форумам увидел решение )))

позже кину кодинг

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Хорошо!

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ссылки не работают! (

Так и не смог понять как в Delphi записать [.exe + смещение]

 

Нарыл функцию

 

Скрытый текст

function GetBasePointerOfModule(ProcessId: DWORD; Modulename: string): Int64;
var
  FSnapshotHandle: THandle;
  FModulEntry32: MODULEENTRY32;
begin
  Result := 0;
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessId);
  try
    if FSnapshotHandle <> INVALID_HANDLE_VALUE then
    begin
      FModulEntry32.dwSize := SizeOf(FModulEntry32);
      if Module32First(FSnapshotHandle, FModulEntry32) then
      repeat
        if FModulEntry32.szModule = Modulename then
        begin
          Result := Int64(FModulEntry32.modBaseAddr);
          break;
        end;
      until (not Module32Next(FSnapshotHandle, FModulEntry32));
    end;
  finally
    closeHandle(FSnapshotHandle);
  end;
end; 

 

Но она возвращает 0!

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Для 32bit игр проблема решается function GetModuleBaseAddress(ProcessID: Cardinal; MName: String): Pointer;

 

Скрытый текст

function GetModuleBaseAddress(ProcessID: Cardinal; MName: String): Pointer;
var
  Modules         : Array of HMODULE;
  cbNeeded, i     : Cardinal;
  ModuleInfo      : TModuleInfo; 
  ModuleName      : Array[0..MAX_PATH] of Char;
  PHandle         : THandle;
begin
  Result := nil;
  SetLength(Modules, 1024);
  PHandle := OpenProcess(PROCESS_QUERY_INFORMATION + PROCESS_VM_READ, False, ProcessID); 
  if (PHandle <> 0) then 
  begin
    EnumProcessModules(PHandle, @Modules[0], 1024 * SizeOf(HMODULE), cbNeeded);
    SetLength(Modules, cbNeeded div SizeOf(HMODULE)); 
    for i := 0 to Length(Modules) - 1 do //Start the bucle 
    begin 
      GetModuleBaseName(PHandle, Modules[i], ModuleName, SizeOf(ModuleName)); 
      if AnsiCompareText(MName, ModuleName) = 0 then 
      begin 
        GetModuleInformation(PHandle, Modules[i], @ModuleInfo, SizeOf(ModuleInfo)); 
        Result := ModuleInfo.lpBaseOfDll; 
        CloseHandle(PHandle); 
        Exit; 
      end; 
    end; 
  end; 
end;

 

 

 

Пример использования:

 

Скрытый текст

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, psapi, tlhelp32, StdCtrls;


procedure TForm1.Button1Click(Sender: TObject);
var
  WHandle : HWND;
  PHandle: THandle;
  Address, X, Buffer: DWORD;
  NewValue: Cardinal; 
  ProcessID : Cardinal; 
begin 
  ProcessID := 0; 
  NewValue := $9999;
  WHandle := FindWindow(nil, '32bit.exe');
  if wHandle = 0 then 
  begin
  ShowMessage('Игра не найдена');
  end else 
  begin 
  GetWindowThreadProcessId(WHandle, @ProcessID); 
  Address := Integer(GetModuleBaseAddress(ProcessID, '32bit.exe')) + $смещение;
  lbl1.Caption:='$'+inttohex(Address,8);
  PHandle := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessID);
  ReadProcessMemory(PHandle, Ptr(Address), @Address, 4, X);
  lbl2.Caption:='$'+inttohex(Address,8); //32bit.exe+смещение -> первый указатель
  ReadProcessMemory(PHandle, Ptr(Address + $смещение 2), @Address, 4, X);

  WriteProcessMemory(PHandle,Ptr(Address + $смещение 2),@NewValue,Sizeof(NewValue),X);
  CloseHandle(PHandle);
  end; 
end;

 

 

 

Для 64bit игры function GetModuleBaseAddress - дает 0. Кто поможет и подскажет буду благодарен!

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас