Лидеры
Популярный контент
Показан контент с высокой репутацией 16.03.2015 во всех областях
-
Привет! Я попробую объяснить, но начну немного издалека. Вот есть игра: ****** *Игра* ****** Это - загруженный в оперативную память и запущенный на исполнение бинарный файл. Или исполняемый, как угодно. EXE, в общем. Он состоит из модулей - помимо самого исполняемого файла в его адресное пространство подгружены всякие разные DLL, нужные для его работы. Так как написан он был на компилируемом языке, то на выходе бинарник получился состоящим из так называемых машинных кодов. Если их записать на более понятном для человека представлении, то получится ассемблерный код. Обратно из машинных кодов исходник не получить, потому что все имена функций, переменных и все такое прочее было выброшено компилятором за ненадобностью - ему гораздо быстрее и удобнее ориентироваться в цифрах. Дизассемблированный же листинг мы получить вполне можем. Дизассемблированный - это для архитектуры нашего процессора, то есть он все равно не совсем точный, а примерный. Работать, само собой, работает, тут без вопросов. Адресное пространство, которое я уже выше упомянул - это довольно абстрактная область оперативной памяти, которая зарезирвирована за программой. Она ее видит в виде простыни из 4Гб или чуток побольше адресов, идущих подряд, все это делится на блоки, а блоки - на страницы, которые в нужный момент при помощи магии операционной системы адресуются на физическую память. Такие вот дела. Для того, чтобы изменить ход работы игры, мы можем менять только доступное нам - адресное пространство и код, который мы получили из дизассемблера и\или отладчика. Первый способ - быстрый и удобный, чего уж. Сканер памяти запустил, адрес нужный нашел, меняй - не хочу. А если адрес динамический - посидел 5 минут и нашел указатель. Беда в том, что подходит этот способ далеко не всегда и не для всего. Второй же - куда более муторный, но куда более крутой. Ты сидишь, ковыряешься в отладчике в тщетных попытках понять, что же делает игра. Сидеть и рассматривать примерный дизассемблерный листинг, в котором есть только команды, регистры и адреса - это жесть, как утомительно. Особенно если делать это по 10-12 часов в сутки. Но результат стоит того. При должной сноровке и должном терпении можно хоть всю игру переписать на свой лад. Опции доступны _любые_, без шуток. На что фантазии и времени хватит - то и будет. Менять код игры можно прямо из отладчика, тут же получая результат (или вылет), можно - из Cheat Engine или аналогичной программы, делая скрипты на местном диалекте ассемблера, а можно написать свою программу, которая будет все это делать под твоим руководством. Последний вариант - самый крутой. К счастью, чудо-фирма Microsoft в некоторой мере адекватна и выпустила для своей линейки операционных систем набор API - то есть набор функций, позволяющих приказать этой самой оси сделать нечто полезное. Среди сотен этих функций есть парочка очень необходимых нам - например, возможность читать и менять память в чужом адресном пространстве. Есть в игре, допустим, такая инструкция: DEC EBX Которая при каждом своем срабатывании уменьшает текущее значение регистра EBX на единицу. Можно теперь включить фантазию и нафантазировать, что это - часть функции, ответственной за стрельбу. И срабатывает она каждый раз, как игрок в игре стреляет, отнимая у него патроны. Нас такая ситуация не очень устраивает, так что мы в нашей крутой программе вызываем API-функцию для записи в память и записываем по адресу, где лежит инструкция, опкод инструкции NOP, то есть число 0x90. Почему число? Потому что в памяти лежат цифры, а не DEC или NOP. Их нам выдают отладчик и дизассемблер исключительно потому, что они - добрые и щедрые ребята. В общем, записали, патроны не меняются - круто! Через пару недель мы понимаем, что можно не просто выключать те или иные куски кода, но и дописывать их или переписывать. В какой-то момент сталкиваемся с тем, что у нас доступно для изменения 5 байт, а нужно нам их 25. Тут на помощь приходит техника под названием code injection, которая, как видно из двух английских слов, внедряет кусок кода. Удивительное дело, но при ее использовании нам необходимо всего 5 (а иногда - совсем всего 2) байта. Мы выделяем (или находим) кусок памяти, который игра не использует, записываем туда наши 25 байт, а на месте игровой инструкции записываем переход на нашу память. В итоге игра послушно выполняет то, что мы задумали. Я на днях написал статью, которая поверхностно описывает данную технику. Там как раз используется внешняя программа и вызовы API-функции для записи в память. А писать нужно, как мы помним, цифры. Аж в 16-ричной системе счиления, которую компьютер любит, но не всякий человек. Со временем трейнеростроители поняли, что это не очень уж и удобно, и стали думать. Додумались они до того, что описывал в своих работах Coder. Можно же не использовать внешнюю программу, а внедрить в адресное пространство игры свой исполняемый модуль, скажем, DLL! В едином адресном пространстве будет сильно удобнее - во-первых, не нужны API-функции записи в память - мы можем напрямую ее изменять и копировать, были бы права на это. Во-вторых - можно записать нужную ассемблерную вставку прямо в DLL и делать инъекцию кода, используя адрес этой вставки, обернув ее в функцию. Это позволяет писать намного быстрее и не очень заморачиваться со смещениями и цифрами вместо команд - большинство компилируемых языков программирования поддерживают ассемблерные вставки в коде программы. На этом этапе EXE-файл трейнера выполняет роль красивой обертки, цель которой - показать картинку, написать имя автора и то, какой он крутой и молодец, а затем внедрить в адресное пространство игры эту самую DLL, которая сделает всю дальнейшую работу. Такие вот внедрители DLL и называются инжекторами, только не кода, а DLL. С этой частью, пожалуй, немного разобрались. Осталась самая капелька. Во-первых, Coder использует всякие библиотеки - почему так? Ну, еще он использует C++. А я вот использую С и библиотеки использую, когда мне совсем уж лень писать собственный велосипед. Ему удобнее так, мне - эдак. Дело вкуса. Не требование. Во-вторых, по поводу метода внедрения кода тебе уже ответил Xipho, пока я писал вот это вот. Спасибо всем, кто насладился некоторым количеством букв.2 балла
-
with that module u can AutoFinish: Sprint: MultiPlayer/SinglePlayer/Private Circuit: MultiPlayer/SinglePlayer/Private Drag: MultiPlayer/SinglePlayer/Private Pursuit: SinglePlayer (~2-5 min escape) Team Escape: MultiPlayer/Private (only 2 3 4 player can get reward) Additional features: AntiHackDetect Tank IgnoreSpikeStrip FullRandomServerData AutoFinish correct time FreeCarSlot 60lv only HTTPS SendConsole PEB HideDLL 2window Additional info: dll not have UI. just control game for ur script AF.cpl is "self inject" dll - 2 click = injected but u can use any dll injector, or cmd rundll32.exe AF.cpl,entrypoint if u use powerups - ur script must replay it if use not stock car - ur script must "repair" car u must drive ALWAYS one event for valid data AutoHotKey example for single events: http://www.datafilehost.com/d/e05fdc11 link: http://rghost.ru/private/7S7xDlZmb/5df0a9dce6605b98877c7d6387771f35 http://www.datafilehost.com/d/5089fbe0 ps: 1 изначально dll задумывалась как костыль для говноскриптов вроде autohotkey/autoshit тд тп - нету интерфейса 2 все адреса патчей хардкорд для 1594 билда игры 3 пример "хака" детектора хаков 4 сложный хук http и вывод инфы в консоль, включая телеметрию (автор идеи Vityacv, но его реализация была на С++) 5 пример само-инжекторной dll ака cpl 6 пример управляемой рандомизации инфы для "уникального" финиша евента 7 пример нестандартного кодинга на fasm1 балл
-
А ты попробуй для начала просто связать два файла вместе. Напиши свой инжектор DLL, научись эту DLL запихивать в чужой процесс, внутри самой DLL - разберись, как работать с памятью изнутри нужного адресного пространства, затем - как писать инъекции кода сразу внутри DLL. После - как работать с shared-секцией памяти или сообщениями, чтобы инжектор и DLL друг друга понимали. А потом уже и объединить можно. Способов, как я уже сказал, масса - их можно и банально нагуглить. Если не понимаешь, как подобраться к крупной задаче - разбивай ее на мелкие и решай их.1 балл
-
DLL можно встроить в EXE различными способами, а сконтачить их вместе можно, например, через общую секцию памяти. Или через сообщения, как это делает подавляющее большинство программ в Windows.1 балл
-
Тестовая камера: 11/19 Как урвать отражающий куб в другой комнате? Хочу сам додуматься, но варианты все исчерпались.... Намекните, плз, очень тонко.....ОЧЕНЬ! Иначе рассержусь и пошлю в район нахождения IP - ВОДОРОДНУЮ БОМБУ НА 25 МЕГАТОНН...1 балл
-
Почисть реестр самостоятельно, вручную, удали все что связанно с Google Chrome. Где то в реестере есть ветка которая автоматически запускает установку этого плагина. Её и нужно удалить.1 балл
-
Привет! Сигнатура ищется через Cheat Engine или, например, через OllyDbg (есть для него плагин), при этом важно понять, как они работают. Насколько ты знаешь, скомпилированный ассемблерный код состоит из опкодов команд, адресов и смещений. Допустим, есть такой код: MOV EAX,EBX JMP 0x10 Перед тем, как просто копировать опкоды и использовать их в качестве сигнатуры, стоит немного осмотреть код и разобраться в нем. Первая команда поменяется только в каком-нибудь исключительном случае (скажем, очень большом патче для игры), а вот вторая может поменяться и при небольшом. Представим, что опкоды для второй команды выглядят примерно так: E900000010 E9 - опкод JMP, следующие четыре байта - адрес для прыжка. Эти четыре байта могут поменяться просто запросто - достаточно хотя бы один байт выше или ниже по коду добавить, потому что прыжок относительный (т.е. на некоторое количество байт вверх или вниз от текущего адреса). Такие вот вещи, которые могут легко и часто меняться (адреса и смещения в первую очередь) лучше загонять в wildcard, то есть сигнатура будет выглядеть так: E9???? Но в примере еще была команда MOV, опкоды которой можно взять целиком, я их сейчас придумаю из головы и получится как-то так: ABFFD9E3E9???? Вот и готово. Прежде всего такие сканеры должны искать определенную последовательность команд. В нашем случае это "MOV JMP", потом учитывать операнды, а только потом - адреса переходов и смещения в операндах. PS: Если ты не до конца понимаешь, как работает чей-то код, скрипт или любая методика взлома - лучше сидеть и задавать вопросы, пока тебе внятно не объяснят. Плох тот автор, который выкладывает готовое решение и не поясняет, как оно работает, или же не поясняет достаточно хорошо. Сначала разберись - потом используй сам и объясняй тем, кто еще не разобрался.1 балл