Требуется скрыть строки в файле, для этого имеется простая функция шифрования, но чтобы это сделать требуется сначала зашифровать все имеющиеся строки, а потом в программе расшифровывать по мере необходимости. В итоге программинг становится дико неудобным и неразборчивым, может кто знает как заставить компилятор зашифровать строки перед сборкой автоматически наподобе #define, но для больших функций?
Для шифрования: Pre-build event + скрипт, обрабатывающий сорцы на предмет строк. Для удобства дешифрации: фантазия.
пишешь #define MY_T(s) MY_UNIQUE_STRING##s##MY_END_OF_UNIQUE_STRING В программе ссылаешься на такие строки только через данный макрос. После буилда запускаешь exe, которая отыскивает строки типа MY_UNIQUE_STRING и шифрует как надо. Кроме того, загрузчик рулит! (обратный процесс: мождно ведь и переместить строки наконец в какую-нибудь область и выдавать только по запросу (exception, например))
fr0b-p Не факт. Шаблоны - мощная фича и на них можно писать вычислительные программы времени компиляции. Другое дело, что это скажется на времени и ресурсах процесса компиляции
fr0b-p Инстанцировать с строковым литералов в качестве параметра шаблона действительно нельзя. Но все же с бубном поплясать можно. Согласно 14.3.2/2, строковые литералы не могут быть параметрами шаблона в силу того, что они имеют internal linkage. Если в параметрах шаблоны тип задан явно, то инстанцировать его можно только "обьектом" с external linkage Т.е. следующий код вполне соответсвует стандарту: template< char * sz>class test{}; char a[] = "blabla"; test<a>aa;
IceStudent Вы меня не так поняли. Я всего лишь показал, что С++ позволяет реализовать некотое подобие инстанцирования строкой. По поводу сабжа, думаю что реализация подобного на шаблонах возможна, но задача эта в некоторой степени нетривиальна.
censored Выписать рецепт окулисту? Где ты флуд увидел? Это раз. Твой пост здесь не к месту и является оффтопом. Это два. Есть претензии - есть пм. Это три. И за нарушение правил форума тебе предупреждение. Это четыре.
- вот это хорошая идея, но с этим я ни разу не работал, поэтому не знаю как это реализовать. Может кто простой пример скинет? И насчет простоты решениния: 1. Фасм - ну да проще, но прога сложная и поэтому избавляясь от одной проблемы появится куча других, но фасм все равно рулит. 2. дотНет - тормазная вещь, а еще глючит сильно, поэтому я от нее отказался как то раз из-за нее сильно пролетел.
не пойдет скриптом парсить и шифровать. будут символы выходящие за допустимый диапазон. разве что в base64
im1111 можно сделать файл(ы) с "исходниками" строк в простом формате, скажем: <идентификатор>="<строка>". Для него создать custom build rule, с выходом .c и .h файлов (или только .h, но не забыть включить string pooling /GF).
im1111 Ну, пример.. У меня строк с десяток было, я внёс их в файл, закриптовал и скопировал просто массивом в сорцы, назначив идентификаторы им (по типу ресурсов). Декриптовку обернул макросом, типа _TX(IS_MYSTRING). Минус - руками переносить строки. Плюс - делать это 1 раз для каждой строки. Если строк больше и ручная работа начинает надоедать, тогда уже решение выше. напишу подробнее. Пишешь скрипт/прогу (что тебе легче сделать), которая в заданном каталоге ищет сорцы и выдергивает из них специально оформленные строки (типа _TX("my string"), либо все подряд). Найденные строки заменяет на их идентификаторы (правда, генерация имён по строкам сложнее задача; если не хочешь с этим связываться - вынеси сам все строки в отдельный файл, типа DEFINE_TX(IS_STRING1,"my string")). Сами строки скрипт криптует и вносит в отдельный файл в виде массива байт: char IS_STRING1[] = { 0x53, 0x53, 0x21 }; Скрипт заносишь в Pre-build event, это в свойствах проекта (Build events). Перед сборкой он будет запускаться. По поводу использования - декриптуешь на лету либо при инициализации проги. Если на лету, то здесь есть ньюанс - когда криптовать обратно. Или можно дешифровать не крипто-строку, а её копию, тогда нужно будет просто освободить память (зависит от времени шифрации). Решение - либо вызывать освобождение строки явно, либо в макросе получения строки оставлять класс-держатель строки, при покидании области видимости он сам освободит. fr0b-p Не обязательно же хранить строки явно ("7hjrjkewhr=="), можно просто массивом байт, тогда не нужно будет укладываться в ASCII.
До чего меня в своё время Alasm пёр. Там была команда incbin которая прямо так что угодно пихала. Сколько асмов в тех пор видел, ни одна тварь не додумалась...