Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 01.10.2015
Сообщений: 23

Трейнер для DMA игры

01.10.2015, 06:04. Показов 2839. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую.
Имеется игра с динамическими адресами. Все указатели уже найдены.
Начало (ArtMoney) указывает на модуль игры glk.exe и адрес модуля 358CA0.
Получается glk.exe + 358CA0
Каким образом записать это в дельфи код? (не знаю как записать модуль)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.10.2015, 06:04
Ответы с готовыми решениями:

Работа с адресами (трейнер)
люди добрые помогите ..шапка трейнера var Form2: TForm2; ProcName: string; Dummy: Cardinal; ProcessId, GameHandle:...

Для каждой игры определить словесный результат игры (выигрыш, проигрыш или ничья)
Помогите решить задачу В одном массиве записано количество мячей, забитых футбольной командой в каждой из n игр, в другом – количество...

Трейнер для игры
Привет всем! Мне нужно создать трейнер для игры(любой игры), например GTA San Andreas, что для этого нужно?

15
446 / 374 / 133
Регистрация: 09.09.2011
Сообщений: 1,346
01.10.2015, 23:41
Более понятно опишите проблему. Что вы в итоге хотите сделать? какой код вам нужно записать?
0
39 / 39 / 11
Регистрация: 05.09.2015
Сообщений: 262
01.10.2015, 23:52
OpenProcess() | ReadProcessMemory() | WriteProcessMemory() ?
0
0 / 0 / 0
Регистрация: 01.10.2015
Сообщений: 23
02.10.2015, 05:22  [ТС]
Ок, спасибо, что откликнулись, опишу подробно.
Вот структура:
1) "glk.exe + 358CA0" = 10D2CA0 (Получили адрес указателя)
2) 10D2CA0 = 0B960EC0 + 148 = B961008 ( Считали из 10D2CA0 указатель, добавили смещение 148 и получили финальный адрес B961008, значение которого равно 100)

В случае нахождения адреса из простого указателя все просто:
ReadProcessMemory(HandleWindow,ptr($10D2 CA0),Addr(Pointer1),4,read);
ReadProcessMemory(HandleWindow,ptr(Point er1+$148),Addr(FinAdress),4,read);

Проблема в том, что я не знаю как считать с помощью дельфи кода "glk.exe + 358CA0", в котором содержится указатель на 10D2CA0.
Пробовал подставлять вместо glk.exe HandleWindow и ThreadId, но не получилось. (что логично)
Никак не могу найти решение, просьба помочь
0
446 / 374 / 133
Регистрация: 09.09.2011
Сообщений: 1,346
02.10.2015, 10:58
я конечно не знаком с жаргоном людей занимающихся исследованием памяти запущенных процессов, но для обычного человека - glk.exe - это имя файла (ваш К.О.) и от него отсчитывать смещения в оперативной памяти невозможно (ваш К.О. x2), смещение можно отсчитывать, только от другого, уже известного, адреса памяти (К.О. x3!!! bingo!).

Очевидно, под glk.exe - понимается одна из известных "точек" процесса, которую легко найти в памяти процесса, например начало сегмента данных, начало сегмента кода, вершина стека процесса, entry point процесса, начало "кучи" ит.д.
кроме того есть еще понятие IMAGE_BASE процесса (не уверен что это здесь применимо).

Для решение Вашей проблемы, я вижу 3 возможности:
1. ждать пока в тему зайдет человек, который владеет той же понятийной системой - и для которого glk.exe это понятное место в запущенном процессе. И тогда он Вам может подсказать.
2. Вы спросите про это у человека, который Вам указал на конкретное смещение - я уверен, что этот человек не Вы и он точно знает от чего он отсчитывал смещение.
3. маловероятный - исходя из цитаты: "я не знаю как считать с помощью дельфи кода "glk.exe + 358CA0" ", Вы возможно знаете как это сделать без делфи. Расскажите как Вы это делаете и мы подскажем, как это реализовать в делфи!
0
0 / 0 / 0
Регистрация: 01.10.2015
Сообщений: 23
02.10.2015, 11:20  [ТС]
Да, glk.exe это и есть имя файла.
Мне на смещения указал я сам, путем поиска указателей
Вообще, в игре нужно найти аж три указателя, чтобы выйти на финальный адрес.
Если открыть процесс glk.exe в дельфи, то по адресу 358CA0 ничего не содержится.

То есть я нахожу сначала динамический адрес, потому постепенно, указатель за указателем подхожу к статическому адресу, который обозначен как "glk.exe + 358CA0". Все предыдущие указатели выглядят нормально, обычный адрес, к примеру 10D2CA0. А в этом случае добавился еще и glk.exe. Если посмотреть память в ассемблере, то там можно найти точно такой же указатель "glk.exe + 358CA0". Если ввести этот указатель (прямо с именем файла) в ArtMoney или CheatEngine, то они понимают его и сразу же считывают из него следующий указатель.
0
446 / 374 / 133
Регистрация: 09.09.2011
Сообщений: 1,346
02.10.2015, 12:33
Как Вы искали указатели??? Правильно ли я понимаю, что исходного кода glk.exe у Вас нет?
Если открыть процесс glk.exe в дельфи, то по адресу 358CA0 ничего не содержится.
это очевидно, т.к. 358CA0 не адрес, а смещение. Вы же сами написали об этом.
0
0 / 0 / 0
Регистрация: 01.10.2015
Сообщений: 23
02.10.2015, 12:44  [ТС]
Конечно исходного кода нет, я просто смотрю, что обращается к этому динамическому адресу, и нахожу статическое обращение.
358CA0, да это смещение, и ничего не содержит. Я просто подробно объяснил на всякий случай.

Мне просто нужно вставить ReadProcessMemory(HandleWindow,ptr(СЮДА),Addr(Pointer1),4,read); вот это "glk.exe + 358CA0"
Проще не знаю как..
0
446 / 374 / 133
Регистрация: 09.09.2011
Сообщений: 1,346
02.10.2015, 12:54
Подозреваю - что под glk.exe у Вас понимается EntryPoint
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
02.10.2015, 13:04
В.Иванов. Искусство изменения GTA. - ПРОграммист, №5.
0
446 / 374 / 133
Регистрация: 09.09.2011
Сообщений: 1,346
02.10.2015, 13:16
ну смотри, вот я открыл свои программу в дебаггере OllyDB

Я открыл окно "Executable modules" и вижу, что адрес EntryPoint моего процесса 005522300.
Как его найти? - При создании exe-файла (да и dll) в PE заголовок прописывается IMAGE_BASE - адрес куда будет загружен модуль (начиная с PE заголовка). В lazarus/freepascal IMAGE_BASE=00400000 (для 32 bit) в delphi не знаю какой image_base. Дальше в PE заголовке прописано смещение до входной точки, в моем случае это 152300, это смещение от IMAGE_BASE, т.е. получается 00400000 + 152300 = 00552300 нашего процесса.

Таким образом адрес EntryPoint можно узнать, просто проанализировав PE заголовок (его формат описан и наверняка уже есть готовые функции для его разбора).

Далее, берете рассчитанный EntryPoint прибавляете смещение и пробуете туда писать.
Миниатюры
Трейнер для DMA игры  
0
0 / 0 / 0
Регистрация: 01.10.2015
Сообщений: 23
02.10.2015, 16:12  [ТС]
Уже ближе, спасибо
image base как раз то, что нужно. Его можно узнать с помощью PE Tools.
Однако он каждый раз другой.

Как с помощью дельфи прочитать image base?
0
446 / 374 / 133
Регистрация: 09.09.2011
Сообщений: 1,346
05.10.2015, 13:41
Ну вообще пишут, что IMAGE_BASE более менее стандартный, и что только при редких случаях (например если по этому адресу/ам отображается какая то системная библиотека) то загрузчик может в другое место образ загрузить с пересчетом всех адресов.

Посмотри внимательно - действительно ли у тебя IMAGE_BASE меняется каждый раз?

Добавлено через 1 минуту
вот интересная дискуссия по этому поводу на стэковерфлоу - ищи по такой строчке в гугле:

How can I get a process entry point address - Stack Overflow

только читай до самого низа, а то в начале вроде не верное решение предлагают.
0
0 / 0 / 0
Регистрация: 01.10.2015
Сообщений: 23
05.10.2015, 14:05  [ТС]
Да, image base меняется каждый раз.
Кое как нашел рабочую функцию на зарубежном форуме. В интернете было много пустышек, которые не работают.
Трейнер завершен, флай хак работает отлично.

Оставлю функцию здесь, уверен кому нибудь пригодится. (Необходимо подключить библиотеку TlHelp32)

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function GetBasePointerOfModule(ProcessId: dword; Modulename: string): Integer;
var
  FSnapshotHandle: THandle;
  FModulEntry32: MODULEENTRY32;
  s: string;
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
      begin
        repeat
          s := FModulEntry32.szModule;
          if s = Modulename then
          begin
            Result := Integer(FModulEntry32.modBaseAddr);
            break;
          end;
        until (not Module32Next(FSnapshotHandle, FModulEntry32));
      end;
    end;
  finally
    closeHandle(FSnapshotHandle);
  end;
end;
0
0 / 0 / 0
Регистрация: 25.06.2016
Сообщений: 5
31.08.2016, 09:31
А как сделать, чтобы и для x64 битных игр работало?
0
90 / 3 / 0
Регистрация: 05.03.2013
Сообщений: 36
31.08.2016, 17:38
Могу предложить вариант побыстрее, обращение напрямую, а не через рид и врайт мемори.

1. Открываем Delphi и создаем новый проект.
File => New => Other... => Dynamic-link Library

2. Добавим основную форму, где будем работать в дальнейшем.
В окне "Project Manager" ПКМ по "Project1.dll" => "Add New" => "VCL Form" => "Yes".

3. В uses пихаем
Delphi
1
      Windows, Forms;
4. Создаем основной поток, где будет стартовать наша форма

Delphi
1
2
3
4
5
procedure MainThread; stdcall;
begin
  Form1 := TForm1.Create(nil);
  Form1.ShowModal;
end;
5. Запускаем этот поток, добавив выше переменную

Delphi
1
var dwTemp: DWORD;
6. Вызываем наш тред при обращении к библиотеке

Запускаем этот поток, добавив выше переменную

Delphi
1
2
3
begin
CreateThread(nil,dwTemp,@MainThread,nil,dwTemp,dwTemp);
end.
Полный листинг
Кликните здесь для просмотра всего текста
library DLL_Cheat;

{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }

uses
System.SysUtils,
System.Classes,
Windows,
Forms,
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

var dwTemp: DWORD;

procedure MainThread; stdcall;
begin
Form1 := TForm1.Create(nil);
Form1.ShowModal;
end;

begin
CreateThread(nil,dwTemp,@MainThread,nil, dwTemp,dwTemp);
end.


Для обращения к памяти используем

Delphi
1
2
3
BaseAddress:=GetModuleHandle('game.dll'); // Вместо 'game.dll' используете свой базовый адрес
sp:=Ptr(Integer(Ptr(Integer(Ptr(BaseAddress + $00B45EA4)^) + $254)^) + $6C4);
sp^:=strtofloat(edit1.Text); // Тут я думаю понятно, запись нашего значения в нужную ячейку памяти
Форма нам для удобства, накидать туда перключателей, информационных окошек.

Ну а дальше, дело только за инжектом или прокси длл
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.08.2016, 17:38
Помогаю со студенческими работами здесь

Трейнер для игры: использование статичного указателя
Сделал трейнер, но при новом запуске игры байты меняются, нашел что можно сделать через статичный указатель, но это очень не понятно может...

Трейнер для Mount and Blade Warband
создать программку,которая нажимает 'ctrl'+'x' 1000 раз,приложение mount and blade warband,кому не сложно напишите))

USART2(RX+IDLE+DMA)+USART3(TX DMA)
Принимаю по юсарт2, побайтно, на скрости 115200. Пытаюсь передавать по юсарт3 через DMA, скорость 115200. На выходе юсарт3, получаю вот...

STM32F4Discovery - ADC DMA и FSMC DMA
Привет всем. Вынужден опять обратиться за Вашей помощью :) Ситуация такая. 1. Дисплей работает через FSMC. Написал драйвер...

Сборка ПК "для себя" - игры, игры, игры! Киев, бюджет 8300 грн с монитором.
Всем доброго времени суток. 1. Бюджет примерно 8300 грн (с монитором) 2. Украина, г. Киев, намерен покупать на http://rozetka.com.ua/...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru