Точно контролировать выход GCC - PullRequest
1 голос
/ 13 мая 2011

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

Могу ли я извлечь этот исходный код на ассемблере, отредактировать его программно и передать эту модифицированную версию финальному ассемблеру для генерации моего пользовательского объектного файла? Я нацеливаюсь на платформу Windows.

Поддерживает ли MSVC ++ аналогичную функцию?

И если вам интересно, почему, одна из причин заключается в том, чтобы предотвратить реверс-инжиниринг, включив нашу собственную логику генерации полиморфного кода. Другая причина заключается в создании скрытой идентификации в каждой копии, распространяемой среди клиентов, для предотвращения взлома нашей защиты и распространения его взломанной версии.

Ответы [ 3 ]

6 голосов
/ 13 мая 2011

Посмотрите на флаг -S:

g++ -S file.c -o output.s

Затем выполните точную настройку на output.s и скомпилируйте окончательный исполняемый файл с помощью:

g++ output.s -o application
2 голосов
/ 13 мая 2011

Да, gcc может выдавать промежуточный вывод на ассемблере на этапе компиляции через gcc -S.Вы можете генерировать различные выходные данные ассемблера с различными уровнями оптимизации -On, где n=0,1,2,3.Если вы сделаете это, вы заметите, что -O3, в частности, производит вещи, которые в вашей голове не отображаются непосредственно в код на C, потому что gcc оптимально реализовал код.

MSVC может делать то же самоечерез cl.exe /Fafilename.asm.Документация по msdn для этого: здесь .

Обратите внимание, что если вы хотите использовать синтаксис сравнимого ish, вы, вероятно, захотите gcc -masm=intel -S на конце gcc.Также обратите внимание, что будут некоторые различия между выводом макросов от Microsoft и выводом GNU AS.Я не знаком с MASM, но между всеми ассемблерами есть тонкие различия (а также очевидный синтаксис AT & T и Intel).

2 голосов
/ 13 мая 2011

Да. В Linux попробуйте это:

$ cat hello.cc
#include <iostream>

int main() {
  std::cout << "Hello, world\n";
}

$ g++ -S hello.cc && sed -i 's/Hello, world/Goodbye, world/' hello.s && g++ -o goodbye hello.s && ./goodbye
...