Сейчас на форуме: tyns777, zds, JustLife (+4 невидимых)

 eXeL@B —› Программирование —› Проблема с написанием трейнера
Посл.ответ Сообщение

Ранг: 9.9 (гость)
Активность: 0.010
Статус: Участник

Создано: 17 апреля 2009 15:16
· Личное сообщение · #1

Всем привет!

У меня возникла проблема с написанием трейнера для игры Claw. Пишу для себя. Эта игра моего детства, мне очень нужна ваша помощь. Сами трейнеры, я уже умею писать, и знаю как они пишутся. Раньше писал трейнер для не-DMA игры, все было норм. Claw - DMA-игра. Она делает в памяти "длинные цепочки" динамических указателей (например, больше 4-ех указателей для значения здоровья), благодаря чему я просто не могу выйти на статический адрес, необходимый для дальнейшей работы трейнера.

Использую программы Delphi + TSearch и + в некоторых случаях ArtMoney.

Помогите решить проблему. Скажите, как можно найти основной адрес, по которому можно найти другие интересующие адреса.

Саму игру можно найти в поисковике по запросу Captain Claw или Капитан Коготь.

Вы получите сразу же множество ссылок, где можно взять игру. Качать немного. Всего 40-60 мб. в архиве.



Ранг: 9.9 (гость)
Активность: 0.010
Статус: Участник

Создано: 17 апреля 2009 15:34
· Личное сообщение · #2

Прямая ссылка, откуда можно скачать игру: link_deleted_by_forum_engine/ru/files/vg4g58lwl



Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 17 апреля 2009 15:46 · Поправил: HiEndsoft
· Личное сообщение · #3

