Обратный Инженер Автоматически C? - PullRequest
7 голосов
/ 01 апреля 2011

Насколько просто перепроектировать автоматически сгенерированный C-код? Я работаю над проектом Python и как часть своей работы использую Cython для компиляции кода в целях ускорения.

Это действительно помогает с точки зрения скорости, но я обеспокоен тем, что там, где я работаю, некоторые люди пытаются «заглянуть» в код и выяснить, что он делает.

Код Cython - это, по сути, автоматически сгенерированный C. Очень сложно его перепроектировать?

Существуют ли какие-либо рекомендации, которые могли бы сделать код более безопасным и сделать реверс-инжиниринг более сложным? (Я полагаю, что при достаточном усилии все может быть изменено, спроектировано).

Ответы [ 3 ]

6 голосов
/ 01 апреля 2011

Хорошо - чтобы попытаться ответить на ваш вопрос более прямо: большинство автоматически сгенерированных C-кодов довольно безобразно, поэтому кто-то должен быть достаточно мотивирован, чтобы перепроектировать его.В то же время, я не верю, что никогда не смотрел на то, что генерирует Cython, поэтому я не уверен, как это выглядит.

Кроме того, много автоматически сгенерированного кода выполняется втакие вещи, как таблицы конечных автоматов, которые большинству программистов трудно найти даже в лучшем случае.Тенденция (во многих случаях) состоит в том, чтобы иметь общую структуру с таблицами данных, которые среда более или менее «интерпретирует» во время выполнения.Это не обязательно невозможно выполнить, но оно достаточно отличается от наиболее типичного кода, так что большинство людей от него откажутся довольно быстро (и если они сделают много, они, как правило, будут тратить много времени, глядя на среду вместоданные, что действительно имеет значение в таких случаях).

Я повторю, однако, что я почти уверен, что я не смотрел на то, что производит Cython, поэтому я не могу много сказать оэто с какой-то реальной уверенностью.

Существуют (или, по крайней мере, раньше) коммерческие обфускаторы, предназначенные для того, чтобы сделать исходный код на C трудным для понимания.Я подозреваю, что доступность Perl отняла у них большую долю рынка, но если вы посмотрите, вы все равно сможете найти и использовать ее.

Если этого не сделать, написать обфускатор не очень сложносамо по себе, но степень эффективности, вероятно, будет зависеть от количества усилий, которые вы готовы вложить в него.Простое систематическое переименование любых значимых имен переменных в такие вещи, как _ и __, может сделать совсем немного (например, profit = sales - costs; намного более значим, чем _ = _I_ - _i_;).Однако, в зависимости от рассматриваемого машинного кода, это может не достигнуть значительных результатов - запутывание общей структуры может не иметь большого значения в понимании того, что делает ваш код - и если они выяснят процедуру, которой вы следуете, они могутбыть в состоянии просто скопировать правильный код фреймворка и перенести части, специфичные для вашей программы, в неясный фреймворк.

2 голосов
/ 16 апреля 2011

Ах, я думаю, я упустил момент, когда вы говорили о скомпилированном модуле , тогда как я имел в виду только исходный код, который генерирует Cython. Я согласен с Джерри, что будет довольно сложно извлечь что-то полезное из скомпилированного модуля, если вы не включите поддержку gdb (по умолчанию) и удалите символы отладки. Это связано с тем, что компилятор C будет выполнять множество встроенных вспомогательных функций повсеместно и применять различные низкоуровневые оптимизации кода, что затруднит извлечение исходных шаблонов кода макроуровня. Однако вы увидите именованные вызовы C-API для CPython, а также увидите имена функций из своего собственного кода. Cython специально не предназначен для запутывания кода, скорее наоборот. Но удобочитаемая сборка никогда не была целью проектирования.

2 голосов
/ 16 апреля 2011

Вы действительно должны взглянуть на код, который производит Cython. Например, чтобы помочь с отладкой, он копирует полный исходный код Python в сгенерированный файл, помечая каждую строку исходного кода перед созданием для него кода C. Это позволяет легко найти интересующий вас раздел кода.

Очень хорошая особенность заключается в том, что вы можете скомпилировать свой код с опцией "-a" (annotate), и он будет выдавать HTML-файл рядом с файлом C, который содержит аннотированный код Python. Когда вы нажмете на строку, вы увидите код C для этой строки. В качестве бонуса он помечает строки, которые выполняют большую часть обработки Python, темно-желтым цветом, так что вы получаете простой индикатор, где можно искать потенциальные оптимизации.

В Cython теперь также есть специальная поддержка GDB, поэтому вы можете выполнять отладку на уровне исходного кода Cython и т. Д.

...