0 / 0 / 0
Регистрация: 03.04.2014
Сообщений: 13
|
||||||
1 | ||||||
Все виды(способы) объявления переменных, функций, классов, типов и т.п. на С++28.03.2015, 18:16. Показов 2939. Ответов 15
Метки нет (Все метки)
Пишу обфускатор кода, написанного на С++ и появилась необходимость знания всевозможных способов объявления чего-либо на С++. Так как планирую с входным файлом следующее:
1)Прочесать весь файл посимвольно 2)Выделять имена (переменных, функций, и т.п.) и заносить в список имен 3)Сгенерировать список рандомных строк. 4)Заменить во входном файле каждое слово из списка имен, на слова из списка рандомных строк. Так вот, самое сложное во втором пункте, т.е. в распознании факта объявления. Есть ли какая-то общая черта всех способов объявления? И по какому признаку можно понять, что в строке произошло объявление? Пока я для себя выделил такие вот случаи(примеры):
0
|
28.03.2015, 18:16 | |
Ответы с готовыми решениями:
15
Какие есть способы объявления аргументов функций? Как пропукать только объявления функций двух типов без аргументов из потока ввода? Проблема с получением типов переменных двух классов друг у друга Реализация отношения классов типа двунаправленная ассоциация, UML, порядок объявления классов, неполный класс |
Модератор
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
|
||||||
28.03.2015, 18:32 | 2 | |||||
1
|
236 / 196 / 21
Регистрация: 04.06.2014
Сообщений: 1,309
|
|
28.03.2015, 18:45 | 3 |
И зачем всё это глобально объявлять?
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||||||||||||||||
28.03.2015, 18:53 | 4 | |||||||||||||||||||||||||
слишком многое.
вообще попытка проконтролировать типо-образования - плохой путь. потому что их очень много. и есть множество рецептов таких образований. намного проще идентифицировать имена без учета типа-образования: на языке с++ любые символы в исходном коде, которые не являются ключевыми словами языка - это какие то объявления. а ключевых слов языка не так уж и много. например:
1. маскировать: 'MyStruct' и 'trololo' 2. выпиливать полностью весь комментарий комментариев бывает три вида:
потому что там можно по всякому изголяццо:
1
|
0 / 0 / 0
Регистрация: 03.04.2014
Сообщений: 13
|
|
28.03.2015, 19:19 [ТС] | 5 |
Суть не в глобальности, мне не важно, в каком контексте и блоке произошло объявление, мне необходимо понять, как выдрать имя объявляемого, из факта объявления, нужная какая-то общая маска. А выявить ее не так уж и легко как я понял и считать количество слов бессмысленно. Наверное придется затачивать свой "выдиратель имен" под вид "(модификаторы и т.д.) тип (разделитель пробел или табуляция) (*, &, ' ')имя1 ( = значение, имяN = значение"). Но при таком подходе программе нужно как-то понять, что очередное слово это тип данных (в том числе библиотечные типы, и пользовательские). Вопрос - как?
Добавлено через 16 минут В самом начале я тоже об этом думал, но тут возникла другая проблема. Как исключить из рассмотрения библиотечные функции, типы и т.д.? всякие cin, cout, string, Stack, system, strcpy, ifstream, pow... Лезть в хэдеры и проверять там? Там свои проблемы вылезут..
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
28.03.2015, 19:37 | 6 |
0
|
0 / 0 / 0
Регистрация: 03.04.2014
Сообщений: 13
|
|
28.03.2015, 19:55 [ТС] | 7 |
Даже если и заменять, то заменять полноценно рабочими аналогами с рандомным именем, но копировать каждую библиотечную функцию это бред.
0
|
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
|
|
28.03.2015, 20:06 | 8 |
конечно есть. и этих черт не мало этим
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
28.03.2015, 20:07 | 9 |
наверное, все таки он должен суметь заменить так, что бы все работало.
так то существует 100500 разных способов, как заморочить голову вашему обусфактору, в том плане, что ему будет очень сложно отличить: что здесь стандартное, а что пользовательское. вопрос: "а как в принципе определить, что тут стандартное, а что местное" - это отдельный инженерный ребус. --------------------------------------------------------------------------------- например... обусфактор может составить список всех имен, которые найдет в исходнике. а потом запутать их при помощи препроцессора. в самом исходнике мы увидим дибильные имена. если сильно присмотреться: в самом начале подключается волшебный инклюд, который содержит всю магию.
0
|
0 / 0 / 0
Регистрация: 03.04.2014
Сообщений: 13
|
|
28.03.2015, 20:26 [ТС] | 11 |
Но, теперь я уже не знаю, с какой стороны лучше подойти. Делать мб огромный файл с зарезервированными словами, которые нельзя заменять(или такой список уже есть где-то), или все же пытаться поймать все объявления и вырезать оттуда имена(что более логично, но очень тяжело). Куда копать?
0
|
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
|
|
28.03.2015, 20:39 | 12 |
даже не могу представить такой список для проектов использующих boost/MFC/VCL/прочее.
уж лучше и надежнее парсить объявления, которые подчинены строгому и главное конечному числу правил
0
|
0 / 0 / 0
Регистрация: 03.04.2014
Сообщений: 13
|
|
28.03.2015, 21:01 [ТС] | 13 |
всем спасибо за мнения и советы. Буду думать над парсингом. Возможно тут меня спасут регулярные выражения, но пока я не знаю, есть ли такие библиотеки/или что то, для работы с такими выражениями на с++.
Не по теме: Может в конце вовсе обращусь к баш скриптам с его утилитами.
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||
28.03.2015, 21:25 | 14 | |||||
верная мысль.
но препроцессором путать следы все равно нужно. что бы стандартные имена не выпячивались. просто это нужно использовать в комплексе с подменой имен пользовательских. Вариант №1 сначала вам нужно произвести подмену имен путем анализа типо-образования. причем, не обязательно пытаться сразу охватить все возможные случаи. достаточно замаскировать наиболее распространенные варианты. далее, полученный файл проходит обработку "маскировка препроцессором". в результате получаем непонятную кашу. даже если и глянуть выхлоп препроцессора, то мы увидим: где то появятся имена наподобие cout, но основная масса кода все равно будет оставаться нечитабельной. а дальше уже нужно смотреть по обстоятельствам: если хочется замаскировать ещё больше - просто анализируем больше всяких типа-образований. ----------------------------- Вариант №2 при запуске обусфактора, ему указывается каталог, где находится исходный код проекта. обусфактор рекурсивно обходит весь каталог, и собирает список путей всех исходных файлов проекта. далее, рассмотрим код:
что iostream - это стандартный заголовочный файл. он может рекурсивно пройтись по нему, собирая все имена. и тогда он сможет абсолютно точно вам сказать: cout - стандартное имя (было обнаружено внутри стандартных заголовков) все остальное - местное. что бы ускорить работу обусфактора, можно кэшировать информацию о стандартных именах. и тогда повстречав cout в следующий раз (возможно в другом исходнике), ему уже не нужно будет лазить по стандартным заголовкам.
0
|
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
|
|
28.03.2015, 21:26 | 15 |
Этого мало, так как можно написать имя и как string, и как std::string. И вообще говоря, в зависимости от контекста это могут быть разные вещи (в std один стринг, а у меня другой). Тут надо делать полноценный парсер C++.
0
|
0 / 0 / 0
Регистрация: 03.04.2014
Сообщений: 13
|
|
28.03.2015, 21:51 [ТС] | 16 |
Данный вариант мне больше приглянулся, буду делать его (ибо мне пока что только в учебных и самообразовательных целях), но правильнее вариант 2, так что, возможно, реализация будет чем-то средним между этими вариантами. Осталось подумать(придумать) как именно парсить и какие варианты объявлений распространены больше всего. Ну это я уж сам, наверное тему можно закрыть. Спасибо за то, что нашли время.
0
|
28.03.2015, 21:51 | |
28.03.2015, 21:51 | |
Помогаю со студенческими работами здесь
16
Способы объявления шаблона "Автозаполнение" имен типов/функций/переменных В предложенной программе подчеркните все операторы присваивания и восстановите описания типов переменных Объявления классов Виды классов в css Объявления переменных Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |