20150817

Перезагрузка. Ассемблер. Часть 2. Как работает процессор и что такое регистры.

Оглавление:
----------
Часть 0. [Установка и настройка]
Часть 1. [Пишем первую программу]
Часть 2. [Как работает процессор и что такое регистры]

Часть 3. [Знакомимся с отладчиком]

------------------------------------
Весь исходный код можно взять [тут].
------------------------------------

Скучали? Я - да. :)

Глядите картинку:



Эта штучка, если вдруг кто не знает, называется Центральный Процессор. И эта штучка помогает компьютеру делать то, что он делает - складывать цифры.

Спросите, нафига я это рассказываю? А рассказываю я это затем, что в прошлой статье мы вызвали пару WinAPI функций, которыми (на самом деле!) дело не ограничивается. Еще возможно, что вы прочитали в какой-нибудь умной книжке про то, что в процессоре есть регистры, а на ассемблере можно с ними как-то взаимодействовать. Дык вот, это - правда. Регистры есть. Что это за слово вообще такое? Представьте себе, что процессор - маленький и слабый, но очень быстро и хорошо думает. Типичный ботаник, в общем. Он не может унести с собой сразу много учебников, но быстро решает задачи, которые в них написаны. Вот регистры - и есть эти самые "учебники". Это просто небольшие места в процессоре, где тот может сохранить какие-то данные, чтобы с ними что-то сделать. Сложить, умножить, из регистра в регистр переставить. Вот картинка:



Ячейки на таблице (все, кроме EFLAGS) - это регистры. EAX, EBX, ECX и так далее.

Теперь немножко о том, почему они так называются. Слышали когда-нибудь такое слово, как "разрядность"? 8 бит, 16 бит, 32 бита, 64 бита. Последние два еще часто любят звать x32 и x64. Встречаем, Intel 8086:

А именно, первый в мире 16-битный микропроцессор. 16-битный значит, что регистры его могут в себя вместить 16 бит каждый, не больше. То есть по 2 байта. от 0x0000 до 0xFFFF в 16-ричной же системе счисления. Вот картинка с его регистрами:

Как вы уже давно заметили, у него в именах регистров отсутствует буква "E". Кстати, буквы H и L означают High и Low, и относятся к половинкам регистров - верхние 8 бит (от 15 до 8) и нижние (от 7 до 0).

Давайте рассмотрим регистры (хотя бы основные) по порядку:



AX - регистр, выполняющий роль основного хранилища данных.
BX - в этом регистре когда-то давно содержался адрес начала исходного кода программы в памяти компьютера.
CX - регистр-счетчик, благодаря которому можно делать циклы.
DX - дополнительное хранилище данных, если в AX все не влезло.

Но, как я уже сказал, это регистры общего назначения, так что можно их использовать, как захочется. По сути, можно положить в один регистр число 2, в другой число 5, а затем заставить процессор сложить их. И положить результат куда-нибудь еще, например, в третий регистр. Круто? Неимоверно!

Возвратимся немного к современному миру. Мы (пока что) будем рассматривать только 32-битный ассемблер, так что наш потолок - 32-разрядные регистры. Это те, в именах которых есть буква "йе". Она происходит от сокращения с английского "Extended" - "Расширенный". Угадали, ага. Это дополнительные 16 бит пространства, так что всего в 32-разрядный регистр влезет аж 32 бита, или 4 байта данных.

Уф! Думаю, хватит пока что теории. В следующей статье мы посмотрим на все эти регистры с практической точки зрения, а заодно узнаем, как исправлять в нашей программе ошибки и выяснять, как вообще она работает. Оставайтесь у своих экранов!

---------------------------------------- 
Вопросы? Пожелания? Предложения? 
Вот как можно со мной связаться: 
[email]
[vk]
[twitter]
[telegram]

----------------------------------------

20150816

Перезагрузка. Ассемблер. Часть 1. Пишем первую программу.

Оглавление:
----------
Часть 0. [Установка и настройка]
Часть 1. [Пишем первую программу]
Часть 2. [Как работает процессор и что такое регистры]

Часть 3. [Знакомимся с отладчиком]

------------------------------------
Весь исходный код можно взять [тут].
------------------------------------

Соскучились? Сегодня приступим к практике и напишем нашу первую программу на ассемблере. :)

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



А теперь резко берем и пишем туда:


Написали? Тыкаем меню Run->Run, или же просто F9. Результат:


Круто? Конечно, круто! Давайте разбираться с этими страшными шестью строчками кода по порядку:

include '%include%/win32ax.inc'

Самая первая строчка говорит, что в этот исходный файл нужно включить еще один. Include - это, собственно, включить, а дальше идет имя файла в одинарных кавычках. Файлы эти лежат в папке include там, где установлен компилятор flat assembler (см. предыдущую статью), а нам сейчас нужен win32ax.inc. В нем объявлены всякие нужные и важные штуки, про которые нам сейчас знать не обязательно, но потом - обязательно узнаем, так что не переживайте. Пока что можно думать, что файл этот нужен и без него ну вот никак. Идем дальше:

.code

Это - название так называемой секции. На самом деле, как мы узнаем в будущем, EXE файлы Windows имеют определенный формат, а именно - PE, или Portable Executable, и состоит он из секций. В одной секции хранится код, в другой - данные, в третьей - ресурсы (иконки всякие и картинки). Догадались? У нас сейчас одна секция и в ней - код, судя по названию. Название, на самом деле, любое может быть.

start:

Start - это как на беговой дорожке на стадионе, отсюда начинать бежать нужно. По-умному это место называется [точкой входа]. Когда мы тыкаем мышью на EXE-файле с желанием его запустить, Windows по сути просто копирует его в оперативную память, находит адрес точки входа и командует процессору - иди туда и начинай выполнять код. Вот и все.

invoke MessageBox,HWND_DESKTOP,"Hello, World!",0,MB_OK

О, начинается код! Тут - самая интересная часть. Этой строчкой мы вызываем функцию, да не просто функцию, а функцию [WinAPI]. Что это за WinAPI такое? Это - набор функций (небольших программ), которые позволяют произвести определенное действие, больше они ничего не делают. Функция "открыть дверь", функция "налить борща", функция "поспать". И вот точно так же - функция "[показать окно с сообщением]". Функции могут принмать параметры, которые называются аргументами, а так же могут возвращать результат. Чаще всего - ноль или не ноль, то есть результат своей работы. Почему так просто? Потому что эта штука существует уже лет 20, а 20 лет назад не было возможностей толком повыпендриваться. Разберем эту строчку еще подробнее:

invoke

Специальная команда, говорящая "выполни команду!". За ней обычно следует имя функции. На самом деле является [макросом].

MessageBox

Встречаем - имя WinAPI-функции! По нему, немного приноровившись, можно легко определить, что функция делает.

HWND_DESKTOP,"Hello, World!",0,MB_OK

После названия функции обычно идут ее аргументы. Тут у нас их аж четыре штуки:

HWND_DESKTOP

Идентификатор окна рабочего стола. Вы думали, что Windows просто так называется Windows (окна)? А вот и нет! На самом деле, в ней ВСЁ - это окна! В том числе и рабочий стол. А чтобы не путаться, у каждого окна есть свой идентификатор, который по факту - просто набор цифр. Идентификатор этот часто называют хэндлом (от английского handle). Так что непонятные буквосочетания в названии идентификатора - HWND - это Handle Window. При компиляции программы компилятор, как самый умный из присутствующих, находит, что на самом деле значит HWND_DESKTOP и заменяет его цифрой-идентификатором. А мы можем писать имя, потому что так понятнее и так проще запоминается.

"Hello, World!"

Текст, который будет показывать нам окно. Прям вот текст и все.

0

Заголовок, вместо которого я написал 0, так что его там не будет. Можно написать что-нибудь в кавычках и посмотреть на эффект.

MB_OK

Эта штука определяет, каким будет окно сообщения. Да-да, они бывают разные. Список возможных можно найти по ссылке чуть выше, там где описание функции. Сейчас у нас будет просто кнопка "ОК". 

Уф! С первой строчкой кое-как разобрались. Осталось немного:

invoke ExitProcess,0

Знакомо? Смутно, но что-то припоминается. Вызываем функцию командой invoke, функция называется [ExitProcess] и принимает один-единственный аргумент, в нашем случае - ноль. Почему ноль? Потому что если программа, завершившись, показывает операционной системе ноль, значит все хорошо - так она думает. Значит завершилась она нормально и без ошибок. А функция сама, как я уже написал, завершает выполнение программы, в результате чего та закрывается.

Последняя строчка осталась:

.end start

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

Ну как? Трудно? Великие гуру всю жизнь твердили вам, что освоить ассемблер - дело избранных и что он невообразимо сложен? Как бы не так! В современном мире и под Windows все сводится к вызову тех или иных WinAPI-функций в нужном порядке и с нужными аргументами. Ничего больше. Серьезно. А вызывать эти функции можно хоть на ассемблере, хоть на Си, хоть на Паскале. Вот так вот!

А вот и [полный исходный код] программы из статьи. :)

---------------------------------------- 
Вопросы? Пожелания? Предложения? 
Вот как можно со мной связаться: 
[email]
[vk]
[twitter]
[telegram]

----------------------------------------

20150809

Перезагрузка. Ассемблер. Часть 0. Установка и настройка.

Оглавление:
----------
Часть 0. [Установка и настройка]
Часть 1. [Пишем первую программу]
Часть 2. [Как работает процессор и что такое регистры]

Часть 3. [Знакомимся с отладчиком]

------------------------------------
Весь исходный код можно взять [тут].
------------------------------------

Ребята, всем привет!

Это - нулевой пост из рубрики постов про Ассемблер для самых начинающих. В нем я покажу, причем не просто покажу, а с картинками, как установить и настроить все необходимое для начала изучения.

Вам не понадобится ни тайных знаний математики, ни опыта программирования, хотя и то и другое как следует приветствуется и лишним никогда не будет.

Поехали! По пунктам:

