инженерный анализ c программы

каждая c программа преобразовывается в машинный код, если этот двоичный файл распределяется. Так как система команд компьютера известна, действительно ли возможно возвратить исходную программу C?

14
задан Ira Baxter 18 February 2010 в 16:10
поделиться

9 ответов

Вы никогда не сможете вернуться к тому же самому источнику, поскольку нет метаданных о том, что сохранено с помощью скомпилированного кода.

Но вы можете воссоздать код из ассемблерного кода.

Если вас интересуют следующие вещи, посмотрите эту книгу: Реверсирование: секреты обратного инжиниринга .

Править

Некоторые компиляторы-101 здесь, если бы вы определяли компилятор с другим словом, а не таким техническим, как «компилятор», что бы это было?

Ответ: Переводчик

A компилятор переводит синтаксис / фразы, которые вы написали, на другой язык, а компилятор C переводит в ассемблер или даже в машинный код. Код C # переведен на IL и так далее.

Исполняемый файл, который у вас есть, является просто переводом вашего исходного текста / синтаксиса, и если вы хотите «перевернуть его», следовательно, «перевести обратно», вы, скорее всего, не получите ту же структуру, что и в начале.

Более реальный пример: если вы переведете с английского на немецкий и с немецкого обратно на английский, структура отправки, скорее всего, будет другой, могут использоваться другие слова, но значение, контекст, скорее всего, не будут изменились.

То же самое касается компилятора / транслятора, если вы переходите от C к ASM, логика такая же, просто другой способ его чтения (и, конечно, его оптимизация).

17
ответ дан 1 December 2019 в 06:43
поделиться

Я бы предположил, что коэффициент конверсии действительно опытного хакера составляет около 1 килобайта машинного кода в день. При обычных западных зарплатах это означает, что цена исполняемого файла размером 100 КБ составляет около 25000 долларов. После того, как вы потратили столько денег, все, что вы получили, - это кусок кода C, который делает именно то, что делает ваш, без комментариев и прочего. Это никоим образом не конкурирует с вашей версией, вы сможете доставлять обновления и улучшения намного быстрее. Обратный инжиниринг этих обновлений - тоже нетривиальная задача.

Если эта цена вас не впечатляет, вы можете произвольно увеличить стоимость конверсии, добавив дополнительный код. Просто имейте в виду, что опытным хакерам, которые могут взяться за такие большие программы, есть чем заняться. Они пишут свой собственный код.

4
ответ дан 1 December 2019 в 06:43
поделиться

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

5
ответ дан 1 December 2019 в 06:43
поделиться

Если вы знаете или легко можете узнать общую длину сообщения, я бы предложил передать его заранее. Если определить его невозможно или очень дорого, можно использовать что-то похожее на кодировку передачи с фрагментами в HTTP.

-121--3950501-

Вот некоторые вещи, извлеченные из моих цветовых утилит. Похоже, makeGradient может быть полезен для вас.

    /**
     * Return a gradient given a color.
     *
     * @param color      Base color of the gradient.
     * @param intensity  Amount to shift secondary color.
     * @return An array with a length of two colors.
     */
    public static function makeGradient(color:uint, intensity:int = 20):Array
    {
        var c:Object = hexToRGB(color);
        for (var key:String in c)
        {
            c[key] += intensity;
            c[key] = Math.min(c[key], 255); // -- make sure below 255
            c[key] = Math.max(c[key], 0);   // -- make sure above 0
        }
        return [color, RGBToHex(c)];
    }

    /**
     * Convert a uint (0x000000) to a color object.
     *
     * @param hex  Color.
     * @return Converted object {r:, g:, b:}
     */
    public static function hexToRGB(hex:uint):Object
    {
        var c:Object = {};

        c.a = hex >> 24 & 0xFF;
        c.r = hex >> 16 & 0xFF;
        c.g = hex >> 8 & 0xFF;
        c.b = hex & 0xFF;

        return c;
    }

    /**
     * Convert a color object to uint octal (0x000000).
     *
     * @param c  Color object {r:, g:, b:}.
     * @return Converted color uint (0x000000).
     */
    public static function RGBToHex(c:Object):uint
    {
        var ct:ColorTransform = new ColorTransform(0, 0, 0, 0, c.r, c.g, c.b, 100);
        return ct.color as uint
    }

Также, не могу вспомнить, откуда я получил это, но эти статические функции будут генерировать список гармонии с заданным цветом:

    /**
     * Convert RGB bits to a hexcode
     *
     * @param r  Red bits
     * @param g  Green bits
     * @param b  Blue bits
     * @return A color as a uint
     */
    public static function convertToHex(r:uint, g:uint, b:uint):uint
    {
        var colorHexString:uint = (r << 16) | (g << 8) | b;
        return colorHexString;
    }

    /**
     * Get a series of complements of a given color.
     *
     * @param color   Color to get harmonies for
     * @param weight  Threshold to apply to color harmonies, 0 - 255
     */
    public static function getHarmonies(color:uint, weight:Number):Array
    {
        var red:uint = color >> 16;
        var green:uint = (color ^ (red << 16)) >> 8;
        var blue:uint = (color ^ (red << 16)) ^ (green << 8);

        var colorHarmonyArray:Array = new Array();
        //weight = red+green+blue/3;

        colorHarmonyArray.push(convertToHex(red, green, weight));
        colorHarmonyArray.push(convertToHex(red, weight, blue));
        colorHarmonyArray.push(convertToHex(weight, green, blue));
        colorHarmonyArray.push(convertToHex(red, weight, weight));
        colorHarmonyArray.push(convertToHex(weight, green, weight));
        colorHarmonyArray.push(convertToHex(weight, weight, blue));

        return colorHarmonyArray;
    }
-121--4126546-

Hex-Rays декомпилер (расширение до IDA Pro) может сделать именно это. Это все еще довольно недавно и скоро, но показывает большие перспективы. Требуется немного привыкнуть, но потенциально может ускорить процесс реверсирования. Это не «серебряная пуля» - не декомпилер, но это отличный актив.

3
ответ дан 1 December 2019 в 06:43
поделиться

Распространенное название этой процедуры - «превращение гамбургера обратно в коров». Можно реконструировать двоичный код в функционально эквивалентную программу на C, но вопрос о том, имеет ли этот код на C близкое сходство с оригиналом, остается открытым.

3
ответ дан 1 December 2019 в 06:43
поделиться

Вместо установки большого фрейма необходимо задать размер содержимого UIScrollView:

UIScrollView *wrapper = [[UIScrollView  alloc] initWithFrame:
             CGRectMake(0, 0, appFrame.size.width, appFrame.size.height)];
wrapper.contentSize =CGSizeMake(appFrame.size.width, appFrame.size.height + 320);
-121--3995656-

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

Если вы изменяете значение ячейки в vba, вам вообще не нужно деактивировать проверки - так что я бы сделал это (извините, псевдокод, мой VBA немного ржавый)

OnPaste(cells, x, y)
  for each cell in cells do
    obtain the destinationCell (using the coordinates of cell on Cells, plus x and y)
    check if the value in cell is "valid" with destinationCell's validations
    if not valid, alert a message
    if valid, destinationCell.value = cell.value
  end
end
-121--4320896-

Нет 1:1 отображение между C-программой и создаваемым ею ASM/машинным кодом - одна C-программа может компилировать в другой результат на разных компиляторах или с разными настройками), и иногда два разных бита C могут создавать один и тот же машинный код.

Вы определенно можете генерировать код C из скомпилированного EXE. Вы просто не можете знать, насколько он будет похож по структуре на исходный код - кроме утерянных имен переменных/функций, я предполагаю, что он не будет знать исходный способ разделения кода между многими файлами.

2
ответ дан 1 December 2019 в 06:43
поделиться

Работа над инструментами, которые делают это, является исследовательской. То есть в простых случаях можно что-то получить (например, имена локальных переменных не восстановишь, если не будут отладочные символы). На практике это практически невозможно для больших программ или если программист решил усложнить задачу.

3
ответ дан 1 December 2019 в 06:43
поделиться

Одна из лучших работ на эту тему, о которой я знаю, это:

Свиньи из сосисок? Реинжиниринг с ассемблера на Си с помощью FermaT.

Утверждение состоит в том, что вы получаете разумную программу на Си, даже если исходный код на ассемблере был написан не на Си! Применяется множество оговорок.

4
ответ дан 1 December 2019 в 06:43
поделиться

Вы можете попробовать hex-rays.com, у него действительно хороший декомпилятор, который может декомпилировать ассемблерный код в C с точностью 99%.

2
ответ дан 1 December 2019 в 06:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: