Комментарии 19
Keygen - это все-таки задачка не для самых маленьких. Отладка как один из способов реверса была бы более показательна. Показать, что в регистры попадает. Думаю, первое это должен быть патч (забить nop' пами, поменять jmp на свой адрес, поменять jne на je и др.)
Согласен. Хотелось взять реальную задачку с чужим кодом, при этом не нарушая никакие законы) Для этого как раз хорошо подходят таски с CTF, где сейчас с патчингом встречаешься не очень часто. Можно, конечно, сделать программу самому и разбирать ее, но на мой взгляд - скучновато. Спасибо за комментарий, выпустим еще что-то про патчинг обязательно.
Вышло очень хорошо
Вот если бы вы вагонами воровали, тогда ничего страшного. А так конечно, патчить файлы это страшное преступление.
Поддерживаю @Redvirg ,
И ещё хотелось бы увидеть примеры работы с OllyDbg.
@FunnyWhale , огромное спасибо за статью!
Ох, по жести начинать так. Тем более ida freeware... с гидры щас начинать(и продолжать) надо, т.к. там есть почти всё необходимое и при этом бесплатно. А переучиться на иду, если для работы(ибо дорогая, да и ТАКИМ варезом неудобно пользоваться, т.к. палки постоянно в колёса пихают) нужна будет - запросто.
По моему мнению, у гидры сильно больший потенциал чем у иды. Особенно в скриптинге, где есть доступ почти ко всему в гидре. Редактор структур удобнее, отмена случайных действий почти всегда есть, возможность создания структуры из выделенного куска памяти( когда объект в глобальной памяти объявлен) и одна из самых кайфовых вещей - проект, в котором можно создать архив типов и структур и шарить его между несколькими exe/dll. Ну и свой сервер с версиями, благодаря чему я больше не путаюсь в десятках версий файлов, как было в ida, где делаешь копию idb почти каждый раз перед работой, т.к. случайно не тот размер структуры "фигакнешь" и всё, конец тому что разметил и типы задал.
Конечно, Ghidra местами удобнее IDA, однако прямо сейчас динозавров со знанием IDA в разы больше. Думаю, в любом универе, где в каком-либо виде преподают реверс, дают его именно с использованием IDA, да и статей все еще больше именно с этим дизассемблером (особенно русскоязычных). Поэтому, личное мнение - сейчас начинать учиться надо именно с IDA (материала для изучения больше), а там уже если приглянется, можно (и иногда нужно) использовать гидру. Тут уже на вкус и цвет. Со временем может и перейдем все на что-то другое :)
Конечно, Java местами удобнее C, однако прямо сейчас динозавров со знанием C в разы больше. Думаю, в любом универе, где в каком-либо виде преподают программирование, дают его именно с использованием C, да и статей все еще больше именно с этим языком (особенно русскоязычных). Поэтому, личное мнение - сейчас начинать учиться надо именно с C (материала для изучения больше), а там уже если приглянется, можно (и иногда нужно) использовать Java. Тут уже на вкус и цвет. Со временем может и перейдем все на что-то другое :)
Неудачный пример, на мой вкус
И по Java, и по Си мануалов полно, легко найти сообщество или интересный канал, типа канала автора DevFM по питону
По какому-нибудь Go мануалов меньше, коммьюнити меньше, и в качестве первого языка его выбирать – ну, такое, может оказаться не лучшим решением. Потому что уткнешься в проблему и засядешь, так как помочь некому
При это начать с Си вполне себе годно. С точки зрения базовых концепций там есть всё нужное. Берешь классику типа Язык Си Кернигана и Ритчи. Там просто и понятно тебе объяснят переменные, типы данных, циклы, – почти всё, что нужно. Потом с Си на любой язык можно перейти и комфортно себя чувствовать
Кроме шуток, для изучения, C/C++ действительно хороши как первые языки, хоть и выглядят сложными. Их изучение даст многое: от понимания организации памяти, внутреннего устройства структур вроде деревьев, связных списков, хэш-мапов и т.д. до глубокого понимания классов. Если познал C/C++, со всем остальным дальше будет максимально просто, и скорее всего не будет каких-то фундаментальных непониманий. Если мне предложат на выбор два работника, один из которых знает только Java, а другой - C++, я выберу второго)
В IDA откат действия как бы не в 7.6 ещё появился (текущая - 8.2), причём, откатывает действия хоть плагинов, хоть скриптов.
Ну вот, а я не "дотерпел", в районе 7 уже пошёл в сторону IDA, т.к. силы кончились бодаться с многими "особенностями". При этом можно сказать что это скорее заслуга гидры, т.к. в иде пришлось всё это делать, чтоб быть в паритете с гидрой. И сильно подтягивать, как я вижу сейчас на их сайте, даже free версию, а иначе на иду забили бы совсем все.
Будем надеяться что ида не загнётся и будет стремиться добавить "новые фишки", которые потом также будут и в гидре реализовывать.
Кстати, что там с классами и vtable в гидре? Не сделали ещё все обвязки или до сих пор "по старинке" структурами и юнионами vtable фигачить приходится? Ну и как щас, можно пустую структуру, наконец, нужного размера и с удобным редактированием как в гидре, или всё и осталось так - либо в окне, где структуры все на одном экране и в "развернутом виде", но хотя бы можно точно по смещениям попасть или в другом окне, где С-подобный вид? Просто в гидре это очень сильно упрощено и удобно (задал размер и потом спокойно по нужным смещениям назначай типы данных + не даст случайно сломать уже готовые поля)
Надо сказать, появление конкурентов явно пошло Иде на пользу, зашевелились они активнее. Классовые типы и vtable вроде добавили несколько версий назад в рамках прикручивания Clang-парсера (С++-бинарники - не совсем моя область, не пробовал, что вышло), по скорости серьёзные оптимизации проводились (не страшно открыть какой-нибудь ELF на 64МБ и сразу броситься по нему бегать. У Гидры с этим, слышал, погрустнее?). Но да, всякого противного legacy пока по-прежнему хватает - костыльное деление на "классические" и С-подобные типы осталось, Python API и дальше абсолютно не в стиле Python, паранойя автора не прошла итд. Будем надеятся, новые хозяева (они в конце того года продались!) повернут эту избушку к клиенту передом.
Спасибо автору, было интересно!
Есть вопросы от человека которому это интересно, но экспертиза которого заканчивается краской кнопок в вебе
В каких профессиях это используется
Где можно подобное изучить
Сколько времени займет это изучить хотя бы на начальном уровне, если есть возможность тратить каждый день 2-3 часа.
Спасибо заранее.
P.S. писать комментарии с телефона на Хабре есть боль.
В первую очередь - вирусная аналитика и кибер криминалистика.
Иногда восстановление алгоритма работы "мертвых" программ, поддержка которых уже прекратилась.
Также существует отдельный пласт специалистов, которые создают копии софта и железа.
Кто-то дорабатывает готовые программы своими патчами для расширения функционала или для добычи полной версии.
Вариантов применения много.
По обучению:
Для начала почитать про ассемблеры: регистры, команды, адресацию, соглашения о вызовах. Остальное довольно быстро узнается на практике. Прогать на ассемблерах не обязательно, но будет хорошим бонусом к скиллам.
Далее советую писать собственные программы на C/C++ и смотреть на них в дизасемблере:
Для начала нужно потыкать в различную память. Посмотреть, как переменные размещаются на стеке и в куче. Тут же можно попробовать попатчить значения переменных в памяти во время отладки. Посмотреть, как выглядят строки и массивы.
Написать несколько программ с условным выполнением: if, switch. Попробовать запатчить код с условных переходов на безусловные (Тут почитать про опкоды команд), попробовать запатчить nop-ами, чтобы вообще убрать кусок кода. Попробовать модифицировать регистры флагов для изменения хода выполнения во время отладки
Затем попробуй написать программу со структурами и классами: поймешь, как оно все выглядит в памяти, и как работает thiscall.
Дальше нужно написать несколько программ с использованием WinAPI: работа с реестром, с файловой системой, библиотеками и т.д.
После этого научиться отлаживать dll.
В принципе, основные знания на этом наверное и заканчиваются, дальше все придет с опытом. На этом моменте можно уже уверенно смотреть какие-то crackme, чтобы набраться опыта. Сайтов с ними достаточно.
После этого будет полезно посмотреть на реверс .NET приложений. Тут сразу рекомендую взяться за dnSpy, там все супер просто, разобраться будет несложно.
Чтобы повеселиться и приблизиться к миру реверса, чуть ли не сразу же можно взять классический пример с патчингом WinRar (вроде как не очень законно), материалов достаточно. Можно поиграться с CheatEngine и minesweeper, статьи тоже можно найти.
Удачи в познании :)
В принципе, основные знания на этом наверное и заканчиваются
Наоборот только начинаются. Далее надо:
Разобраться, как работают упаковщики (начать с простейшего - UPX) и как это распаковывать. Как дампят код, как исправляют точку входа и таблицы импорта. Упакованные бинарники даже сейчас встречаются прискорбно часто.
Ознакомиться с основным набором антиотладочных приёмов и способов задетектить отладчик, и как этому противодействовать.
Обфускаторы. Не только .NET-программы, но и написанное на C++ может быть превращено в кашу. Особенно весело, когда эта каша ещё и самомодифицирующаяся. IDA просто покажет вам гору мусора, потому что оно собирается в рабочую прогу только в рантайме, и даже там код состоит главным образом из мусорных JMP. Рассматривать удобно на примере ExeCryptor - он самый простой из всех и защищённое старыми его версиями реверсится проще всего.
Что такое HASP-ключ, как это используется для защиты программы и соответственно как декриптовать. Заодно придётся ещё глубже ознакомиться со структурой exe-файла (в частности, как двигать секции, как добавлять новые со своим кодом), а также как происходит работа с внешними устройствами и взаимодействие с драйверами.
Что делать, если автор программы написал собственную виртуальную машину (или взял готовую), а сам код программы выполняется в ней и соответственно для IDA - просто набор байтов. Чтобы это пощупать, пишем программу, где ценный алгоритм написан на Lua и выполняется с помощью влинкованной в нашу программу LuaJit. Научиться опознавать, что у нас тут используется VM и определять, что именно за технология задействована.
@DevFM спасибо, шикарный разбор!
Реверс инжиниринг для самых маленьких на практике