0. Открываем в браузере сайт - [http://flatassembler.net/]:



1. Идем в раздел "Download" и выбираем "flat assembler for Windows":


2. Распаковываем скачанный архив куда-нибудь. У меня получилось так:


3. Если по двойному клику на файле "FASMW" у вас открывается вот такое окно:


Значит все работает и вы готовы продолжить.

Чуть ниже я покажу дополнительную вещь - для тех (вроде меня), кто любит работать с командной строкой. Итак:

0. Открываем командную строку. Как? Win+R, "cmd" без кавычек, Enter:



Нам необходимо добавить путь к свежескачанному компилятору в системную переменную PATH. Это такая длинная простыня путей, откуда система попытается взять исполняемый файл, который пользователь захочет запустить. Самый первый пример - то, как мы запускали командную строку (Win+R, "cmd"). Вот cmd - это исполняемый файл, ага. Пишем в консоли вот так, держа в уме (или записав на бумажку) путь к папке, куда мы распаковали архив с flat assembler:


И жмем Enter:


Готово! Только нужно проверить, все ли правильно. Закрываем это консольное окно и открываем новое (Win+R, "cmd"), в котором пишем "fasm" без кавычек и давим Enter:


Если у вас картина примерно так же выглядит, значит все настроено верно, с чем и поздравляю. 

---------------------------------------- 
Вопросы? Пожелания? Предложения? 
Вот как можно со мной связаться: 
[email]
[vk]
[twitter]
[telegram]

----------------------------------------

20150808

Про конкурс от gamehacklab, пожертвования и будущие посты.

Ребята, всем привет!

Я кенг, дела у меня хорошо, спасибо. Почему я так долго ничего не писал и ничего не выкладывал? Да, меня тоже это бесит, прекратите кидаться, пожалуйста. Во-первых, наступило лето, но меня, равно как и вас, это не должно особенно волновать. Во-вторых, у меня сменилось место работы. Поэтому я последние 2-3 месяца на работе сижу просто безвылазно - испытательный срок, то да се. Но в этом есть и хорошая сторона - теперь у меня будет больше свободного времени, как минимум по выходным, а выходных как раз хватает на написание поста и\или запись видео.

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

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

Я решил начать со второго пункта, очень аккуратно и потихоньку объяснив язык ассемблера как таковой, как это все работает и что вообще происходит, так что видео будут выходить сначала с объяснениями - мы будем сидеть и изучать сам ассемблер в отладчике на абстрактных примерах, постепенно создавая трейнерный движок, а параллельно я буду показывать некоторые вещи в Cheat Engine - про Code Injection, Code Shifting, Code Relocation, Staple Intersection и тому подобные вещи.

Да, вы все правильно прочитали - теперь в блоге будет ТОЛЬКО ассемблер. Почему? Потому что я его люблю - раз. Потому что с ним в любом случае придется работать хотя бы во время взлома игры - два. Потому что он не такой пугающе сложный, как может поначалу показаться - три. И четыре - потому что его более чем достаточно для написания движка, зато можно будет неплохо выпендриться перед друзьями.

Вы могли заметить в верхней части блога штучку с подписью "помоги кенгу!". Для осмелившихся на ней кликнуть откроется возможность просто так взять и выдать мне любое количество денег на ваше усмотрение. Не то, чтобы они были мне жизненно необходимы и тем более я не собираюсь жить за счет блога, но это будет приятная плюшка, на которую можно будет купить игры или какие-то программы. Текущая цель - Bandicam, который стоит 39 сатанинских долларов. Плюс это в любом случае будет очень сильно меня мотивировать, потому что альтруистичный энтузиазм, на котором уже пять лет держится вся затея, не резиновый. И мне совершенно не хочется бросать это дело.

Больше скажу - мне хочется развивать его дальше, как минимум до уровня мировой сцены. Следовательно, чем больше будет читателей\зрителей и участников, тем быстрее попрет дело, потому что коллективный разум - всегда сильнее. Поэтому я горячо прошу всех читателей блога и зрителей канала на youtube рассказывать об этом в социальных сетях - пусть сарафанное радио работает.

Кстати, возможно я уже говорил, но на форуме gamehacklab несколько месяцев назад официально открылся раздел по взлому многопользовательских игр. И уже даже есть свои наработки, да-да!

А что за конкурс? Конкурс, к сожалению, уже прошедший, но я все равно хочу о нем написать. Берем игру, берем сроки в 2-3-4 дня и затем участники конкурса делают как можно больше опций для игры - бессмертие, бесконечные патроны или что-то еще, быстрое перемещение, возможность летать и так далее. А дальше разыгрывается призовой фонд в виде репутации на форуме, уважухи и разнообразных скидок и игр в Steam. Интересно? Добро пожаловать на форум! Уверен, конкурс этот - не единственный.

Еще совсем недавно открылась страничка Вконтакте, посвященная сайту gamehacklab.ru. Там наш админ выкладывает свою собственную серию обучающих видео, причем он любит C++. Ознакомиться будет все равно полезно, даже если вы все это уже знаете.

Вот она - [ссылочка] на официальную страницу ВК.

На этом - пока все. Думаю, что запишу хотя бы видео-введение по программированию. Критика и пожелания - в комментарии. :)