![]() |
eXeL@B —› Программирование —› Проблема с написанием трейнера |
Посл.ответ | Сообщение |
|
Создано: 17 апреля 2009 15:16 · Личное сообщение · #1 Всем привет! У меня возникла проблема с написанием трейнера для игры Claw. Пишу для себя. Эта игра моего детства, мне очень нужна ваша помощь. Сами трейнеры, я уже умею писать, и знаю как они пишутся. Раньше писал трейнер для не-DMA игры, все было норм. Claw - DMA-игра. Она делает в памяти "длинные цепочки" динамических указателей (например, больше 4-ех указателей для значения здоровья), благодаря чему я просто не могу выйти на статический адрес, необходимый для дальнейшей работы трейнера. Использую программы Delphi + TSearch и + в некоторых случаях ArtMoney. Помогите решить проблему. Скажите, как можно найти основной адрес, по которому можно найти другие интересующие адреса. Саму игру можно найти в поисковике по запросу Captain Claw или Капитан Коготь. Вы получите сразу же множество ссылок, где можно взять игру. Качать немного. Всего 40-60 мб. в архиве. ![]() |
|
Создано: 17 апреля 2009 15:34 · Личное сообщение · #2 |
|
Создано: 17 апреля 2009 15:46 · Поправил: HiEndsoft · Личное сообщение · #3 |
|
Создано: 17 апреля 2009 15:52 · Личное сообщение · #4 |
|
Создано: 17 апреля 2009 15:56 · Поправил: FrenFolio · Личное сообщение · #5 В принципе, если не динамические адреса для значений игровых параметров в игре, то как вариант можно найти код, и определить как игра с ними работает, и тогда уже изменять не ячейки памяти, а патчить код самой игры. Либо же скачать готовый трейнер от IRAKiS (+5) для этой игры и посмотреть, как сделано там. ![]() Либо же почитать еще книгу по трейнерам от Guru.exe. Добавлено позже. Очепятка. ![]() ----- Программист SkyNet ![]() |
|
Создано: 17 апреля 2009 16:17 · Личное сообщение · #6 FrenFolio пишет: то как вариант можно найти код Что ты имеешь ввиду? Использовать чит-код? FrenFolio пишет: Либо же скачать готовый трейнер от IRAKiS (+5) для этой игры и посмотреть, как сделано там. Не встречал его. Можешь дать ссылку? FrenFolio пишет: Либо же почитать еще книгу по трейнерам от Guru.exe. Ого. Круто! Даже по трейнерам есть книги! Дай ссылку, пожалуйста, хочу почитать. ![]() |
|
Создано: 17 апреля 2009 16:25 · Личное сообщение · #7 |
|
Создано: 17 апреля 2009 17:18 · Поправил: SER[G]ANT · Личное сообщение · #8 |
|
Создано: 17 апреля 2009 20:07 · Поправил: Stack · Личное сообщение · #9 ClockMan я то думал там бог знает какой плагин, а оно копия артманей. Если размышлять логически то после узнавания адреса в DMA игре надо поставить брикпоинт на память на чтение и где читает заменить на нужное. например: Code:
На практике трейнеров не писал так что если че напутал - киньте камнем. ----- Md5 fcbb6c9c9a5029b24d70f2d67c7cca74 ![]() |
|
Создано: 17 апреля 2009 20:13 · Личное сообщение · #10 |
|
Создано: 17 апреля 2009 20:38 · Личное сообщение · #11 Charm0nt пишет: Что ты имеешь ввиду? Использовать чит-код? Здесь я подразумеваю, что можно игру декомпилить, и посмотреть названия функций. Довольно часто разрабы дают "говорящие" названия функциям, отвечающим за игровые параметры, наподобие "получить количество жизней", "получить счет" и тп. Узнав, где находится это место в коде игры, можно дальше сделать патч применитльно к коду самой игры, а не изменяя ячейки памяти данных игры. Подобного рода пример привел Stack. Charm0nt пишет: Не встречал его. Можешь дать ссылку? Держи gigapeta.com/dl/186619ad88078 ----- Программист SkyNet ![]() |
|
Создано: 17 апреля 2009 21:43 · Личное сообщение · #12 |
|
Создано: 17 апреля 2009 22:57 · Личное сообщение · #13 |
|
Создано: 17 апреля 2009 23:04 · Поправил: SER[G]ANT · Личное сообщение · #14 Charm0nt пишет: Она делает в памяти "длинные цепочки" динамических указателей (например, больше 4-ех указателей для значения здоровья), благодаря чему я просто не могу выйти на статический адрес, необходимый для дальнейшей работы трейнера. Вот тебе бесконечное здоровье: Code:
Что тут к чему поймешь как прочтешь любую статью о DMA из книжки которую я выложил постом выше. Ведь все равно придется ее читать. ![]() |
|
Создано: 17 апреля 2009 23:10 · Личное сообщение · #15 |
|
Создано: 17 апреля 2009 23:19 · Личное сообщение · #16 |
|
Создано: 18 апреля 2009 00:10 · Поправил: SER[G]ANT · Личное сообщение · #17 Ой.. забыл написать как я это все нашел. Качаем Code:
Ну а дальше... Code Injection. Можно использовать не CE, а AutoHack в TSerach, но TS давным давно устарел, а CE намного функиональней и продолжает развиваться. Valemox Та ну его.. слишком заумно объясняет ;P ![]() |
|
Создано: 18 апреля 2009 10:59 · Личное сообщение · #18 |
|
Создано: 18 апреля 2009 14:37 · Личное сообщение · #19 |
|
Создано: 18 апреля 2009 18:20 · Личное сообщение · #20 |
|
Создано: 20 апреля 2009 17:31 · Личное сообщение · #21 Я немного начал разбираться в Code Injections. У меня возник такой вопрос: как с помощью Code Injections установить значение жизни героя в необходимое (скажем, 100), но чтобы оно далее изменялось. Я читал статьи, в которых рассказывалось, как заморозить значение. Это понятно. Но как один раз установить значение, и дать ему изменяться и эффективно ли это делать с помощью Code Injections? ![]() |
|
Создано: 20 апреля 2009 18:58 · Личное сообщение · #22 |
|
Создано: 20 апреля 2009 20:23 · Личное сообщение · #23 Можно и не делать инжектов, если бы знал статический адрес жизни для этой игры. Но мне почему-то его не получается найти. Создаються длинные цепочки. Archer пишет: или верни на место код, если уже наставил инжекты Получается, что в трейнере я должен реализовать что то подобное такому: "Нажмите кнопку Добавить жизни, потом войдите в игру, подеритесь с кем нибудь, опять вернитесь в данное окно и нажмите ОК". Когда нажимаем кнопку Добавить жизни - изменяем код на наш. Потом жмем ОК - восстанавливаем код. Мне это не очень подходит. Или я не правильно понял? ![]() |
|
Создано: 20 апреля 2009 20:45 · Личное сообщение · #24 Charm0nt пишет: Получается, что в трейнере я должен реализовать что то подобное такому: "Нажмите кнопку Добавить жизни, потом войдите в игру, подеритесь с кем нибудь, опять вернитесь в данное окно и нажмите ОК". Когда нажимаем кнопку Добавить жизни - изменяем код на наш. Потом жмем ОК - восстанавливаем код. Мне это не очень подходит. Или я не правильно понял? Ну зачем так извращаться можно единожды увеличить жизнь, а потом на автомате восстановить код без помощи юзера. Можно даже имхо с таймером попробовать, который бы сам код восстановит. ![]() |
|
Создано: 20 апреля 2009 22:34 · Личное сообщение · #25 g-l-u-k пишет: Ну зачем так извращаться можно единожды увеличить жизнь, а потом на автомате восстановить код без помощи юзера. В этом проблема. Я не знаю как. g-l-u-k пишет: Можно даже имхо с таймером попробовать, который бы сам код восстановит. Да, можно попробовать. Хотя это не самый лучший вариант. ![]() |
|
Создано: 21 апреля 2009 02:27 · Личное сообщение · #26 Charm0nt пишет: Да, можно попробовать. Хотя это не самый лучший вариант. ну почему же, если ты волнуешься за производительность, то все будет в норме. Еще ты можешь тупо вставить тот же самый Sleep. Юзер жмет кнопку, увеличивает себе жизнь, далее идет sleep, а затем код патченный востанавливаешь оригинальным. ![]() |
|
Создано: 21 апреля 2009 13:28 · Личное сообщение · #27 |
|
Создано: 21 апреля 2009 14:43 · Поправил: SER[G]ANT · Личное сообщение · #28 Charm0nt вы же сами говорите что используете Delphi... не понимаю, какие могут быть проблемы или вы просто где-то прочитали, что есть такая программа, называется Delphi - это тоже самое что и Trainer Maker Kit ![]() Ну, рассмотрим на примере моих 14 и17 сообщений в этой теме, где я показал как сделать бесконечное здоровье. Вы используете Tsearch, в данной программе есть прекрасная вещь как "EASYWRITE INTERPRETER" в нем пишем скрипт: Code:
Жмем кнопку "Tmk" и получаем наш скрипт в виде HEX значений: Code:
Теперь приведу это все на примере старинного движка который я использовал, писав трейнеры на 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; ![]() |
|
Создано: 21 апреля 2009 15:13 · Личное сообщение · #29 |
|
Создано: 21 апреля 2009 17:54 · Личное сообщение · #30 |
![]() |
eXeL@B —› Программирование —› Проблема с написанием трейнера |
Эта тема закрыта. Ответы больше не принимаются. |