каждая c программа преобразовывается в машинный код, если этот двоичный файл распределяется. Так как система команд компьютера известна, действительно ли возможно возвратить исходную программу C?
Вы никогда не сможете вернуться к тому же самому источнику, поскольку нет метаданных о том, что сохранено с помощью скомпилированного кода.
Но вы можете воссоздать код из ассемблерного кода.
Если вас интересуют следующие вещи, посмотрите эту книгу: Реверсирование: секреты обратного инжиниринга .
Править
Некоторые компиляторы-101 здесь, если бы вы определяли компилятор с другим словом, а не таким техническим, как «компилятор», что бы это было?
Ответ: Переводчик
A компилятор переводит синтаксис / фразы, которые вы написали, на другой язык, а компилятор C переводит в ассемблер или даже в машинный код. Код C # переведен на IL и так далее.
Исполняемый файл, который у вас есть, является просто переводом вашего исходного текста / синтаксиса, и если вы хотите «перевернуть его», следовательно, «перевести обратно», вы, скорее всего, не получите ту же структуру, что и в начале.
Более реальный пример: если вы переведете с английского на немецкий и с немецкого обратно на английский, структура отправки, скорее всего, будет другой, могут использоваться другие слова, но значение, контекст, скорее всего, не будут изменились.
То же самое касается компилятора / транслятора, если вы переходите от C к ASM, логика такая же, просто другой способ его чтения (и, конечно, его оптимизация).
Я бы предположил, что коэффициент конверсии действительно опытного хакера составляет около 1 килобайта машинного кода в день. При обычных западных зарплатах это означает, что цена исполняемого файла размером 100 КБ составляет около 25000 долларов. После того, как вы потратили столько денег, все, что вы получили, - это кусок кода C, который делает именно то, что делает ваш, без комментариев и прочего. Это никоим образом не конкурирует с вашей версией, вы сможете доставлять обновления и улучшения намного быстрее. Обратный инжиниринг этих обновлений - тоже нетривиальная задача.
Если эта цена вас не впечатляет, вы можете произвольно увеличить стоимость конверсии, добавив дополнительный код. Просто имейте в виду, что опытным хакерам, которые могут взяться за такие большие программы, есть чем заняться. Они пишут свой собственный код.
Это зависит от того, что вы подразумеваете под исходной программой C. Такие вещи, как имена локальных переменных, комментарии и т. Д., Не включены в двоичный файл, поэтому нет возможности получить тот же исходный код, который использовался для создания двоичного файла. Такие инструменты, как IDA Pro , могут помочь вам дизассемблировать двоичный файл.
Если вы знаете или легко можете узнать общую длину сообщения, я бы предложил передать его заранее. Если определить его невозможно или очень дорого, можно использовать что-то похожее на кодировку передачи с фрагментами в 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) может сделать именно это. Это все еще довольно недавно и скоро, но показывает большие перспективы. Требуется немного привыкнуть, но потенциально может ускорить процесс реверсирования. Это не «серебряная пуля» - не декомпилер, но это отличный актив.
Распространенное название этой процедуры - «превращение гамбургера обратно в коров». Можно реконструировать двоичный код в функционально эквивалентную программу на C, но вопрос о том, имеет ли этот код на C близкое сходство с оригиналом, остается открытым.
Вместо установки большого фрейма необходимо задать размер содержимого 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. Вы просто не можете знать, насколько он будет похож по структуре на исходный код - кроме утерянных имен переменных/функций, я предполагаю, что он не будет знать исходный способ разделения кода между многими файлами.
Работа над инструментами, которые делают это, является исследовательской. То есть в простых случаях можно что-то получить (например, имена локальных переменных не восстановишь, если не будут отладочные символы). На практике это практически невозможно для больших программ или если программист решил усложнить задачу.
Одна из лучших работ на эту тему, о которой я знаю, это:
Свиньи из сосисок? Реинжиниринг с ассемблера на Си с помощью FermaT.
Утверждение состоит в том, что вы получаете разумную программу на Си, даже если исходный код на ассемблере был написан не на Си! Применяется множество оговорок.
Вы можете попробовать hex-rays.com, у него действительно хороший декомпилятор, который может декомпилировать ассемблерный код в C с точностью 99%.