Charm0nt пишет: Она делает в памяти "длинные цепочки" динамических указателей (например, больше 4-ех указателей bpm на эти адреса, смотришь откуда к ним обращение -> инлайн или прямой патч.

-----
продавец резиновых утёнков




Ранг: 9.9 (гость)
Активность: 0.010
Статус: Участник

Создано: 17 апреля 2009 15:52
· Личное сообщение · #4

Я так и делаю. Поэтому и узнал, что длинная цепочка составляется. Только на какому то месте указателей становиться не 1, как должно быть, а 3-4. Это очень усложняет поиски

Я еще работаю над этим, но желаемый результат еще так и не получил.




Ранг: 340.0 (мудрец), 22thx
Активность: 0.120
Статус: Участник
THETA

Создано: 17 апреля 2009 15:56 · Поправил: FrenFolio
· Личное сообщение · #5

В принципе, если не динамические адреса для значений игровых параметров в игре, то как вариант можно найти код, и определить как игра с ними работает, и тогда уже изменять не ячейки памяти, а патчить код самой игры. Либо же скачать готовый трейнер от IRAKiS (+5) для этой игры и посмотреть, как сделано там.
Либо же почитать еще книгу по трейнерам от Guru.exe.

Добавлено позже.
Очепятка. Хотел сказать, конечно же, "если не статические адреса".

-----
Программист SkyNet




Ранг: 9.9 (гость)
Активность: 0.010
Статус: Участник

Создано: 17 апреля 2009 16:17
· Личное сообщение · #6

FrenFolio пишет:
то как вариант можно найти код

Что ты имеешь ввиду? Использовать чит-код?

FrenFolio пишет:
Либо же скачать готовый трейнер от IRAKiS (+5) для этой игры и посмотреть, как сделано там.

Не встречал его. Можешь дать ссылку?

FrenFolio пишет:
Либо же почитать еще книгу по трейнерам от Guru.exe.

Ого. Круто! Даже по трейнерам есть книги! Дай ссылку, пожалуйста, хочу почитать.




Ранг: 568.2 (!), 465thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 17 апреля 2009 16:25
· Личное сообщение · #7

Charm0ntЕсть плаг для олли называется Games Invader с помощью него можно находить значения(с показом их адресов) меняющие в игре размер денег,жизней и тагдлалие..www.megaupload.com/?d=S36CY62D
P.S. Мультик прилогается

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.





Ранг: 147.7 (ветеран), 50thx
Активность: 0.120
Статус: Участник
sv_cheats 1

Создано: 17 апреля 2009 17:18 · Поправил: SER[G]ANT
· Личное сообщение · #8

Charm0nt пишет:
Даже по трейнерам есть книги! Дай ссылку, пожалуйста, хочу почитать.

multi-up.com/81374

З.Ы. сейчас скачаю игрушку и часов после 11 покапаюсь.



Ранг: 107.5 (ветеран)
Активность: 0.150
Статус: Участник

Создано: 17 апреля 2009 20:07 · Поправил: Stack
· Личное сообщение · #9

ClockMan я то думал там бог знает какой плагин, а оно копия артманей.
Если размышлять логически то после узнавания адреса в DMA игре надо поставить брикпоинт на память на чтение и где читает заменить на нужное.

например:
Code:
  1. mov eax, dword ptr[ebx+0F]
  2. -- на --
  3. mov eax, FFFFFFFFh


На практике трейнеров не писал так что если че напутал - киньте камнем.

-----
Md5 fcbb6c9c9a5029b24d70f2d67c7cca74




Ранг: 1.1 (гость)
Активность: 0=0
Статус: Участник

Создано: 17 апреля 2009 20:13
· Личное сообщение · #10

Попробуй программу WGC. Там есть свой отладчик. Поставишь бряк и он покажет откуда было к этому адресу обращение.




Ранг: 340.0 (мудрец), 22thx
Активность: 0.120
Статус: Участник
THETA

Создано: 17 апреля 2009 20:38
· Личное сообщение · #11

Charm0nt пишет:
Что ты имеешь ввиду? Использовать чит-код?

Здесь я подразумеваю, что можно игру декомпилить, и посмотреть названия функций. Довольно часто разрабы дают "говорящие" названия функциям, отвечающим за игровые параметры, наподобие "получить количество жизней", "получить счет" и тп. Узнав, где находится это место в коде игры, можно дальше сделать патч применитльно к коду самой игры, а не изменяя ячейки памяти данных игры. Подобного рода пример привел Stack.
Charm0nt пишет:
Не встречал его. Можешь дать ссылку?

Держи gigapeta.com/dl/186619ad88078

-----
Программист SkyNet




Ранг: 9.9 (гость)
Активность: 0.010
Статус: Участник

Создано: 17 апреля 2009 21:43
· Личное сообщение · #12

Окей, почитаю книгу, попробую сделать что-то.
А этот плагин - действительно копия ArtMoney по функционалу.

Трейнер от IRAKiS (+5) не работает. Постоянно пишет, что игра не запущена.



Ранг: 116.5 (ветеран), 3thx
Активность: 0.070
Статус: Участник

Создано: 17 апреля 2009 22:57
· Личное сообщение · #13

А мож тутор (4 стр.) от MasterGH поможет _hттp://www.chemax.ru/articles/dmc_tutor.php разобратцо.




Ранг: 147.7 (ветеран), 50thx
Активность: 0.120
Статус: Участник
sv_cheats 1

Создано: 17 апреля 2009 23:04 · Поправил: SER[G]ANT
· Личное сообщение · #14

Charm0nt пишет:
Она делает в памяти "длинные цепочки" динамических указателей (например, больше 4-ех указателей для значения здоровья), благодаря чему я просто не могу выйти на статический адрес, необходимый для дальнейшей работы трейнера.


Вот тебе бесконечное здоровье:
Code:
  1. 00494321: E9FC700700               jmp 0050B422h
  2. 00494326: 90                       nop eax
  3. ;
  4. 0050B422: C7802801000064000000     mov [eax+00000128h], 00000064h
  5. 0050B42C: 8B8028010000             mov eax, [eax+00000128h]
  6. 0050B432: E9EF8EF8FF               jmp 00494326h

Что тут к чему поймешь как прочтешь любую статью о DMA из книжки которую я выложил постом выше. Ведь все равно придется ее читать.



Ранг: 9.9 (гость)
Активность: 0.010
Статус: Участник

Создано: 17 апреля 2009 23:10
· Личное сообщение · #15

Честно говоря действительно не понял
Ты предложил наверное какой то другой вариант, который мне не известный пока что.
Иду почитаю книжку.



Ранг: 9.9 (гость)
Активность: 0.010
Статус: Участник

Создано: 17 апреля 2009 23:19
· Личное сообщение · #16

Это Code Injection наверное. Если да, - тогда я эту тему еще не затрагивал. Пойду читать. Спасибо большое тебе!!!




Ранг: 147.7 (ветеран), 50thx
Активность: 0.120
Статус: Участник
sv_cheats 1

Создано: 18 апреля 2009 00:10 · Поправил: SER[G]ANT
· Личное сообщение · #17

Ой.. забыл написать как я это все нашел. Качаем Cheat Engine. Ищем адрес с жизнями как в TSearch или ArtMoney. Нашли, кликаем 2 раза по нему и он добавляется в список. Затем, нажимаем правой кнопкой мыши на него и выбираем "Find out what accesses this address". Заходим в игру и не делаем ничего такого чтобы значение жизней изменились, можно просто стоять на месте, можно немного побегать. Сворачиваем на Cheat Engine и видем всплывшее окно, там 2 инструкции
Code:
  1. code :00494321 - 8b 80 28 01 00 00  - mov eax,[eax+00000128]
  2. code :004943e0 - 8b 82 28 01 00 00  - mov eax,[edx+00000128]

Ну а дальше... Code Injection.

Можно использовать не CE, а AutoHack в TSerach, но TS давным давно устарел, а CE намного функиональней и продолжает развиваться.

Valemox
Та ну его.. слишком заумно объясняет ;P




Ранг: 138.1 (ветеран)
Активность: 0.090
Статус: Участник
Одепт ЭкзэЛаба

Создано: 18 апреля 2009 10:59
· Личное сообщение · #18

2 Топик стартер
напиши мне в личку, глюки вас обучит азам геймхака. ^_^



Ранг: 6.8 (гость)
Активность: 0.010
Статус: Участник

Создано: 18 апреля 2009 14:37
· Личное сообщение · #19

пиши тут. Мне тоже интересно. Или ты будешь каждому индивидуально разъяснять?




Ранг: 138.1 (ветеран)
Активность: 0.090
Статус: Участник
Одепт ЭкзэЛаба

Создано: 18 апреля 2009 18:20
· Личное сообщение · #20

Не сочтите за пеар, но гляньте в моем блоге на этом форуме мою же статью о взломе игры дум 3. Я там максимально расжевал материал.



Ранг: 9.9 (гость)
Активность: 0.010
Статус: Участник

Создано: 20 апреля 2009 17:31
· Личное сообщение · #21

Я немного начал разбираться в Code Injections. У меня возник такой вопрос: как с помощью Code Injections установить значение жизни героя в необходимое (скажем, 100), но чтобы оно далее изменялось. Я читал статьи, в которых рассказывалось, как заморозить значение. Это понятно. Но как один раз установить значение, и дать ему изменяться и эффективно ли это делать с помощью Code Injections?




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 20 апреля 2009 18:58
· Личное сообщение · #22

Измени 1 раз и не делай инжектов вообще или верни на место код, если уже наставил инжекты, в чём сложность то.



Ранг: 9.9 (гость)
Активность: 0.010
Статус: Участник

Создано: 20 апреля 2009 20:23
· Личное сообщение · #23

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

Archer пишет:
или верни на место код, если уже наставил инжекты

Получается, что в трейнере я должен реализовать что то подобное такому: "Нажмите кнопку Добавить жизни, потом войдите в игру, подеритесь с кем нибудь, опять вернитесь в данное окно и нажмите ОК".

Когда нажимаем кнопку Добавить жизни - изменяем код на наш. Потом жмем ОК - восстанавливаем код. Мне это не очень подходит. Или я не правильно понял?




Ранг: 138.1 (ветеран)
Активность: 0.090
Статус: Участник
Одепт ЭкзэЛаба

Создано: 20 апреля 2009 20:45
· Личное сообщение · #24

Charm0nt пишет:
Получается, что в трейнере я должен реализовать что то подобное такому: "Нажмите кнопку Добавить жизни, потом войдите в игру, подеритесь с кем нибудь, опять вернитесь в данное окно и нажмите ОК".

Когда нажимаем кнопку Добавить жизни - изменяем код на наш. Потом жмем ОК - восстанавливаем код. Мне это не очень подходит. Или я не правильно понял?


Ну зачем так извращаться можно единожды увеличить жизнь, а потом на автомате восстановить код без помощи юзера. Можно даже имхо с таймером попробовать, который бы сам код восстановит.



Ранг: 9.9 (гость)
Активность: 0.010
Статус: Участник

Создано: 20 апреля 2009 22:34
· Личное сообщение · #25

g-l-u-k пишет:
Ну зачем так извращаться можно единожды увеличить жизнь, а потом на автомате восстановить код без помощи юзера.

В этом проблема. Я не знаю как.
g-l-u-k пишет:
Можно даже имхо с таймером попробовать, который бы сам код восстановит.

Да, можно попробовать. Хотя это не самый лучший вариант.




Ранг: 138.1 (ветеран)
Активность: 0.090
Статус: Участник
Одепт ЭкзэЛаба

Создано: 21 апреля 2009 02:27
· Личное сообщение · #26

Charm0nt пишет:
Да, можно попробовать. Хотя это не самый лучший вариант.

ну почему же, если ты волнуешься за производительность, то все будет в норме. Еще ты можешь тупо вставить тот же самый Sleep. Юзер жмет кнопку, увеличивает себе жизнь, далее идет sleep, а затем код патченный востанавливаешь оригинальным.



Ранг: 9.9 (гость)
Активность: 0.010
Статус: Участник

Создано: 21 апреля 2009 13:28
· Личное сообщение · #27

Ну ок. А как реализовать это без таймера?




Ранг: 147.7 (ветеран), 50thx
Активность: 0.120
Статус: Участник
sv_cheats 1

Создано: 21 апреля 2009 14:43 · Поправил: SER[G]ANT
· Личное сообщение · #28

Charm0nt
вы же сами говорите что используете Delphi... не понимаю, какие могут быть проблемы или вы просто где-то прочитали, что есть такая программа, называется Delphi - это тоже самое что и Trainer Maker Kit
Ну, рассмотрим на примере моих 14 и17 сообщений в этой теме, где я показал как сделать бесконечное здоровье.

Вы используете Tsearch, в данной программе есть прекрасная вещь как "EASYWRITE INTERPRETER" в нем пишем скрипт:
Code:
  1. ;Скрипт бесконечного здоровья
  2. ;адрес с инструкцией отвечающая за жизни
  3. offset 00494321
  4. ;прыжек на Code-Cave
  5. jmp 0050B422
  6. ;nop, т.к. "mov eax,[eax+00000128]" занимает 6 байт,
  7. ;а "jmp 0050B422" 5 байт
  8. nop
  9. ;Code-Cave
  10. offset 0050B422
  11. ;записываем значение "64" (HEX 64 = DEC 100)
  12. ;в адрес с жизнями
  13. mov dword ptr [eax+00000128],0x64
  14. ;восстанавливаем стандартную инструкцию игры
  15. mov eax,[eax+00000128]
  16. ;прыгаем обратно в коды игры 00494321 + 5
  17. jmp 00494326h
  18. ;
  19. ;Отмена скрипта
  20. offset 00494321
  21. mov eax, [eax+00000128]


Жмем кнопку "Tmk" и получаем наш скрипт в виде HEX значений:

Code:
  1. ;Poke xxxxxx - адрес
  2. ; xx xx xx - hex значение записываемое в данный адрес
  3. Poke 494321 E9 FC 70 07 00 90
  4. Poke 50B422 C7 80 28 01 00 00 64 00 00 00 8B
  5. Poke 50B42D 80 28 01 00 00 E9 EF 8E F8 FF
  6. ;
  7. ;Отмена
  8. Poke 494321 8B 80 28 01 00 00

Теперь приведу это все на примере старинного движка который я использовал, писав трейнеры на Delphi. Сам движек не фонтан, но для простых игр сойдет (Окно трейнера сами напишите)


uses
Windows, Messages;
//
const
GameWndName = 'НАЗВАНИЕ_ОКНА_ИГРЫ';
//
procedure Patch(Address: Cardinal; Bytes: Array Of Byte);
var
hWin: hWnd;
ProcId: Cardinal;
hProc: THandle;
NBW: Cardinal;
begin
hWin:= FindWindow(nil, GameWndName);
GetWindowThreadProcessId(hWin, @ProcId);
hProc:= OpenProcess(Process_All_Access, False, ProcId);
WriteProcessMemory(hProc, Ptr(Address), @Bytes[0], Length(Bytes), NBW);
CloseHandle(hProc);
end;
//
//Бессмертие
procedure Health;
begin
Patch($494321, [$E9,$FC,$70,$07,$00,$90]);
Patch($50B422, [$C7,$80,$28,$01,$00,$00,$64,$00,$00,$00,$8B]);
Patch($50B42D, [$80,$28,$01,$00,$00,$E9,$EF,$8E,$F8,$FF]);
end;
//
//Отмена Бессмертия
procedure UnHealth;
begin
Patch($494321, [$8B,$80,$28,$01,$00,$00]);
end;
//
procedure BindKey;
begin
if (GetAsyncKeyState(VK_F1) <> 0) then Health;
if (GetAsyncKeyState(VK_F2) <> 0) then UnHealth;
end;
//
begin
SetTimer(0, 0, 10, @BindKey);
end.

Данным способом, при нажатии на кнопку "F1" у вас будет постоянно 100 жизней, а при нажатии "F2" мы восстановим стандартную инструкцию игры и жизни снова будут уменьшаться при получении урона вашим персонажем.
Но, если вы хотите чтобы при нажатии на опцию жизни восстанавливались и могли уменьшаться, то стоит немножко изменить всего лишь одну процедурку.


//Бессмертие
procedure Health;
begin
Patch($494321, [$E9,$FC,$70,$07,$00,$90]);
Patch($50B422, [$C7,$80,$28,$01,$00,$00,$64,$00,$00,$00,$8B]);
Patch($50B42D, [$80,$28,$01,$00,$00,$E9,$EF,$8E,$F8,$FF]);
//задержка в 100 милисекунд
Sleep(100);
//Отмена Бессмертия
Patch($494321, [$8B,$80,$28,$01,$00,$00]);
end;



Ранг: 9.9 (гость)
Активность: 0.010
Статус: Участник

Создано: 21 апреля 2009 15:13
· Личное сообщение · #29

SER[G]ANT, спасибо за код, я начинаю понимать лучше.
Спасибо большое, что помогли мне заработать опыт в программировании!
Особая благодарность g-l-u-k и SER[G]ANT!

Тему можно закрывать. Еще раз всем спасибо!




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 21 апреля 2009 17:54
· Личное сообщение · #30

Тему закрыть может и автор, кнопка Закрыть тему под кнопкой Отправить сообщение.


 eXeL@B —› Программирование —› Проблема с написанием трейнера
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати