Привет! Я попробую объяснить максимально на пальцах, возможно что-то уже было сказано другими. 1. Что такое стек и с чем его едят? (На самом деле до сих пор в полной мере не представляю, что это такое). 2. Брекпойнты и условные брекпойнты на инструкции. 3. Реверс (как он делается? что мы можем получить из этого? ну и т.д.) 4. Более подробное описание опций СЕ (ну например что такое структурный паук, для чего он?) 1. Стек - это место, где хранятся какие-то данные программы во время ее выполнения. Хранятся временно, в пределах функции, скажем. Представь себе такую программу (в псевдокоде):
переменная А = 2
переменная Б = 2
функция сложить:
переменная В = А + Б У тебя объявлено две переменных - А и Б. Они видны (к ним есть доступ) как из единственной функции сложить, так и из других, если бы они были. Эти переменные - глобальные. Когда вызывается функция сложить, в процессоре передается управление на первую строчку этой функции, которая создает третью переменную - В, и в нее складывает результат сложения А и Б. Переменная В здесь - локальная, т.е. создана внутри функции, пока та выполнялась. Извне (из других функций программы) к этой переменной доступа нету. Дык вот эта самая переменная будет храниться в стеке. Глобальные переменные хранятся в общей памяти, которая выделена программе операционной системе. Т.е. запустил программу - в ее памяти висят переменные А и Б. Вызвал функцию сложить - внутри нее на стеке создалась переменная В. Почему глобальные переменные в общей памяти (ее обычно называют "куча"), а локальные - на стеке? Потому что стек быстрее работает. А если у функции есть аргументы, то при вызове этой функции они тоже сохраняются на стеке. 2. Тут стоит сказать, что в оперативной памяти хранятся как данные программы (ресурсы, звуки, надписи, переменные), так и код, который исполняется процессором. И в памяти все это хранится по адресам. Это значит, что можно найти адрес какой-то переменной (значения здоровья, например), а можно найти адрес, где лежит код, который что-то делает. Скажем, адрес функции, которая наносит урон по герою игры. Выключаешь ее - герой становится бессмертным, так как урон больше не наносится. Брейкпоинты в основном нужны затем, чтобы искать участки кода (или функции), которые работают с теми или иными данными (переменными). А адрес, находимый при срабатывании брейкпоинта (нужно узнать, какой код изменяет переменную здоровья - ставим брейкпоинт на запись - меняем здоровье - отладчик останавливается на участке кода, который изменил значение переменной - получаем адрес в памяти, где хранится код), можно использовать в трейнерах, чтобы каждый раз не искать нужную переменную и нужный участок кода, дабы его отключить. Условные брейкпоинты - все то же самое, но срабатывают они при соблюдении некоторых условий. Скажем, если в регистре EAX лежит 1 при выполнении инструкции, на адресе которой установлен брейкпоинт. Это нужно для отладки более сложных функций игры, например таких, которые работают со множеством значений (не только здоровье героя, но и противников). 3. Реверс по своей сути - это процесс понимания того, как работает программа, читая ее исходный код. Когда исходного кода нет, то исполняемый файл игры дизассемблируется, получается код на ассемблере. По сути - читаешь и думаешь\понимаешь, как оно работает и что делает. Нашел функцию, которая наносит противнику урон. Почитал поподробнее вверх и вниз - нашел место, где за врага герою игры дают опыт. Или из него выпадают деньги. Или что-нибудь еще происходит. 4. Смотря каких. Structure spider используется при сравнении и поиске в памяти игры похожих структур, а так же при поиске игровых объектов. Обычно это используется тогда, когда движок игры построен на скриптах - обычно, текстовых. С этим сталкиваются довольно редко, так что сразу это знать и помнить не необходимо.