Загрузка...

[Guide] Reverse for Dummies #1[By Grizzly]

Thread in Reversing Lessons created by Grizz1y May 12, 2021. 9982 views

  1. Grizz1y
    Grizz1y Topic starter May 12, 2021 В дом надо пускать только того, с кем ты его строишь 4250 Oct 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 значения и проверяет не равно ли одно из них нулю
    В коде бы это выглядело что то типо такого:
    Code
    if (var == var1 && var != NULL){
    }
    else{
    {
    Получается, что у нас несколько вариантов исхода:
    1.Узнать пароль
    2.Изменить проверку в обратную сторону(если пароль не равен правильному)
    3.Сразу выполнять код с положительным исходом

    Разберём 1 вариант:
    [IMG]
    Мы видим инструкцию CMP
    CMP - это команда сверки 2 числовых значений, которая выносит в стек флаг ответа(что то типо bool, но не он, но так понятнее)
    В коде что то типо такого:
    Code
    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. скамзло
    скамзло May 12, 2021 doom rushaz :smile: 4330 Jul 11, 2019
    Что-то на умном :2011_like:
     
    1. скамзло
      Grizz1y, Все супер понятно, спасибо.
    2. KOOPIKO1
      Grizz1y, ну я прям чайник всем чайникам
      так что мне не понятно))
  3. CoderVir
    О бля. Ида топ. Больше гайдов по реверсу натива,
     
  4. CPMan
    CPMan May 12, 2021 Banned 85 Mar 30, 2021
    Интересно, класс, жду ещё
     
  5. gpt
    Что-то на умном
     
  6. PraGuy
    PraGuy May 12, 2021 Banned 0 Dec 15, 2020
    Читать не буду, но понимаю, что для кого-то полезно, за труд не жаль и поддержать:roflanBuldiga:
    Мама, я в истории
     
  7. kp9kep_BaHtAnEp
    Годно :finger_up:
     
  8. renameduser_3434798
    Ещё бы понять, что такое реверсинг...
     
  9. Icy
    Интересно и годно
     
  10. neurogen
    neurogen May 12, 2021 603 Apr 12, 2020
    а что такое реверсинг
     
  11. Dark_Bull
    JNZ - это инструкция, которая смотрит, устанавливается ли 6 бит(ZF) в регистре флагов(FLAGS) после выполнения инструкции CMP R, R/I, которая просто вычитает значение операнда1 из операнда2 без изменениях самих значений операндов, чтобы посмотреть, равны они или нет. Также не понял про "выносит в стек флаг ответа". Да, есть такое, загружает на стек значение, но это делает инструкция PUSH (или MOV в редких случаях).
     
  12. AleksGaMen
    AleksGaMen May 12, 2021 Коплю на новый статус 58 Jun 6, 2017
    Нихуя не понятно, но очень интерестно :spain_wait:
     
  13. Frostmourne
    Frostmourne May 12, 2021 Ледяная Скорбь, повинуйся мне 1625 Oct 20, 2019
    Спс брат
     
  14. fakelinkoln
    fakelinkoln May 12, 2021 Продажа SQLI сайтов 131 Mar 11, 2017
    Grizz1y, Можешь добавить в статью как второй способ на примере реализовать
     
  15. n0kkster
    n0kkster May 13, 2021 Banned 137 Aug 11, 2020
    классно написано, спасибо
     
  16. deleted0000
    deleted0000 Jun 10, 2022 782 Dec 30, 2019
    Годно:finger_up:
     
  17. Nightly
    Nightly Jun 18, 2022 Life is game We are NPCs 280 Feb 14, 2019
  18. DeadInsidePC
    ку, у кого есть CrackME ??
     
  19. Whales_Nik
    Whales_Nik Jun 30, 2022 50 Mar 27, 2022
    Шестнадцетиричный же вид, не?
     
  20. AmokDev_inactive4925494
    Полезно :smilerose:
     
Loading...
Top