Перейти к содержанию

keng

Ветераны
  • Постов

    1 635
  • Зарегистрирован

  • Посещение

  • Победитель дней

    55

Весь контент keng

  1. keng

    keng trnme

    Мой вариант:
  2. keng

    keng trnme

    В который раз подивившись размерам простыни, что я награфоманил вот в [этой] теме, я засел за код и в результате (после пары пакетов молока, конечно же) родился малюсенький трейнми, который учит работать со структурами. Он простой донельзя, но одна заковырочка там всё-таки есть. Вот скриншот: Жмём кнопку "Hit P1" - ранят первого игрока, жмём "Hit P2" - ранят второго. Задача - сделать одного из игроков иммунными к сей заразе. Качаем: keng_trnme.zip
  3. Ну какбе если ты с трудом представляешь, что такое структура вообще, давай я тебе попробую показать. Вот, например 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 ;Выходим Вот как-то типа того. Надеюсь, понятно написал.
  4. Нет, я про пост Uchiha Sasuke - ему не лень было ответить автору, но по факту пост особенной пользы автору не принёс, так что это выглядит довольно иронично на мой взляд.
  5. "Лень ответить, но не лень ответить что лень ответить."
  6. Повреждение машин - float, прокол шин - byte в структуре машины. Первый адрес ищется за 5 минут, второй - через структуру, полученную при отладке первого.
  7. keng

    Star Defender 4

    [===| 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
  8. Суть статьи в том, что есть в игре функция ОтнятьЗдоровье(Персонаж); Ей по-барабану, наш это персонаж или бот - она просто отнимает здоровье. Но игра каким-то хитрым образом определяет, когда стреляют по нашему персонажу, а когда - по вражеским. Определяет она как раз значением этого самого 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. Строчка со скриптом появится в окне адресов, поставили галочку - скрипт работает, сняли - отключается.
  9. В чём угодно, правда. Попробуй создать пустой трейнер, попробуй создать трейнер не из СЕ, попробуй другую СЕ, попробуй все эти действия на другой ОС.
  10. Значит твой код верен, но отлаживать его всё равно нужно. На всех ОСях трейнер запускался с админскими правами? У меня просто под рукой компилятора нет, да и дельфи я последний раз видел лет 10 назад.
  11. Попробуй вместо: GetMem(buf,1); buf^ := Chr(PokeValue); WriteProcessMemory(HandleWindow,ptr(Address),buf,NumberOfBytes,write); FreeMem(buf); Написать сразу: WriteProcessMemory(HandleWindow,ptr(Address),$00,1,write);
  12. Ещё можно [вот такой] вариант попробовать. 4-й пост сверху. Первая процедура ищет хэндл нужного процесса, вторая - пишет указанные данные по указанному адресу. В конце поста показано, как это дело вызывать.
  13. Я не совсем понимаю, что делают эти строчки: GetMem(buf,1); buf^ := Chr(PokeValue); GetMem выделяет 1 байт памяти и кладёт указатель на начало этой памяти в buf. После этого в buf кладётся сконвертированный при помощи Chr нолик. Затем всё это добро записывается по адресу 007B5678. Я правильно понимаю, да? Если да - зачем такие махинации с выделением одного байта и т.п.? Не проще сразу ноль записать?
  14. Что-то типа: 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; Вообще, не пробовал под отладчиком пошагово пройти всю программу?
  15. Просто поставь такую же проверку, как в функции FindWindow (через MessageBox), после вызова всех функций. Где ошибку выдаст - там её и искать.
  16. keng

    Deep Black

    [===| 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: Буду обновлять шапку.
  17. Тут что угодно может быть - нужно отлаживать. Отдельные компоненты могут не работать в разных осях, но WinAPI у нас на все винды в принципе одинаковые.
  18. Таймер - ReadProcessMemory - Конвертация в нужный формат - Вывод на Label, например.
  19. Стараюсь способствовать увеличению популярности сайта посредством этого самого ютуба.
  20. keng

    Shank 2

    На правах тестирования выкладываю трейнер с одной-единственной опцией. Задача тех, кто рискнул это скачать и запустить - проверить, работает ли. Я проверял на версии 1.0. Скриншот: Больше информации - в nfo. PS: На файле висит пакер, так что антивирусы могут ругаться - не поддавайтесь на уговоры! keng.shank.2.plus.1.trn.zip
  21. Скорее всего, он реагирует или на таймер (проверяет количество секунд от начала игры), или ещё на что-нибудь. Попробуй или начать игру и искать увеличилось-увеличилось-увеличилось, или же изменилось\не изменилось, когда компьютер активен \ не активен.
  22. Берём два разных предмета, кладём один в инвентарь, ищем неизвестное значение, выкидываем первый предмет, кладём второй, отсеиваем изменилось, выкидываем второй, кладём первый, изменилось и т.д.
  23. За время обсуждения можно было уже и 4 байта и дробное поискать. (:
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.