Распаковка и дизассемблеровка mach-o бинарника (OSX x64) Привет античат, я пытаюсь вскрыть OSX mach-o бинарник. К сожелению дизассемблировка дает меня bullshit, видимо бинарник закриптован, или использует packer (или на самом плохом варинате обфускацию). Меня нужно получить/определить алгоритм шифровки, и декриптовать бинарник. Load Commands Используя Code: otool -l myTarget сделал дамп команд загрузки бинарника (некаких флагов на факт крипта.... но всетаки она закриптована) https://www.dropbox.com/s/yg78mesn3w9mm7n/load_commands.txt Disassembling Используя Code: otool -tvV myTarget сделал дамп всего __text __TEXT сегмента https://www.dropbox.com/s/ag6xq1n2k9nm4eq/text_segment.txt Как видите никакой полезной информации, одна каша. LLVM дизассемблер сразу отказывается Code: (__TEXT,__text) section Segmentation fault: 11 Инъекция с помощью cycript Я попробовал `cycript` для дампа `основного образа бинарника` из Виртаульной Памяти, а потом патчил дамп обратно в бинарник с помощью `dd` инструмента, но кажется этот трюк не прошел, и бинарник был поврежден. Debuggers `gdb`/`lldb` отказываются запустить/присоединиться к процессу, т.к. бинарник использует `pt_deny_atach`/`sysctl`/`kauth` техники анти-дебаггинга. Я попробовал патчить свой OSX kernel для игнорирование `pt_deny_atach`/`sysctl`/`kauth` (т.к. assembly к бинарнику не доступно и я не смогу снять `nop`-ом эти вызовы) Но после этого процесс даже не запускается, просто зависает (В то время как `Github` и `iTunes` запускаются без каких то проблем, и клюют на патч). Декриптованный кусок кода Это единственное что меня удалось найти, В бинарнике используется довольно популярная библиотека AquaticPrime. Я интегрировал библиотеку на моем тестовом пройекте и компилировал его, потом сравнил мой мод, с кодом которое находится в бинарнике. Мой код (decrypted) https://www.dropbox.com/s/mw2e8cvzt0u5vwy/decytpted.png Код в бинарнике (encrypted) https://www.dropbox.com/s/o70qq90trz5h914/encrypted.png Можете посоветовать некоторые дополнительные техники (или предложение, что я могу попробовать), чтобы получить чистый ассемблай?
Прошу привести в норму правописание... будем уважать зрение остальных Вот по этому: Упаковщик ("packer") и обфускатор - разные понятия. Обфускация используется для скриптов, а упаковщики применяются для исполняемых файлов. Добавьте еще в свой пост, что это под MacOS x64. P.s. К сожалению, сам ни чем не смогу помочь, под Mac не работал. Но могу добавить, что на работу криптора не похоже, имена секций с данными обычно тоже шифруются (но не всегда).
KIR@PRO спасибо за замечания, я иностранец по русски ели ели учусь, если возможно крупные ошибки исправляйте пожалуйста (fix the hard mistakes by editing the article please). Обфускация используется не только для скриптов, она может использоваться для изменения имен методов, еще можно инструкции заменить на альтернативные и добавить много мусра, или я ошибаюсь ?. То есть как я понял в Windows, exe в упаковку падает с ресурсами? если на пример возмем mpress (http://www.matcode.com/mpress.htm), то он упковывает сам архив программы (в маке .app, в винде .exe) или только бинарник?
вообще, обфускацией, как таковой, является запутывание алгоритма работы скрипта/программы без потери функциональности, с целью усложнения понимания логики её работы. Применить обфускацию к исполняемому файлу(программе) конечно можно и это корректно, но в случае программы это распространено только по отношению к исходному коду, потому в подавляющем большинстве случаев, под обфускацией подразумевают изменение скрипта, но так же можно изменить исходный код программы. Потому признаю, погорячился по поводу обфускации Не совсем понял, что имелось ввиду под "архивом программы"... Прогой не пользовался, но судя по страничке, это простой упаковщик исполняемых файлов, для уменьшения его размера (как zip, rar, gzip, etc...) добавляя соответственно распаковщик в начало старта программы. Упаковывает именно бинарник, точнее ту его часть которую возможно упаковать (секцию кода, данных, возможно некоторые заголовки секций). В большинстве случаев да, ибо благоразумно Но я говорил про крипторы, когда упоминал изменение названий секций. Чтоб проверить применен ли упаковщик (packer) можно сверить размер памяти приложение после старта (вычитая размер секций bss) и размер исполняемого файла на диске. p.s. грамматику и правописание буду поправлять p.p.s. у меня с English не так хорошо, как у тебя с Русским
сделал `vmmap pid` после запуска программы. кусок отчета которое нам интересно Code: ==== Writable regions for process 1175 __TEXT 000000010e34c000-000000010e67b000 [ 3260K] rwx/rwx SM=COW .../reverse/Hopper Disassembler v3.app/Contents/MacOS/Hopper Disassembler v3 __DATA 000000010e67b000-000000010e7d0000 [ 1364K] rw-/rwx SM=COW .../reverse/Hopper Disassembler v3.app/Contents/MacOS/Hopper Disassembler v3 __DATA 000000010e7d0000-000000010e7db000 [ 44K] rw-/rwx SM=PRV .../reverse/Hopper Disassembler v3.app/Contents/MacOS/Hopper Disassembler v3 размер __TEXT сегмента точно совпадает с незапушенным вариантом (0x000000010e67b000-0x000000010e34c000 == 0x32F000) когда я впервые хотел открыть этот бинарник, все инструменты отказывались открыть его (даже IDA), они провалились с сообшением что бинарник поврежден. После мучение я понял что у LOAD_COMMANDS неправильные оффсеты, по ходу ОС мог понять и исправить это, а дизассемблеры нет. Вот я поправил оффсеты и дизассемблеры стали работать (но показывают замешенную программу). Кстати lldb отказывается читать бинарник, у него что то нетак с этим бинарником, я попробую из VM дампить опять и посмотреть на это. Меня пугает тот факт что дизассемблеры показывают "bad opcode". я измерил размеры методов у него и оригиналы (в библиотеке AquaticPrime), у него они довольно большие один метод на два раза а второй на 1.57. Странно что у него __TEXT сегмент read/write помечен, зачем ему write. p.s. говорят если хочеш реверсить учи русский или китайский, а то американцы и европейци ненавидят реверс и ненавидят тех кто хочет реверсить, и на эту тему нечего не знают у них с законом трудно, страшно боятся.
Это явный признак, что код самомодифицирующийся. Без отладчика никак. Или дампить уже с проинициализированными глобальными перменными и потом их чистить. woodmann.com неплохой ресурс на EN, по крайней мере таким был когда-то. С маком везде напряжёнка- не популярный он.
В точку! _Logger_ попробуй снять дамп когда прога запустится и отработает все первоначальные действия. Если она с интерфейсом, то пока не запустится интерфейс. Тебе тут только с отладчиками работать, о дизассемблерах забудь =( Среди реверсеров не популярный =(