Загрузка...

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

Thread in Reversing Lessons created by Grizz1y May 12, 2021. 10,961 view

  1. Grizz1y
    Grizz1y Topic starter May 12, 2021 В дом надо пускать только того, с кем ты его строишь 4,273 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 тут могла быть ваша реклама 4,456 Jul 11, 2019
    Что-то на умном :2011_like:
     
    1. скамзло
      avatarGrizz1y, Все супер понятно, спасибо.
    2. KOOPIKO1
      avatarGrizz1y, ну я прям чайник всем чайникам
      так что мне не понятно))
  3. CoderVir
    О бля. Ида топ. Больше гайдов по реверсу натива,
     
  4. CPMan
    Интересно, класс, жду ещё
     
  5. temp
    Что-то на умном
     
  6. PraGuy
    Читать не буду, но понимаю, что для кого-то полезно, за труд не жаль и поддержать:roflanBuldiga:
    Мама, я в истории
     
  7. kp9kep_BaHtAnEp
    Годно :finger_up:
     
  8. renameduser_3434798
    Ещё бы понять, что такое реверсинг...
     
  9. Icy
    Интересно и годно
     
  10. neurogen
    neurogen May 12, 2021 600 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 повышение статуса 1,617 Oct 20, 2019
    Спс брат
     
  14. fakelinkoln
    fakelinkoln May 12, 2021 Продажа SQLI сайтов 130 Mar 11, 2017
    avatarGrizz1y, Можешь добавить в статью как второй способ на примере реализовать
     
  15. n0kkster
    классно написано, спасибо
     
  16. deleted0000
    deleted0000 Jun 10, 2022 778 Dec 30, 2019
    Годно:finger_up:
     
  17. Nightly
    Nightly Jun 18, 2022 Life is game We are NPCs 283 Feb 14, 2019
  18. DeadInsidePC
    ку, у кого есть CrackME ??
     
  19. Whales_Nik
    Шестнадцетиричный же вид, не?
     
  20. AmokDev_inactive4925494
    Полезно :smilerose:
     
Loading...