Показаны сообщения с ярлыком Hint. Показать все сообщения
Показаны сообщения с ярлыком Hint. Показать все сообщения

20120229

Небольшие, но полезные утилитки.

Может быть, уже упоминал - так что извините за повтор.

Бывает так, что игра отказывается работать в оконном режиме, запуская исключительно на весь экран. Это ни разу не удобно и часто мешает взлому.

Как с этим бороться? Есть две хороших утилиты:

1. [D3DWindower]. Открываем файл с правами администратора (правой кнопкой на .ехе - запустить с правами администратора), жмём на кнопку с плюсиком, выбираем .ехе-файл игры, жмём ок. Дальше запускаем игру двойным щелчком по названию в окне программы.

2. [3D-Analyze]. Открываем программу, жмём кнопку Select, выбираем .ехе-файл игры, дальше во вкладке Performance ставим галочку (вроде бы, самая нижняя) force windowed mode, после чего тыкаем Run.

Сразу предупрежу, что многие игры могут вести себя не совсем адекватно, будучи запущенными в окне.

20111121

Следующий видеоурок.

Ребята, про что следующий урок записать?

Поломаем стратегии? Скажем, мгновенную постройку сделаем?

Или RPG (работа с инвентарём)?

Или может, запишем урок по крутому дизассемблеру (и отладчику) - Hex-Rays IDA Pro?

 

Предложения, в том числе и свои, - в комментарии. :)

20111109

Дополнительная информация.

В [предыдущем] видеоуроке (если вы, конечно, уже успели его посмотреть и ужаснуться), взлом был не таким, как в остальных уроках. В чём он отличался? А в том, что Cheat Engine мы не использовали и никакие адреса, по сути, не искали. Использовали мы замечательный отладчик под названием [OllyDbg], абсолютно бесплатный для некоммерческого использования (его даже можно скачать по [этой ссылке]) и который мы будем использовать дальше. Не всё время (с Cheat Engine бы до конца разобраться, да?), но периодически будем.

В предыдущем уроке мы ломали игру под названием Call of Duty, построенную на движке Quake 3 Arena. Это - замечательный факт, потому что к движку этого самого третьего квейка прилагается исходный код в виде SDK - Software Developer's Kit, он же - Инструментарий Разработчика.

Мы тут же лезем на [FTP] ID Software и качаем SDK последней версии. Написан он на С++, но мы, не зная этого языка, используем логику и английский язык - нам нужна функция стрельбы, то есть всё, где есть слова "weapon" (оружие) и "fire" (стрельба). Находим нужный файл, открываем простым текстовым редактором и ищем в нём одноимённую функцию.

В этой функции (опять же, практически на чистом английском), мы узнаём, что при её выполнении играется анимация выстрела, вспышка и звук, а вот про отдачу там ни слова нет.

Понимая, что в нашей игре она всё-таки есть, мы надеемся что мудрые разработчики нужную нам функцию просто немного дописали и идём в Olly.

В отладчике мы открываем процесс нашей игры и ищем в нём все текстовые строчки, среди которых нам попадается та самая функция, к вызову которой мы и переходим. А сразу же после неё мы обнаруживаем шибко подозрительный условный переход. Меняем его на обратный - и voila - отдачи в игре нет.

 

Можно было бы и пойти другим путём, используя только Cheat Engine:

Ищем неизвестное значение типа float, постреляли (ствол оружия направлен вверх) - увеличилось, ствол опустился - уменьшилось и так далее. После этого смотрим, что пишет в этот адрес, и ищем нужный нам код. Обычно это или условный переход, или же call (вызов функции). Плюс этого способа в том, что сработает в любой игре, минус же - что искать адрес придётся долго, а ещё дольше - разбираться в коде.

Поначалу OllyDbg может выглядеть сильно сложным и непонятным, но вспомните себя при просмотре первых видеоуроков и поймёте разницу - достаточно немного практики, чтобы освоиться. :)

20111107

Трейнеры.

Помните, ребята, когда-то давно, ещё в предыдущей версии блога, я устраивал опрос на тему "Какой же язык программирования выбрать для написания трейнеров?". Там были варианты вроде Visual Basic, C++, C# и так далее.

В конце концов я пришёл к тому, что раз уж алгоритм (то, как трейнер работает) трейнера всегда один и тот же, независимо от языка, то писать мы будем сразу на ассемблере. Почему? Потому что далеко не факт, что все мои читатели знакомы с программированием в принципе, а вместе с видеоуроками волей-неволей стали потихоньку изучать ассемблер - самый низкоуровневый язык, обладающий самыми большими возможностями. Что значит "низкоуровневый"? Примерно вот так:

 

Компьютер сам по себе умеет обращаться только с ноликами и единичками - двоичным кодом, используя для этого двоичную систему счисления (у нас же, людей, она десятичная, арабская, а в Cheat Engine мы используем ещё и шестнадцатиричную). Когда трава была зеленее, а компьютеры занимали половинку спортивного зала программировали их никак иначе, чем переключением туда-сюда тумблеров (из 0 в 1 и наоборот). Потом ОКАЗАЛОСЬ, что это не очень удобно, когда программы стали посложнее и придумали язык ассемблера - максимально приближённый к переключению тумблеров с точки зрения компьютера и при этом хоть как-нибудь, но понятный людям. Большинство команд - это мнемонические сокращения, как то:

 

mov - move (сдвиг)

jmp - jump (прыжок)

ret - return (возврат)

 

и так далее. Это, собственно, самый низкий уровень языка. Простое правило - чем ниже уровень - тем больше возможностей. Со временем начали упрощать и ассемблер, так появились языки более высокого уровня - FORTRAN, C, Pascal и их современники. Код на ассемблере выглядит довольно специфично и сам процесс довольно сильно отличается от такового на языках высокого уровня, а раз мы с самого начала взялись вникать в ассембер (пусть и немного), то продолжать будем на нём же. В крайнем случае, когда читатель поймёт, что код трейнера довольно простенький - он сможет выбрать себе язык по вкусу и написать трейнер на нём.

20111103

Подписки на блог.

RSS пока не перенастроен, но я есть и в твиттере, так что можете фолловить. Туда автоматически скидываются оповещения о добавлении новых уроков на YouTube, а так же комментариев к ним. Я тоже пишу, но редко.

20111101

Повседневное.

Пока я сижу на работе, а дома качаю\устанавливаю\ломаю игры по заявкам читателей, параллельно занимаясь написанием статей и записью видеоуроков, стало интересно:

Ребята! И те, кто читает мой блог, и те, кто случайно набрёл на эту страничку в поисках трейнера или читов к игре N, а блог их заинтересовал. Как у вас там? Применяете полученные знания? Всё получается? Ну не верится мне, что ни у кого не возникает ни единого вопроса. Задавайте их в комментах! Тут, на ютубе, присылайте по электропочте, в конце концов.

Я не могу просто так взять, взмахнуть мышкой с клавиатурой и сделать так, чтобы у вас вдруг сразу всё стало получаться - находиться нужные адреса и указатели, отлаживаться в отладчике код, писаться код трейнеров. Это нужно повторять снова и снова, шаг за шагом. Теорию нужно изучать, игры - ломать, код - писать. Только так всё начнёт получаться. Это (сюрприз!) - залог успеха в любом деле.

Понятно, что меня может читать и полтора человека раз в неделю, так как блог я веду совсем недавно, но и они вряд ли могут быть гениями, чтобы у них не возникало вопросов. Стесняться меня (или других читателей) тоже не надо - если вы задаёте вопросы и чего-то не понимаете, то это говорит лишь о том, что вы стараетесь узнать что-то новое, а не ждёте готовенькое, и уж точно ни разу нет в этом ничего постыдного.

20111028

О координатах.

Вообще говоря, тема работы с координатами (как по горизонтальной оси - X\Y, так и по вертикальной - Z) довольно обширная и там можно много чего придумать. Самые распостранённые техники - побыстрее прыгать \ повыше прыгать (для врагов, соответственно, наоборот, ибо нефиг), да телепорт с места на место по уровню. Вот вариантов исполнения - их много, очень много. Подробнее расскажу в видео - там показан только один из способов, самый простой.

Периодически я ещё буду возвращаться к этой теме - показывать другие техники, может, какие-то фишки помимо телепорта и скорости (ограничение - только фантазия), возможно, что-то окажется в ваших заявках на взлом любимых игр. :)

В будущем планирую показать пару других инструментов для взлома. В частности, более мощный отладчик и более мощный дизассемблер. Кому-то может не нравиться отладчик в Cheat Engine, кому-то могут понадобиться более крутые возможности. Словом, покажу, а там уж сами решите - надо оно вам, или нет. Я более продвинутые инструменты использую, когда не могу разобраться в коде игры сразу, т.е. в запущенных случаях, которые случаются довольно редко, как видно из предыдущих видеоуроков.

20111024

Задержки с публикациями.

Товарищи читатели!

Искренне прошу прощения за то, что не успеваю вовремя выкладывать новые уроки - весь в работе, даже выходные на неё потратил. Выложу урок про superjump в как можно ближайшее время, а вам пока что предлагаю задать накопившиеся вопросы (или я так хорошо даю материал и вам всё понятно?) и предложить тему следующего видеурока\статьи - будем что-то новое ковырять, или ещё с координатами повозимся? У меня в планах показать создание телепорта, это тоже не так уж сложно, но немного кода написать придётся. Если есть идеи получше - пишите, я только за.

20110925

Ещё немного чтива

Нашёл ещё один неплохой вводный курс по ассемблеру - [ссылка]. В нём используется flat assembler, он же fasm - один из синтаксисов этого языка. Надо сказать, что ассемблера существует достаточно дофига диалектов - есть fasm, masm, nasm, tasm, в общем - много вариантов. Между собой они различаются разными поддерживаемыми фичами и набором команд. Самый популярный - masm, или Macro Assembler производства Microsoft. Если будем писать что-то на ассемблере, то выберу я именно этот - под него пишется большинство статей и он обладает наиболее богатой документацией. :)

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

20110924

Первая часть седьмого видеоурока, или знакомимся со структурами.

Итак!

Тянуть время дальше стало катастрофически лень, так что я быстренько сел и записал вводное видео. Простите, что так поздно, дела-дела. :)

В этом видео я постарался объяснить значение такой офигенно полезной штуки, как структура.
Это, если не обращаться к википедии и заумным книжкам, просто способ организовать какую-то информацию. Относительно игр нам надо просто понимать, что своя структура есть у каждого игрового объекта, для однотипных объектов она чаще всего одинаковая (структура "монстр" - у каждого монстра, "игрок" - у каждого игрока, "пуля" - у каждой пули и так далее), а при взломе помним самое главное - в памяти все значения конкретной структуры чаще всего хранятся рядышком, бывает что просто подряд. :D

Нам это может сильно помочь при поиске каких-то величин, которые на экране не отображаются и которые найти обычными способами довольно проблематично. Например, ломаем мы гоночки. В какой-то момент нам ВНЕЗАПНО очень захотелось найти массу нашей машины. Да-да, раз в игре есть хоть какая-то физика (а в современных играх для этого дела целые физические движки созданы) - то есть и масса и все основные законы. Все ведь помнят второй закон Ньютона из школьного курса физики? Если нет, то поясню: чем меньше будет масса нашей машины, тем быстрее она будет ускоряться. Так что на старте с машиной весом в 5 грамм мы всех уделаем. ^^

Проблема в том, что массу машины нигде на экране не написали (идиоты!), и вот тут-то мы и вспоминаем про то, что у каждой машины наверняка есть структура, а в этой структуре наверняка хранится и масса тоже. :)

Такие вот пироги. Смотрим, вникаем, запоминаем: [ссылка].


20110923

Следующие видеоуроки

Помните, что я указал в последнем видеоуроке? "Будем учиться быстро бегать и высоко прыгать". Это значит, что мы будем искать координаты игрока и работать с ними.

Проблема заключается в том, что просто так эти самые координаты не найдёшь, поэтому я разобью эту тему на несколько видео, в которых сначала пролью свет на несколько очень важных (и полезных!) штуковин, вместе научимся искать координаты и поломаем при этом пару-тройку игр. :)

Частей планируется 2-3, первая - про необходимые понятия и теорию, вторая - про "быстро бегать", ну а третья, очевидно, - про "высоко прыгать". Как пройдём это всё и материал более-менее усвоится - покажу, как делается "Rapid fire hack" - это когда мы из какого-то медленно стреляющего оружия будем стрелять аки из шестиствольного пулемёта - в общем, быстро, очень быстро!

На этом основной курс "как научиться ломать игры" будет в общем-то окончен, так что дальше буду выкладывать какие-то конкретные фичи (как найти то или иное труднодоступное для обычного поиска значение, более простой метод поиска указателей и т.п.), может быть коснусь темы снятия игровых защит - да, бывает и так, в современных играх - почти повсеместно.

Параллельно приступим к написанию трейнеров. Эта тема довольно объёмная и абстрактная - зависит она в основном от умения программировать. Всё ещё думаю, как к ней грамотно подойти, но какой-никакой план уже есть. :)

20110916

Code-Injection: Подробности

В [пятом уроке] (и в четвёртом тоже ^^) мы рассматривали такую технику, как Code-Injection, или, если буквально, "инъекция кода". Давайте остановимся на этой штуке ещё немного - больно уж часто она используется. Больше скажу - одна из самых распостранённых техник взлома. :)

Итак. Представим, что имеется у нас вот такой гипотетический код игры:

Адрес   |  Команда      |    Комментарий
---------------------------------------------------------------------------------
0000000: mov eax, 3     //помещаем в регистр eax число "3"
0000001: sub eax, 1      //вычитаем из еах единичку
0000002: cmp eax, 0    //сравниваем еах с нулём
0000003: je "exit"         //если еах = 0, то выходим из игры
0000004: add eax, 2    //иначе прибавляем к еах двойку
0000005:
0000006:
0000007:
0000008:
0000009:
---------------------------------------------------------------------------------

Скажем, нашли мы нужный адрес в Cheat Engine, включили отладчик дабы посмотреть - а с чего это у нас заканчиваются жизни (которые, как вы поняли, в еах находятся), отладчик нам выплёвывает адрес 0х00000001.

Если мы хотим, чтобы жизни просто не убавлялись, мы заменяем команду "sub eax, 1" nop'ами - командами, которые ничего не делают. Почему я написал во множественном числе? Всё просто - одна команда "nop" занимает один байт места, а вот "sub eax, 1" места занимает чуток побольше. Точные значения нас сейчас не волнуют (их можно посмотреть в отладчике), скажем, что это четыре байта. Поэтому вместо:

sub eax, 1

Мы должны будем написать четыре команды "nop", по одной на каждый байт:

nop
nop
nop
nop

Если не соблюдать это правило (количество байт кода всегда неизменно) - получите синий экран и придётся делать заново.

Идём дальше. В чём суть техники Code-Injection? Мы берём какую-то команду (в данном примере - ту, что вычитает у нас жизни) и заменяем её на команду jmp - прыжок или переход. Там выполняем какой-то код, затем возвращаемся обратно - в код игры. Смотрите:

Адрес   |  Команда      |    Комментарий
---------------------------------------------------------------------------------

0000000: mov eax, 3             //помещаем в регистр eax число "3"
0000001: jmp [0000006]      //переходим ("прыгаем") на адрес 0x0000006
0000002: cmp eax, 0            //сравниваем еах с нулём
0000003: je "exit"                 //если еах = 0, то выходим из игры
0000004: add eax, 2            //иначе прибавляем к еах двойку
0000005:
0000006: add eax, 10 //добавляем к еах десять
0000007: jmp [0000002] //прыгаем обратно - на адрес 0x0000002
0000008:
0000009:
---------------------------------------------------------------------------------
В результате этих действий мы заставили игру выполнить наш код (находящийся под адресам 0х0000006-0х0000007) а затем вернуться обратно и продолжить свой. Что нам это даёт? На самом деле - что угодно, всё зависит от фантазии и навыков программирования. Можно добавить жизней, можно патронов, можно всех врагов убить, можно любимой бабушке привет  передать - в общем, чего душа пожелает, а дальше игра послушно вернётся к своим делам. :)

Почему делать нужно именно так? Потому что про количество байт и длину кода я писал не просто так - мы не можем уместить тысячу байт кода в размеры одной трёх-четырёхбайтовой команды - поэтому засовываем код в отдельный участок памяти, обращаемся к нему, а затем продолжаем исполнение игрового кода. Прелесть в том, что код всегда будет находиться в одном и том же месте - адреса меняться не будут. Такая вот загогулина. Использовать этот не слишком хитрый приём мы будем ещё очень много раз, так что понимание успеет придти. Если же нет - пишите, задавайте вопросы. :)




20110915

Небольшой трюк при поиске адресов.

Бывает так, что нужный адрес ну вот никак не находится, хотя ищешь всё правильно. Что можно сделать в этом случае. Смотрим на картинку (кликаем, чтобы увеличить):

Видим несколько галочек, подчёркнутых красным. Поясню их значение:

Первые три ("Writable", "Executable" и "CopyOnWrite") влияют на диапазон адресов, в котором мы будем искать, каждая может находиться в трёх положениях (галочка поставлена, снята, "серая"). Нас интересует галочка "Writable" - то есть перезаписываемая память. Если галочка стоит, то в диапазон поиска попадут адреса, в значения которых можно изменить. Если нет - то те, что доступны только для чтения. Если же галочка "серая" - то без разницы, сканировать будем и то и другое. Это может помочь при поиске указателей (они чаще всего только для чтения).

Галочка пониже - "Fast scan" - "Быстрый поиск". С одной стороны, звучит круто - мол, искать программа будет быстрее. Но есть небольшое "но" - искать программа будет те адреса, что кратны циферке 32. Как, зачем и почему - нас не интересует, просто если галочку снять - поиск будет идти чуть медленнее (на современных компьютерах разница будет мизерная), но адресов сканироваться при этом будет больше.

Последняя, нижняя - "Pause the game while scanning" - как вы уже догадались, решает, останавливать ли процесс игры на время сканирования или нет. Полезно при отсутствии в игре "Паузы" - если ищем какую-нибудь полоску здоровья и хотим гарантированно приостановить игровой процесс, дабы никто в игре не помешал.