Перейти к содержанию

Помогите убрать некоторые пробелы в знаниях.


Garik66

Рекомендуемые сообщения

Если кто, что читал (смотрел видео) на форуме, скиньте пожалуйста ссылку в эту тему.

 

Какие вопросы интересуют:

1. Что такое стек и с чем его едят? (На самом деле до сих пор в полной мере не представляю, что это такое).

2. Брекпойнты и условные брекпойнты на инструкции.

3. Реверс (как он делается? что мы можем получить из этого? ну и т.д.)

4. Более подробное описание опций СЕ (ну например что такое структурный паук, для чего он?)

5. Трейссер - ссылку на английскую статью в посте MasterGH.

6. Ultimap - смотри сообщение MasterGH.

7. Tiny Dumper - сообщение MasterGH.

 

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

Прежде чем выложить сюда вопросы, которые меня сейчас интересуют искал, перерыл кучу макулатуры, которая к сожалению есть на форуме.

Всем кто поможет - заранее Большое спасибо!!!. 

Ссылка на комментарий
Поделиться на другие сайты

Если кто, что читал (смотрел видео) на форуме, скиньте пожалуйста ссылку в эту тему.

 

Какие вопросы интересуют:

1. Что такое стек и с чем его едят? (На самом деле до сих пор в полной мере не представляю, что это такое).

2. Брекпойнты и условные брекпойнты на инструкции.

3. Реверс (как он делается? что мы можем получить из этого? ну и т.д.)

4. Более подробное описание опций СЕ (ну например что такое структурный паук, для чего он?)

 

 

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

Прежде чем выложить сюда вопросы, которые меня сейчас интересуют искал, перерыл кучу макулатуры, которая к сожалению есть на форуме.

Всем кто поможет - заранее Большое спасибо!!!. 

 

О, спасибо, эти вопросы тоже включу в цикл видеоуроков.

Ссылка на комментарий
Поделиться на другие сайты

все помним "Операция "Ы", и другие приключения Шурика", где персонаж Георгия Вицина взял нижний горшок, да? :) )

 

Ооо! Спасибо большое!) Хотел пересмотреть этот фильм недавно, а название вылетело из головы))

Изменено пользователем RockHamer
Ссылка на комментарий
Поделиться на другие сайты

 

1. Интересует не определение, а способы работы со стеком, что и как мы можем из него узнать?

2. Меня интересуют не Брекпойнты на адрес, а Брекпоинты на инструкции в Отладчике, ну и отсюда условные Брекпоинты.

3. Реверс - снова интересует не определение, а именно процесс, как это делается, где-то видел статью MasterGH. но потом не смог её найти, конечно лучше бы видео с объяснениями.

4. Видео Kenga посмотрю - спасибо.

 

О, спасибо, эти вопросы тоже включу в цикл видеоуроков.

Видео - очень буду ждать.

Xipho, что-то пока не сложилось, но не одного Вашего видео не смотрел.

У Вас на Тюбе, тоже есть канал (чтобы посмотреть можно было в одном месте)?

Ссылка на комментарий
Поделиться на другие сайты

1. Если говорить о данных в стеке, то проще представить, что остановив процесс игры по условному брейкпоинту, по адресу ESP хранятся только копии данных при перходах между call-ами. Эти копии могут быть временными и могут быть скоро стёртыми, и нигде более не существовать в памяти. Однако, могут быть и копии адресов или указателей, которые существуют на протяжении всей игры, т.е. данные по этим адресам актуальны долгое время до загрузки нового уровня игры или во время всей игры.

 

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

ecx = @obj
call obj->Функция(аргументы функции помещаемые в стек, ...)
obj.health =
obj.armor =
obj. ...

Во время вызова call Адрес1 в стек по esp автоматически добавляется копия адреса возврата Адрес1 + 5 (адреса идущего после инструкции call).
Если по esp будет сумма Адрес1+5 и при этом выполнить ret инструкцию, то eip(указатель на текущую инструкцию) возвратиться сразу же за call-инструкцию, при этом esp сдвинится на размер адреса.

2. Цель условных брекйпоинтов остановить игру при условии. Например, условие EAX==0X40000000

3. Реверс инженеринг это выполнение ветки кода "наоборот" до какого-то участка дизассемблерного кода.



4. Тут я теоретически вижу так.

