Перейти к содержанию

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


Рекомендуемые сообщения

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

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

Привет Всем! Программирую в 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 и таким образом можно писать трейнер по поинтерах ))) ну это я так )) ведь в интернете не искал инфы ... а способ сам придумал ....)))

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Посмотрел исходник, но по значению приставки "****.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/

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

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

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

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

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

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

Outlast базовый $00060000

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

GTA Vice City - 100% = $400000

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

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

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

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

  • 2 года спустя...

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

Так и не смог понять как в 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!

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

Для 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. Кто поможет и подскажет буду благодарен!

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

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.