Загрузка...

[Гайд] Ревёрсинг для чайников #1[By Grizzly]

Тема в разделе Уроки реверсинга создана пользователем Grizz1y 12 май 2021. 9757 просмотров

Загрузка...
  1. Grizz1y
    Grizz1y Автор темы 12 май 2021 В дом надо пускать только того, с кем ты его строишь 3939 9 окт 2020
    Всем привет!
    Хочу запустить небольшой курс, как можно ревёрсить программы, в конце курса дойдём до самых сложных примеров, которые накрыты VMP и множеством других протекторов.
    Весь курс предназначен на нативные приложения, курс будет для "чайников" в плане ревёрс-инженерии, без знаний C/C++ будет очень тяжело для понимания
    Ну что же, начнём!
    Все программы взяты с crackmes.one (Не реклама)

    План в основном такой:
    Для таких целей я использую ExeInfoPE
    [IMG]
    Отсюда мы можем узнать:
    EP(точку входа - адрес, откуда начинаются выполняться инструкции исполняемого файла)
    Разрядность программы
    Общие сведения(Язык, пакеры, протекторы и прочее...)
    Загружаю программу в IDA Pro
    В основном для более точного анализа всегда оставляем такие настройки, позже расскажу что за что влияет
    [IMG]
    Жмём ОК, далее везде жмём ок, кроме диалогового окна - загрузить отладочный .pdb файл? Тут жмём нет, ведь у нас нет этого файла, сгенерированного компилятором среды

    IDA показывает нам входной адрес исполняемых инструкций
    [IMG]
    Программа обычный, простенький CrackME, просит пароль, в случае правильного пароля пишет "Congrats! The correct key was ключ", в обратном же пишет "Wrong key!"[IMG]
    В графе видим разветвление на 2 исхода[IMG]


    Получается, что программа сверяет введённый ключ с уже имеющимся и на основе ответа инструкции jnz выполняет нужную часть

    Что такое вообще за команда jnz?
    JNZ - это команда, которая сверяет 2 значения и проверяет не равно ли одно из них нулю
    В коде бы это выглядело что то типо такого:
    Код
    if (var == var1 && var != NULL){
    }
    else{
    {
    Получается, что у нас несколько вариантов исхода:
    1.Узнать пароль
    2.Изменить проверку в обратную сторону(если пароль не равен правильному)
    3.Сразу выполнять код с положительным исходом

    Разберём 1 вариант:
    [IMG]
    Мы видим инструкцию CMP
    CMP - это команда сверки 2 числовых значений, которая выносит в стек флаг ответа(что то типо bool, но не он, но так понятнее)
    В коде что то типо такого:
    Код
    bool aIF = var == var1;
    В данном варианте у нас выглядит так:
    cmp [ebp+var_8], 11CA423Eh

    [ebp+var_8]:
    ebp - это регистр, где хранится адрес текущего кадра(сегмента так сказать)
    var_8 - это локальный адрес того, что мы ввели в консоль(наш ключ)
    При сложении получается адрес нашего текста, иначе адрес точки входа + адрес в памяти нашего ключа

    11CA423Eh - это пароль в бинарном виде

    Выделив 11CA423Eh и нажав h на клавиатуре, мы переведём в числовой формат, это и есть наш пароль - 298467902[IMG]

    Проверяем:
    [IMG]



    Разберём 2 вариант:
    Нам надо изменить логику так, чтобы при неправильном пароле нас пускало в положительный исход, в обратном случае - выводило, что неправильный пароль
    За ветвление отвечает инструкция jnz
    если наш оператор CMP сохранил положительный флаг, то jnz переместит на "правильный" путь
    [IMG]

    Обратная инструкция команде jnz - jz
    Патчим jnz на jz и смотрим результат
    [IMG]

    Всем удачи в начинаниях! Всем пока!​
     
  2. скамзло
    скамзло 12 май 2021 doom rushaz :smile: 4333 11 июл 2019
    Что-то на умном :2011_like:
     
    1. KOOPIKO1
      Grizz1y, ну я прям чайник всем чайникам
      так что мне не понятно))
  3. CoderVir
    О бля. Ида топ. Больше гайдов по реверсу натива,
     
  4. CPMan
    CPMan 12 май 2021 Заблокирован(а) 85 30 мар 2021
    Интересно, класс, жду ещё
     
  5. gpt
    Что-то на умном
     
  6. PraGuy
    PraGuy 12 май 2021 Заблокирован(а) 0 15 дек 2020
    Читать не буду, но понимаю, что для кого-то полезно, за труд не жаль и поддержать:roflanBuldiga:
    Мама, я в истории
     
  7. kp9kep_BaHtAnEp
    Годно :finger_up:
     
  8. renameduser_3434798
    Ещё бы понять, что такое реверсинг...
     
  9. Icy
    Интересно и годно
     
  10. neurogen
    neurogen 12 май 2021 603 12 апр 2020
    а что такое реверсинг
     
  11. Dark_Bull
    Dark_Bull 12 май 2021 4 8 май 2018
    JNZ - это инструкция, которая смотрит, устанавливается ли 6 бит(ZF) в регистре флагов(FLAGS) после выполнения инструкции CMP R, R/I, которая просто вычитает значение операнда1 из операнда2 без изменениях самих значений операндов, чтобы посмотреть, равны они или нет. Также не понял про "выносит в стек флаг ответа". Да, есть такое, загружает на стек значение, но это делает инструкция PUSH (или MOV в редких случаях).
     
  12. AleksGaMen
    AleksGaMen 12 май 2021 Коплю на новый статус 56 6 июн 2017
    Нихуя не понятно, но очень интерестно :spain_wait:
     
  13. Frostmourne
    Frostmourne 12 май 2021 Ледяная Скорбь, повинуйся мне 1626 20 окт 2019
    Спс брат
     
  14. fakelinkoln
    fakelinkoln 12 май 2021 Продажа SQLI сайтов 131 11 мар 2017
    Grizz1y, Можешь добавить в статью как второй способ на примере реализовать
     
  15. n0kkster
    n0kkster 13 май 2021 Заблокирован(а) 137 11 авг 2020
    классно написано, спасибо
     
  16. deleted0000
    deleted0000 10 июн 2022 782 30 дек 2019
    Годно:finger_up:
     
    10 июн 2022 Изменено
  17. Nightly
    Nightly 18 июн 2022 Life is game We are NPCs 283 14 фев 2019
  18. DeadInsidePC
    ку, у кого есть CrackME ??
     
  19. Whales_Nik
    Whales_Nik 30 июн 2022 50 27 мар 2022
    Шестнадцетиричный же вид, не?
     
  20. AmokDev_inactive4925494
    Полезно :smilerose:
     
Top