"Путешествуешь" из глубины кода обратно вверх по ret-ам логически подставляя значения регистров из адресов, в том числе из стека применяя и условные брейкпоинты. Таким образом ты можешь получить цепочку указателей до нужного уровня. На звенья цепочки ставить бряки чтобы определить прервавшиеся инструкции. А на них определить для кого они работают, только для игрока, только для врага, только для дружественного игрока, или для всех сразу... Этот процесс возможно потребует большого внимания и возможно не мало времени. В очень тяжелых случаях реверсинга  могут упростить задачу автоматическая трассировка с логированием регистров и стека (есть у CE) или декомпиляторы C++. Также интересный метод трейса по ретам между бряком1 и бряком2 в OllyDbg. После бряка 1 трейсишь по ретам. После бряка2 отпускаешь игру без трейса и после чего происходит остановка на ret где была развилка рутин до бряка1 и до бряка2. Т.е. поднялись из бряка1 на ветку, погрузились в ветку бряка2 и остановились на выходе из ветки с бряком2... В общем долго писать, написал как смог.

 

post-3-0-98773500-1421158117_thumb.png

Структурный паук помогает более точно определить данные в структуре на основе их изменения. Если в Dessect Data/Structure мы видим предлагаемые данные CE, то далее мы только вручную можем определять их размер. В структурном пауке же если меняется один байт, значит это один байт, если поменялось 4 байта, значит это 4 байта по адресу в структуре. Чем больше изменений в структуре, тем точнее она будет...

 

* Структура и объект в программировании имеют разные свойства.

 

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

 

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

 

Пример структуры

 

structure Vector3 {float X, float Y, float Z}

class Player {float health, float armor}

 

Вызов функции с передачей вектора или игрока расположит в стеке данные следующим образом.

 

 Для структуры в стеке это будет x,y,z по 4 байта (порядок я точно не помню, кажется его надо писать обратным)

 

void SomeFunction(Vector3 position){

 в стеке будет

x(4 байта)

y(4 байта)

z(4 байта)

}

 

Для игрока это будет только адрес 4 байта. 

void SomeFunction(Player player){

 в стеке будет

 player(4 байта)

}

Ссылка на комментарий
Поделиться на другие сайты

Заметил, что не-которые статьи при первом прочтении - очень трудны к перевариванию, только спустя некоторое время, после получения опыта и доп. знаний, читаемая ранее статья становится понятной.

 

Пока MasterGH. не всё из прочтённого понял.

 

По 2. пункту недавно столкнулся с проблемой т.е. в игре Fallout 3 нашёл инструкцию, она отвечает за очень большое количество адресов.

Если ставить просто бряк на неё то игра зависает и ни чего не даёт в ней сделать, а если поставить условный бряк, то БП не срабатывает,

небольшое обсуждение, начиная с этого сообщения.. Посмотрите, если не трудно, может Вы, что подскажите. 

Ссылка на комментарий
Поделиться на другие сайты

Привет! Я попробую объяснить максимально на пальцах, возможно что-то уже было 

сказано другими.

 

1. Что такое стек и с чем его едят? (На самом деле до сих пор в полной мере не

 представляю, что это такое).

2. Брекпойнты и условные брекпойнты на инструкции.

3. Реверс (как он делается? что мы можем получить из этого? ну и т.д.)

4. Более подробное описание опций СЕ (ну например что такое структурный паук, 

для чего он?)

 

1. Стек - это место, где хранятся какие-то данные программы во время ее 

выполнения. Хранятся временно, в пределах функции, скажем. Представь себе такую

 программу (в псевдокоде):


переменная А = 2
переменная Б = 2
 
функция сложить:
переменная В = А + Б

 

У тебя объявлено две переменных - А и Б. Они видны (к ним есть доступ) как из 

единственной функции сложить, так и из других, если бы они были. Эти переменные

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

управление на первую строчку этой функции, которая создает третью переменную - 

В, и в нее складывает результат сложения А и Б. Переменная В здесь - локальная,

 т.е. создана внутри функции, пока та выполнялась. Извне (из других функций 

программы) к этой переменной доступа нету. Дык вот эта самая переменная будет 

храниться в стеке. Глобальные переменные хранятся в общей памяти, которая 

выделена программе операционной системе. Т.е. запустил программу - в ее памяти 

висят переменные А и Б. Вызвал функцию сложить - внутри нее на стеке создалась 

переменная В. Почему глобальные переменные в общей памяти (ее обычно называют 

"куча"), а локальные - на стеке? Потому что стек быстрее работает. А если у 

функции есть аргументы, то при вызове этой функции они тоже сохраняются на 

стеке.

 

2. Тут стоит сказать, что в оперативной памяти хранятся как данные программы 

(ресурсы, звуки, надписи, переменные), так и код, который исполняется 

процессором. И в памяти все это хранится по адресам. Это значит, что можно 

найти адрес какой-то переменной (значения здоровья, например), а можно найти 

адрес, где лежит код, который что-то делает. Скажем, адрес функции, которая 

наносит урон по герою игры. Выключаешь ее - герой становится бессмертным, так 

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

участки кода (или функции), которые работают с теми или иными данными 

(переменными). А адрес, находимый при срабатывании брейкпоинта (нужно узнать, 

какой код изменяет переменную здоровья - ставим брейкпоинт на запись - меняем 

здоровье - отладчик останавливается на участке кода, который изменил значение 

переменной - получаем адрес в памяти, где хранится код), можно использовать в 

трейнерах, чтобы каждый раз не искать нужную переменную и нужный участок кода, 

дабы его отключить. Условные брейкпоинты - все то же самое, но срабатывают они 

при соблюдении некоторых условий. Скажем, если в регистре EAX лежит 1 при 

выполнении инструкции, на адресе которой установлен брейкпоинт. Это нужно для 

отладки более сложных функций игры, например таких, которые работают со 

множеством значений (не только здоровье героя, но и противников).

 

3. Реверс по своей сути - это процесс понимания того, как работает программа, 

читая ее исходный код. Когда исходного кода нет, то исполняемый файл игры 

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

думаешь\понимаешь, как оно работает и что делает. Нашел функцию, которая 

наносит противнику урон. Почитал поподробнее вверх и вниз - нашел место, где за

 врага герою игры дают опыт. Или из него выпадают деньги. Или что-нибудь еще 

происходит.

 

4. Смотря каких. Structure spider используется при сравнении и поиске в памяти 

игры похожих структур, а так же при поиске игровых объектов. Обычно это 

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

 С этим сталкиваются довольно редко, так что сразу это знать и помнить не 

необходимо.

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Keng, спасибо.

 

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

Так что буду ждать видео Xipho и просматривать твои (и других) может на что-нибудь там натолкнусь.

Ссылка на комментарий
Поделиться на другие сайты

Условные брейпоинты в CE ставятся не как EDI==03B6228C, а как EDI==0x03B6228C

 

Так же не правильно:

1. edi==03B6228C  - регистры должны быть с большой буквы

2. Не должность быть русских символов например русская буква С и английская С

3. и вроде, не дложно быть пустых пробелов

 

Также, советую помнить финт когда условный бряк очень сильно тормозит игру (такое бывало и часто). В этом случае поможет АА-инъекция. Позволяет сделать условие любой сложности и можно сравнить тот же EDI как 

 

cmp edi,03B6228Cje original codenop  // сюда ставишь бряк на выполнение по F5 в дизассемблере CEnoporiginal code:

Да, и глянь видео Xipho. Там вроде был пример по взлому со стеком. Это единственный пример ведо, если я не ошибаюсь, где был применен стек. Если это не то видео, то поищи еще. Я просто сейчас очень спешу. Даже Кенга не почитал выше.

Ссылка на комментарий
Поделиться на другие сайты

Условные брейпоинты в CE ставятся не как EDI==03B6228C, а как EDI==0x03B6228C

 

Так же не правильно:

1. edi==03B6228C  - регистры должны быть с большой буквы

2. Не должность быть русских символов например русская буква С и английская С

3. и вроде, не дложно быть пустых пробелов

 

Также, советую помнить финт когда условный бряк очень сильно тормозит игру (такое бывало и часто). В этом случае поможет АА-инъекция. Позволяет сделать условие любой сложности и можно сравнить тот же EDI как 

 

cmp edi,03B6228Cje original codenop  // сюда ставишь бряк на выполнение по F5 в дизассемблере CEnoporiginal code:

Спасибо MasterGH, а то вроде бы появилась идея по поиску ID для той игры, а из-за того, что не смог исследовать инструкцию (поставить условный бряк) не могу продвинуть дальше и проверить идею. Ещё раз СПАСИБО. 

Xipho. теперь посмотрел и Ваше видео (ссылку дал MasterGH в #9 посте) , тоже очень не плохое видео - понятное для взломщика любого уровня (даже нулевого, а это главное).

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

Непонятный один момент - зачем нужно было использовать Стек, если в регионе памяти (сверху), СЕ сразу написал - Base=2FE8A000, т.е. начало структуры было видно сразу. 

 

Ссылка на комментарий
Поделиться на другие сайты

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

 

ЗЫ. У меня микрофон полупрофессиональный домашний студийный - Samson Meteor USB ) Правда, если я правильно помню, указанные видео я еще писал на другой )

Ссылка на комментарий
Поделиться на другие сайты

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

Ок! Понял. Записал в своей памяти. :-D

Ссылка на комментарий
Поделиться на другие сайты

Немного пояснений по Структурному пауку, которые мне удалось найти. 
 

Структурный паук


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

The structure spider is a pointerscanner that works the opposite way. Instead of taking an end address you give it the base address and then it goes through every possible path
You can use it to compare structures


Structure spider can be used when you already have pointer which already has "high level", for example, pointing to player structure. (like pointer lvl 10). Pointerscanning took you many hours, but, finally you found it.

And you want pointer to, for example, currently equipped weapon. So you pointerscan again with max level 10, 11, 12, ..., (which is very very long).

To make it faster. Use structure spider and already found pointer. You can use last, one before last, or one before one before last, node of that pointer as your new base. Then you set maxlevel 1, 2, 3 or 4.


Своими словами.

Основная задача структурного паука это поиск указателей от "базового адреса" к "конечному адресу" через уже известный "уровень глубины указателей". Этот поиск должен быть гораздо быстрее чем если делать это через стандартное окно поиска указателей.

Человек с ником "mgr.inz.Player" (довольно опытный по CE, судя по его постам) привел пример. Если узнали "глубину уровня1" от "базового адреса1" до некоторого "адреса2 здоровья". Затем чтобы не искать цепочку указателей на адрес3 патронов долгим поиском указателей, мы можем в структурном пауке указать "базовый адрес1" (пологая что он будет базовым и для патронов), вписать предположительную ту же "глубину уровня1". Перейти в игру, менять оружие, грузить новые уровни игры и отсеивать, отсеивать пока не найдем указатель. Возможно даже можно и перезапустить игру, чтобы отсеять значения...
 
 



 

Ultimap

 

Ultimap тоже одна из новинок, которая еще не совсем понятна и на практике. Я думаю, автор темы тоже захочет узнать как этим пользоваться. Предположительно  Ultimap позволит через отсев найти функции, которые вызываются игрой. Затем изучив этот вызов call, передаваемые аргументы можно повторить этот вызов новым потоком игры из скриптов CE АА или CE Lua. Например, подобрать какую-то вещь, когда она не существует. Купить вещь, когда даже у магазина покупки вещей не стоим. Т.е. можно собрать инвентарь нужных вещей, которые нужно искать по карте.
 
По руководству из видео я нашел только одно на инглише. Здесь попытка повторить вызов диалога About из скриптов


 
Немного пояснений на английском по функциям Ultimap:

Filter out routine that where not called.: Remove all branches that are not done by a call (e.g jump or conditional jump or ret)

Filter out return from the RET's : Remove branches that where caused by function returns

Filter out routine not in specific module.: Remove branches where the destination is not in the specified module. (E.g. only game and not system code)

Ссылка на комментарий
Поделиться на другие сайты

Немного пояснений по Структурному пауку, которые мне удалось найти. 

 

Структурный паук

 

 

Ultimap

 

Ultimap тоже одна из новинок, которая еще не совсем понятна и на практике. Я думаю, автор темы тоже захочет узнать как этим пользоваться. Предположительно  Ultimap позволит через отсев найти функции, которые вызываются игрой. Затем изучив этот вызов call, передаваемые аргументы можно повторить этот вызов новым потоком игры из скриптов CE АА или CE Lua. Например, подобрать какую-то вещь, когда она не существует. Купить вещь, когда даже у магазина покупки вещей не стоим. Т.е. можно собрать инвентарь нужных вещей, которые нужно искать по карте.

 

По руководству из видео я нашел только одно на инглише. Здесь попытка повторить вызов диалога About из скриптов

 

Немного пояснений на английском по функциям Ultimap:

Спасибо MasterGH конечно меня заинтересуют и эти две функции, когда доберусь до них.

Значит, как я понял:

Грубо Структурный паук - это параллельный перенос цепочки указателей .

А Ultimap поможет в изучении  call.

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.