-
Постов
1 635 -
Зарегистрирован
-
Посещение
-
Победитель дней
55
Тип контента
Профили
Форумы
Загрузки
Блоги
Весь контент keng
-
В который раз подивившись размерам простыни, что я награфоманил вот в [этой] теме, я засел за код и в результате (после пары пакетов молока, конечно же) родился малюсенький трейнми, который учит работать со структурами. Он простой донельзя, но одна заковырочка там всё-таки есть. Вот скриншот: Жмём кнопку "Hit P1" - ранят первого игрока, жмём "Hit P2" - ранят второго. Задача - сделать одного из игроков иммунными к сей заразе. Качаем: keng_trnme.zip
-
Ну какбе если ты с трудом представляешь, что такое структура вообще, давай я тебе попробую показать. Вот, например Struct Player { int id; string name; int health; int ammo } Значит, представим ситуацию, что в неком сферическом игровом (в вакууме) мире есть три персонажа. Все трое описываются структурой Player. Типа вот так: Us = new Playser(1, "teh player", 100, 50); Bot1 = new Player(2, "teh bot1", 100, 50); Bot2 = new Player(2, "teh bot2", 100, 50); Всё три объекта - структуры типа Player. Одинаковые? Ну да, почти. У нашего персонажа поле id равно единичке, а у ботов - двойке. Теперь представим, что нашли мы здоровье нашего перса, воткнули отладчик и нам выползла вот такая функция: 00123456: MOV [EAX+00С],EBX EBX у нас, к примеру, 99 - потому что этой инструкцией игра безжалостно стреляет в персонажей. Значит, EAX хранит базовый адрес структуры того персонажа, в которого стреляют. Предположим, что каждый член структуры имеет размер в 4 байта. Следовательно, здоровье получается как раз по смещению [EAX+00С] (004h+004h+004h = 00Сh). Клёво? Клёво! Соответственно, по смещению [EAX+4] у нас получается ID, а по смещению [EAX+8] - имя персонажа. В общем, фишка в том, что в том же СЕ можно все эти смещения радостно посмотреть, а что ещё круче - сравнить два объекта, в которых какие-то из полей структуры изменились. Теперь представим такое: Struct Venicle { int type; float health; bool isBroken; } Эта вот структура описывает средство передвижения. type - тип средства (марсоход, авианосец, тележка из супермаркета), health - понятно, а вот isBroken говорит нам о состоянии шин (уровня воды под килем в случае крейсера). Оно умеет принимать два значения (потому что тип - bool) - 1 или 0. Соответственно, 0 - всё круто, едем дальше, 1 - всё плохо, сели на мель, алярм упячка и так далее. Значится, взяли мы, пошли на автостоянку - стоит там две машины. Мы нашли адрес здоровья одной из них (стрельнули - unknown float - стрельнули - decreased - стрельнули - менты decreased и т.д.), повесили отладчик, вылезла инструкция: 0054356: FSUB DWORD PTR [EDX+008],EAX Соответственно, всё то же самое - оно отнимает урон у машины, если по ней стрелять или грызть зубами. Не суть важно. Важно то, что [EDX+008] указывает нам на здоровье. Теперь делаем финт ушами - берём значение EAX и идём в Browse Memory Region: 00344999: 00 00 00 01 00 00 C8 42 00 Первые четыре байта - тип машины, следующие четыре - количество здоровья, последний - сломаны ли колёса. Стамим брейкпоинт на функцию причинения тяжких телесных машине, которую мы нашли чуток раньше, стреляем по соседней машине, смотрим в отладчике значение EAX, топаем в Browse Memory Region: 003449A2: 00 00 00 02 00 00 FF FF 01 Смотрим на последний байт, видим единичку, думаем. А НЕ ПРОКОЛЫТЫ ЛИ У ЭТОГО КРЕЙСЕРА КОЛЁСА??? В GTA же в структуре машины будет флажок isPlayerSitting, обозначающий, едет ли игрок на этой машине. Мы находим функцию стрельбы по машинам и меняем её на вот такое: CMP [EAX+1234],0 ;(смещение до isPlayerSitting в структуре машины) JNE EXIT ;Посмотрели, сидим ли мы в машине, если не сидим - выходим, мотороллер не наш MOV [EAX+0FF],0 ;(смещение до isBroken) - явно указываем, что если машина наша - колёса у неё ну вот точно не проколоты EXIT: ;Сюда прыгаем, если машина не наша RET ;Выходим Вот как-то типа того. Надеюсь, понятно написал.
-
Нет, я про пост Uchiha Sasuke - ему не лень было ответить автору, но по факту пост особенной пользы автору не принёс, так что это выглядит довольно иронично на мой взляд.
-
"Лень ответить, но не лень ответить что лень ответить."
-
Повреждение машин - float, прокол шин - byte в структуре машины. Первый адрес ищется за 5 минут, второй - через структуру, полученную при отладке первого.
-
[===| Title |=====================================] [=================================================] [ Star Defender 4 +4 trn==========================] [=================================================] [===| Version |===================================] [=================================================] [ 1.0.0.1=========================================] [=================================================] [===| Release date |==============================] [=================================================] [ 13.03.2012======================================] [=================================================] [===| Tested OS |=================================] [=================================================] [ WinXP SP3 x32 \ Win7 SP1 x32\x64 \ Win8 x64=====] [=================================================] [===| Hotkeys |===================================] [=================================================] [ F1 - Toggle activate trainer====================] [ F2 - Toggle infinite lives======================] [ F3 - Toggle infinite ammo=======================] [ F4 - Toggle infinite shields*===================] [ F5 - Toggle flicker mode*=======================] [ END - Back to normal============================] [=================================================] [===| How to use |================================] [=================================================] [ 1. Start the trainer (if you are under Vista\7,=] [ make sure that you start the trainer with=======] [ administrative privileges!======================] [ 2. Start the game. Easy step, huh! (:===========] [ 3. Press F1 to activate the trainer.============] [ 4. Use hotkeys to toggle options on and off.====] [ 5. ENJOY!=======================================] [=================================================] [===| Notes |=====================================] [=================================================] [ For working inifinite shields you must==========] [ activate this option when you have got==========] [ at least one shield!============================] [=================================================] [ When flicker mode is enabled, you cannot========] [ be hit by anything, also you are able to get====] [ through enemies safely but you are still able===] [ to collect any bonusec (weapons, lives etc.)====] [=================================================] [===| AV Warning |================================] [=================================================] [ Any threatment as a virus is a false-positive!==] [=================================================] [===| Greetings |=================================] [=================================================] [ To all active members of gamehacklab.ru -=======] [ one of the last russian gamehacking projects====] [ on the web!=====================================] [=================================================] [======================================[ keng ]===] keng.star.defender.4.plus.4.trn.zip
- 1 ответ
-
- 2
-
-
Суть статьи в том, что есть в игре функция ОтнятьЗдоровье(Персонаж); Ей по-барабану, наш это персонаж или бот - она просто отнимает здоровье. Но игра каким-то хитрым образом определяет, когда стреляют по нашему персонажу, а когда - по вражеским. Определяет она как раз значением этого самого ID, скажем, если ID = 1 - то это наш персонаж, если же ID = 0 - то вражеский. Задача в том, чтобы в инструкции отнятия здоровья сделать фильтр: Если (ID = 1) ;Пытаются отнять здоровье у нас { Не отнимать здоровье, выход } Если (ID = 0) ; Мы стреляем во врага { Отнять здоровье - вор должен сидеть в тюрьме! Затем - выход. } Собственно, в первой части статьи мы нашли адрес здоровья, затем повесили на него отладчик и поставили брейкпоинт на запись - нашли функцию, которая пишет что-то в наш адрес здоровья. Эта найденная функция - и есть та самая ОтнятьЗдоровье: FLD DWORD PTR [EBP-1C] ;Загружаем значение наносимого урона FSUBR DWORD PTR [EBX+104] ;Отнимаем урон от здоровья FSTP DWORD PTR [EBX+104] ;Сохраняем новое значение здоровья [EBX+104] - указатель на адрес здоровья. EBX - базовый адрес структуры персонажа. 104 - смещение от базового адреса. После этого мы нашли в структуре идентификатор - научились отличать себя от врагов. Теперь осталось переписать старую инструкцию ОтнятьЗдоровье, чем и занимается скрипт. В отладчике подводим курсор к адресу этой функции, меню Tools - Auto Assemble - и пишем там код скрипта: [ENABLE] alloc(newmem,2048) ;Выделили память под код скрипта label(returnhere) ;На эту метку прыгнем после его выполнения label(godmod) ;Этот кусочек выполнится, если стреляют в нашего персонажа newmem: cmp dword ptr [ebx+00000100],0FFFFFE0C // Сравниваем [ebx+00000100] с нашим ID. je godmod// Прыгаем если равно. fsubr dword ptr [ebx+00000104] ;Если же не равно - отнимаем здоровье jmp returnhere ;Прыгаем обратно в код игры godmod: ;Если стреляли в нашего персонажа fsubr dword ptr [ebx+00000104] ;Сначала отмаем урон, а затем fadd dword ptr [ebx+00000104]// Добавляем операцию сложения .. то есть ранее что то вычли .. и это же прибавляем..)) jmp returnhere ;И выходим - никакого урона так и не нанеслось 0EC2B8F4: jmp newmem nop returnhere: [DISABLE] 0EC2B8F4: fsubr dword ptr [ebx+00000104] dealloc(newmem) Как скрипт написали - в меню выбираем File - Assign to current cheat table. Строчка со скриптом появится в окне адресов, поставили галочку - скрипт работает, сняли - отключается.
-
В чём угодно, правда. Попробуй создать пустой трейнер, попробуй создать трейнер не из СЕ, попробуй другую СЕ, попробуй все эти действия на другой ОС.
-
Значит твой код верен, но отлаживать его всё равно нужно. На всех ОСях трейнер запускался с админскими правами? У меня просто под рукой компилятора нет, да и дельфи я последний раз видел лет 10 назад.
-
Попробуй вместо: GetMem(buf,1); buf^ := Chr(PokeValue); WriteProcessMemory(HandleWindow,ptr(Address),buf,NumberOfBytes,write); FreeMem(buf); Написать сразу: WriteProcessMemory(HandleWindow,ptr(Address),$00,1,write);
-
Ещё можно [вот такой] вариант попробовать. 4-й пост сверху. Первая процедура ищет хэндл нужного процесса, вторая - пишет указанные данные по указанному адресу. В конце поста показано, как это дело вызывать.
-
Я не совсем понимаю, что делают эти строчки: GetMem(buf,1); buf^ := Chr(PokeValue); GetMem выделяет 1 байт памяти и кладёт указатель на начало этой памяти в buf. После этого в buf кладётся сконвертированный при помощи Chr нолик. Затем всё это добро записывается по адресу 007B5678. Я правильно понимаю, да? Если да - зачем такие махинации с выделением одного байта и т.п.? Не проще сразу ноль записать?
-
Заодно можешь выложить скомпилированный файл.
-
Что-то типа: var WinClass : TWndClass; hInst: HWND; Handle: HWND; Msg: TMSG; hFont: HWND; win: hwnd; WindowName: integer; ProcessId: integer; ThreadId: integer; buf: PChar; HandleWindow: Integer; write: cardinal; const WindowTitle= 'Name'; Address= $007B5678; PokeValue= $0; NumberOfBytes= 4; begin WindowName := FindWindow(nil,WindowTitle); If WindowName = 0 then begin MessageBox(win,'Игра должна быть запущенна до трейнера.'+#13+#10+ ' Запустите её,а потом трейнер','Ошибка',MB_OK or MB_ICONINFORMATION); end; ThreadId := GetWindowThreadProcessId(WindowName,@ProcessId); If ThreadId = 0 then begin MessageBox(win,'Error!'+#13+#10+ 'Couldn't get thread id.','Ошибка',MB_OK or MB_ICONINFORMATION); end HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId); If HandleWindow = 0 then begin MessageBox(win,'Error!'+#13+#10+ 'Couldn't get window handle.','Ошибка',MB_OK or MB_ICONINFORMATION); end GetMem(buf,1); buf^ := Chr(PokeValue); If buf = 0 then begin MessageBox(win,'Error!'+#13+#10+ 'Buffer is empty.','Ошибка',MB_OK or MB_ICONINFORMATION); end WriteProcessMemory(HandleWindow,ptr(Address),buf,NumberOfBytes,write); FreeMem(buf); CloseHandle(HandleWindow); end; Вообще, не пробовал под отладчиком пошагово пройти всю программу?
-
Просто поставь такую же проверку, как в функции FindWindow (через MessageBox), после вызова всех функций. Где ошибку выдаст - там её и искать.
-
[===| Title |=====================================] [ [ Deep Black +3 trn [ [===| Version |===================================] [ [ 1.0 from SKiDROW [ [===| Release date |==============================] [ [ 12.03.2012 [ [===| Tested OS |=================================] [ [ WinXP SP3 x32 \ Win7 SP1 x32\x64 \ Win8 x64 [ [===| Hotkeys |===================================] [ [ F1 - toggle activate trainer [ F2 - toggle godmode [ F3 - toggle infinite ammo [ F4 - toggle infinite suit boost [ [===| AV Warning |================================] [ [ Any threatment as a virus is a false-positive! [ [=================================================] keng.deep.black.plus.3.trn.zip PS: Буду обновлять шапку.
-
Тут что угодно может быть - нужно отлаживать. Отдельные компоненты могут не работать в разных осях, но WinAPI у нас на все винды в принципе одинаковые.
-
Вольный перевод. Первый вариант:
- 1 ответ
-
- 1
-
-
Таймер - ReadProcessMemory - Конвертация в нужный формат - Вывод на Label, например.
-
Стараюсь способствовать увеличению популярности сайта посредством этого самого ютуба.
-
На правах тестирования выкладываю трейнер с одной-единственной опцией. Задача тех, кто рискнул это скачать и запустить - проверить, работает ли. Я проверял на версии 1.0. Скриншот: Больше информации - в nfo. PS: На файле висит пакер, так что антивирусы могут ругаться - не поддавайтесь на уговоры! keng.shank.2.plus.1.trn.zip
-
Скорее всего, он реагирует или на таймер (проверяет количество секунд от начала игры), или ещё на что-нибудь. Попробуй или начать игру и искать увеличилось-увеличилось-увеличилось, или же изменилось\не изменилось, когда компьютер активен \ не активен.
-
Берём два разных предмета, кладём один в инвентарь, ищем неизвестное значение, выкидываем первый предмет, кладём второй, отсеиваем изменилось, выкидываем второй, кладём первый, изменилось и т.д.
-
За время обсуждения можно было уже и 4 байта и дробное поискать. (: