chips777 Опубликовано 17 ноября, 2013 Поделиться Опубликовано 17 ноября, 2013 Привет Всем! Программирую в delphi, хочу читать и записывать в игре значения через указатель. Посмотрел видеоурок kenga "Читаем указатели C". Вроде все понял, нашел сканером указатель (по второму варианту) и тут возник вопрос в строке базовый адрес значение вида: "GTAIV.exe"+0093D584, где 0093D584-постоянное значение, а значение "GTAIV.exe" меняется после перезагрузки игры. Объясните профессионалы, что значит запись вида "GTAIV.exe"+0093D584 и как находить базовый адрес в таком случае, для использования в моем приложении. Ссылка на комментарий Поделиться на другие сайты Поделиться
DenkA003 Опубликовано 17 ноября, 2013 Поделиться Опубликовано 17 ноября, 2013 Привет Всем! Программирую в delphi, хочу читать и записывать в игре значения через указатель. Посмотрел видеоурок kenga "Читаем указатели C". Вроде все понял, нашел сканером указатель (по второму варианту) и тут возник вопрос в строке базовый адрес значение вида: "GTAIV.exe"+0093D584, где 0093D584-постоянное значение, а значение "GTAIV.exe" меняется после перезагрузки игры. Объясните профессионалы, что значит запись вида "GTAIV.exe"+0093D584 и как находить базовый адрес в таком случае, для использования в моем приложении."GTAIV.exe" - это базовый адрес .. а приставка +0093D584 это число которое прибавляеться к базовому адресу .... чтобы найти базовый адрес юзай программу PEiD или в СЕ просто перейди по адресу "GTAIV.exe" вот и будет тебе базовый адресс ....С Указателями все не так просто )) сам програмирую на делпхи .... была морока с указателями ... ну я решыл ее )))например :Смотри тут начальный адрес это SaintsRow4.exe + смещение ..... этот адрес , а точнее его значение указывает на адрес 513D8000 а адрес 513D8000 точнее его значение + 398 будет равно 3D16F0EC делай вывод нужно читать адреса функцией ReadProcessMemory и все найденные значение переводить в Hex значение тоисть 1362984960 = 513D8000 и таким образом можно писать трейнер по поинтерах ))) ну это я так )) ведь в интернете не искал инфы ... а способ сам придумал ....))) Ссылка на комментарий Поделиться на другие сайты Поделиться
chips777 Опубликовано 17 ноября, 2013 Автор Поделиться Опубликовано 17 ноября, 2013 Спасибо за подробный ответ. Подскажи как же мне написать функцию для нахождения базового адреса, чтобы не юзать PEiD? Можно ли посмотреть какой нибудь пример из твоих работ с указателями на делфи? Ссылка на комментарий Поделиться на другие сайты Поделиться
DenkA003 Опубликовано 17 ноября, 2013 Поделиться Опубликовано 17 ноября, 2013 Спасибо за подробный ответ. Подскажи как же мне написать функцию для нахождения базового адреса, чтобы не юзать PEiD? Можно ли посмотреть какой нибудь пример из твоих работ с указателями на делфи?Дружище ну очень много мороки ))) завтра в 5 утра вставать ... жди до следующей суботы !только в конце недели освобожусь ((( Ссылка на комментарий Поделиться на другие сайты Поделиться
Vlad2 Опубликовано 18 ноября, 2013 Поделиться Опубликовано 18 ноября, 2013 Если ты хочешь избавиться от приставки "GTAIV.exe",то просто к 0093D584 прибавь 400000 и получиться 00D3D584 и этот адрес будет ровняться адресу "GTAIV.exe"+0093D584. Ссылка на комментарий Поделиться на другие сайты Поделиться
chips777 Опубликовано 18 ноября, 2013 Автор Поделиться Опубликовано 18 ноября, 2013 Влад, проверил твой совет, не помогло. Значение приставки "GTAIV.exe" каждый раз изменяется, после перезагрузки игры.Так и не понял, что это за адрес и как его можно найти используя язык программирования. Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 18 ноября, 2013 Поделиться Опубликовано 18 ноября, 2013 Влад, проверил твой совет, не помогло. Значение приставки "GTAIV.exe" каждый раз изменяется, после перезагрузки игры.Так и не понял, что это за адрес и как его можно найти используя язык программирования.Это модуль. Тебе нужно читать про структуру MODULEENTRY32. Ссылка на комментарий Поделиться на другие сайты Поделиться
DenkA003 Опубликовано 18 ноября, 2013 Поделиться Опубликовано 18 ноября, 2013 Влад, проверил твой совет, не помогло. Значение приставки "GTAIV.exe" каждый раз изменяется, после перезагрузки игры.Так и не понял, что это за адрес и как его можно найти используя язык программирования.Сейчас набросаю по быстрому пример Ссылка на комментарий Поделиться на другие сайты Поделиться
Laziz Опубликовано 18 ноября, 2013 Поделиться Опубликовано 18 ноября, 2013 Сейчас набросаю по быстрому примерЧто... Уже неделя прошло? Ссылка на комментарий Поделиться на другие сайты Поделиться
DenkA003 Опубликовано 18 ноября, 2013 Поделиться Опубликовано 18 ноября, 2013 Что... Уже неделя прошло? да нет на роботу после 3 дня )) можно посидеть пиписать )) Ссылка на комментарий Поделиться на другие сайты Поделиться
chips777 Опубликовано 18 ноября, 2013 Автор Поделиться Опубликовано 18 ноября, 2013 Так сейчас поищем инфу. Буду с нетерпением ждать пример) Ссылка на комментарий Поделиться на другие сайты Поделиться
DenkA003 Опубликовано 18 ноября, 2013 Поделиться Опубликовано 18 ноября, 2013 http://www.delphisources.ru/pages/sources/raznoe/2006_year/anti_miner.htmlВот по этому исходнику я делал трейнер по поинтерам ... сорь исходник не сохранил ((( Ссылка на комментарий Поделиться на другие сайты Поделиться
chips777 Опубликовано 18 ноября, 2013 Автор Поделиться Опубликовано 18 ноября, 2013 Посмотрел исходник, но по значению приставки "****.exe" ничего не увидел, да видно это сложная задача. Ссылка на комментарий Поделиться на другие сайты Поделиться
DenkA003 Опубликовано 18 ноября, 2013 Поделиться Опубликовано 18 ноября, 2013 Посмотрел исходник, но по значению приставки "****.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/ Ссылка на комментарий Поделиться на другие сайты Поделиться
chips777 Опубликовано 18 ноября, 2013 Автор Поделиться Опубликовано 18 ноября, 2013 Благодарю за пример!Все правильно, кроме одной вещи не во всех приложениях a:= 400000, это переменная которая зависит от того куда грузит данный exe свои данные.И это был основной вопрос который меня интересовал, который не был затронут.Попробуйте подставить ваш 400000 в другие игры и поймете, что работать не будет. Ссылка на комментарий Поделиться на другие сайты Поделиться
DenkA003 Опубликовано 18 ноября, 2013 Поделиться Опубликовано 18 ноября, 2013 Благодарю за пример!Все правильно, кроме одной вещи не во всех приложениях a:= 400000, это переменная которая зависит от того куда грузит данный exe свои данные.И это был основной вопрос который меня интересовал, который не был затронут.Попробуйте подставить ваш 400000 в другие игры и поймете, что работать не будет.вечером с роботы прийду посижу подумаю )))) пока не могу нужно на роботу бежать )))Только что глянул Saints Row IV базовый $400000Outlast базовый $00060000ну в большенстве )))$400000GTA Vice City - 100% = $400000Заменил b:=5426252 на b:= 100662372; и смещение поменял из $34 на $17C вуаля бесконечные патроны ))) и не думал что так хорошо будет работать код )))не много полазив по форумам увидел решение )))позже кину кодинг Ссылка на комментарий Поделиться на другие сайты Поделиться
chips777 Опубликовано 18 ноября, 2013 Автор Поделиться Опубликовано 18 ноября, 2013 Хорошо! Ссылка на комментарий Поделиться на другие сайты Поделиться
DenkA003 Опубликовано 18 ноября, 2013 Поделиться Опубликовано 18 ноября, 2013 Хорошо!Все дописал)))http://forum.gamehacklab.ru/topic/2403-pointer-trainer-base-address-by-denka003/Отпишись в теме !!! Ссылка на комментарий Поделиться на другие сайты Поделиться
MoL4uN87 Опубликовано 30 августа, 2016 Поделиться Опубликовано 30 августа, 2016 Ссылки не работают! ( Так и не смог понять как в 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! Ссылка на комментарий Поделиться на другие сайты Поделиться
MoL4uN87 Опубликовано 31 августа, 2016 Поделиться Опубликовано 31 августа, 2016 Для 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. Кто поможет и подскажет буду благодарен! Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения