20110915

Какой язык программирования выбрать?

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

-Ассемблер. Самый низкоуровевый язык, на нём пишут все крутые чуваки из всяких там DEViATED, PizzaDOX и Razor1911. Для понимания с нуля - трудноват, кода будет довольно много, с другой стороны - мы же его используем при взломе (в отладчике), трейнеры будут очень маленького размера (максимум - 50-100 килобайт) и очень быстрые (но это не так критично).

-C\C++. Языки более высокого уровня - кода меньше, он во многом гораздо понятнее для неподготовленного человека, трейнеры будут уже чуть побольше, кода писать придётся меньше.

-Языки высокого уровня - C#\Basic\Java. Кода писать ещё меньше, но трейнеры будут уже довольно ощутимого размера (под пару-тройку мегабайт - запросто). Для понимания - ещё проще, чем предыдущие С и С++.

Я разместил опрос (слева от основных постов) - потыкайте кнопочки, а? И вам, и мне будет проще. Пару недель опрос повисит, а дальше буду на результаты смотреть.

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

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

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

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

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

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


20110913

Скоро тест Тьюринга будет уверенно пройден!

Или очередные потуги компьютерной программы прикинуться человеком. Весьма интересно, [по ссылке]. :)

Пятый урок, товарищи, пятый урок!

Сразу же, с большого-большого разбега, [ссылка]!
Видео пришлось разбить на две части из-за врождённого рака мозга создателей органичения длины ютубного видео в 15 (!) минут - но ДЕЛАТЬ НЕЧЕГО, поделиться-то очень хотелось. ^^
В этом уроке мы познакомимся с шайтан-вещью - отладчиком - чуть поближе, ну и ещё пару клёвых штуковин:

1. Если код игры управляет вашим здоровьем - он может управлять и вражеским, ноп'ить (деактивировать) такой код будет бессмысленно - это даст бессмертие не только вам, но и вражине! В видео показан пример такой ситуации. ;)

2. Если мы меняем код игры, то нужно следить, чтобы длина старых инструкций совпадала с длиной новых, нами написанных. Иначе игра вас не поймёт и умрёт не совсем храброй смертью - придётся всё делать сначала. В видео это объяснено, но я постараюсь остановиться на этом подробнее в следующих уроках.

Ещё мы познакомимся с несколькими новыми ассемблерными командами:

1. push [что-то] - "толкнуть в стек". Про стек советую почитать подробнее в статьях\книгах по ассемблеру, но попытаюсь и объяснить:

Представьте себе стопку монеток. Можно положить сверху ещё одну ("толкнуть" в "стопку монет"), а можно:

2. pop [что-то] - "вытолкнуть из стека".

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

Толкаем:
Рубль, пять, два, десять

Выталкиваем:
Десять, два, пять, рубль

То есть, выталкивается всегда в обратном порядке. Часто этот процесс описывается как "Первый пришёл - последним уйдёшь". Заумная штука, да, но понимание придёт. Со временем. :)

Ещё пара команд:

3. jmp [адрес] - "прыжок" (англ. jump), переход на какой-то адрес. Важно - работает всегда, не смотря ни на какие условия и ни на что не обращая внимание.

4. cmp [первое],[второе] - сравнить первое со вторым. Операция сравнения, от английского to compare - сравнивать. Этой команде чаще всего следуют:

5. je\jne [адрес] - "прыгнуть, если" (англ. Jump if Equal \ Jump if Not Equal - "Прыгнуть, если равно \ Прыгнуть, если не равно") - такой же прыжок, как и jmp, но с условием - в первом случае прыгаем, если результат предыдущей команды (почти всегда это cmp - сравнение) положительный (первое равно второму), во втором - если отрицательный (не равно, кто бы мо г подумать!).

Ещё в этом уроке попалась такая инструкция, как lea [куда-то],[что-то] - "load effective address" - "загрузить эффективный адрес". Не буду вдаваться в подробности, скажу попроще: команда загружает значение "что-то" в "куда-то". Под "куда-то" чаще всего подразумевается какой-то из регистров процессора. Команда эта используется вместо команды mov (о ней - чуть ниже), потому что последняя плохо работает с копированием адресов в регистры. Так-то!


Ну и последняя (на этот раз, хе-хе):


mov [куда],[что] - англ. "move" - "переместить" - на самом деле, не перемещает, а копирует содержимое "что" в "куда". Например: 



mov eax, 123456 //Копирует "123456" в регистр eax
mov edx, eax //Копирует содержимое eax в edx


После выполнения команды число "123456" будет находиться И в eax И в edx. Одна из самых распостранённых команд, да. ^^




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

PS: Если команды не хотят запоминаться - не переживайте, их знать понадобится порядка 10-15 штук, не больше. Если не понимаете значения той или иной команды (или просто забыли) - то идём в гугл и вводим запрос "assembler команда" или "ассемблер команда", где "команда" - это то самое буквосочетание из отладчика, что вас так смущает. :D


20110912

И сразу, чтобы не расслабляться, четвёртый урок!

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

[Четвёртый урок]


А теперь - немного теории. Совсем немного, правда. Но это очень сильно облегчит дальнейшее обучение. :)

Начнём с некоторых понятий, с которыми мы уже сталкивались:

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

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

Остановимся на окне отладчика Cheat Engine чуть подробнее. Вот скриншот (смотрим на красные цифры):
1. Количество вызовов инструкции игрой. Один раз выстрелили - один раз вызвалась инструкция, которая забирает патроны. И так далее.
2. Адрес в коде игры, по которому находится инструкция. Важно: адреса кода никогда не меняются!
3. Представление этой инструкции в шестнадцатеричной системе счисления, или опкод этой инструкции. Например, код инструкции nop - 90. [заумное объяснение]
4. Сама инструкция в виде команд ассемблера. В данном случае - sub - subtract- вычитание.
5. Пояснение той самой команды, если вы не знаете полного значения.




С особо любопытными делюсь набором статей по введению в ассемблер - [ссылка], второй абзац, "Дневники чайника", Чтивы 0-1-2-3. Так же - архив рассылки Калашникова, на данный момент уже не очень актуален, но материал там даётся просто отлично: [ссылка], крутим вниз до абзаца "Приятного вам изучения!", качаем "Полный архив рассылки" и "Необходимое ПО".
Ещё одна неплохая статья от Криса Касперски - [ссылка].

Пока всё, вникайте, задавайте вопросы. В следующих уроках сделаем ещё что-нибудь интересное. :)

PS: В качестве небольшого домашнего задания попробуйте найти указатель для адреса здоровья и\или для патронов (для того оружия, что в руках, или для любого).




Третий видеоурок и короткий рассказ про указатели и динамическое распределение памяти.



Ребята, перед просмотром урока\практикой - это важно! - сделайте следующее:

1. Откройте Cheat Engine, нажмите на кнопочку "Settings" ("Настройки") - Рис. 1.
2. Убедитесь, что галочка "Pointer adding: Append pointerline instead of insert" нажата - Рис. 2.


3. Всё, можно нажимать "ОК" и смело приступать к изучению. :)

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

И, чуть подробнее, про DMA ("Dynamic Memory Allocation", "Динамическое аспределение памяти") - [ссылка]. Если будет с ходу понятно и интересно - можете поискать и на английском, там подробностей побольше. :)

Ах да, [ссылка на урок], чуть не забыл! :D 

20110910

В дополнение к предыдущей записи - тренироваться будем вот на этой вот игре: [Turok 2: Seeds of Evil]. Одна из любимейших игр детства была. Эх, ностальгия! :)

PS: Очень надеюсь, что у всех желающих она нормально запустится - у меня, на Win7 x32, запустилась на ура, хотя игра - аж 1998 (sic!) года выпуска.

Неожиданно, второй урок.

Привет, ребята!

Жаркое лето кончилось, наступила школа осень, а это значит что пора поучиться ещё чему-нибудь, например - взлому игр! ^^ На этот раз мы познакомимся с программой [Cheat Engine], её интерфейсом, основными возможностями, а так же попробуем побороть идущую с ней в комплекте программу-обучалку по взлому, сегодняшняя тема - поиск неизвестного значения. Что это значит? А вот что:

Все видели в играх не конкретные значения здоровья (100, 80, 47), а полоски? Такая дико раздражающая штука, которая, будучи не заполненной, всегда жутко нервирует? Кто же не мечтает о том, чтобы она вообще не убавлялась? Бесконечное здоровье, энергия в плазменной винтовке, да что угодно! И это ведь легко! Смотрим, познаём, пробуем. В следующем уроке - издевательства над настоящей игрой! :)

[А вот и ссылка на урок]



20110629

Завершение опроса на тему тематики блога.

 Спасибо всем, кто яростно голосовал и дискутировал в комментариях на тему дальнейшей тематики! :)
 Шучу-шучу. Всё-таки, блог будет вестись по обучению гейм-хаку, то есть взлому игр, как и планировалось изначально - больно уж долго я собирал информацию на эту тему по всему интернету. Хочется как-то всё структурировать, организовать и привести в читабельный, доступный вид.
 Думаю, формат записей немного изменится - постараюсь писать полноценные статьи - с теорией, пояснениями, скриншотами и, конечно, практикой (разбором примеров на конкретных играх). В конце каждой статьи - видеозапись этой самой практики, чтобы было нагляднее.
 Как-то вот так. Будет от всего этого польза или нет - посмотрим. Со временем.

20110628

Возобновление работы блога.

Появилось время для дальнейшего ведения блога, но появилась небольшая загвоздка, а именно - тематика блога. Могу провести рубрику статей о программировании, а могу продолжить писать видео и статьи по взлому игр. Что выбрать? Ответы и пожелания - в комментарии.