Вопрос по Visual Studio C++

Тема в разделе "LANGS.C", создана пользователем Guest, 14 ноя 2006.

  1. Guest

    Guest Guest

    Публикаций:
    0
    Требуется скрыть строки в файле, для этого имеется простая функция шифрования, но чтобы это сделать требуется сначала зашифровать все имеющиеся строки, а потом в программе расшифровывать по мере необходимости. В итоге программинг становится дико неудобным и неразборчивым, может кто знает как заставить компилятор зашифровать строки перед сборкой автоматически наподобе #define, но для больших функций?
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Для шифрования: Pre-build event + скрипт, обрабатывающий сорцы на предмет строк.
    Для удобства дешифрации: фантазия.
     
  3. Peshuha

    Peshuha New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2003
    Сообщения:
    41
    пишешь #define MY_T(s) MY_UNIQUE_STRING##s##MY_END_OF_UNIQUE_STRING

    В программе ссылаешься на такие строки только через данный макрос. После буилда запускаешь exe, которая отыскивает строки типа MY_UNIQUE_STRING и шифрует как надо.
    Кроме того, загрузчик рулит! (обратный процесс: мождно ведь и переместить строки наконец в какую-нибудь область и выдавать только по запросу (exception, например))
     
  4. fr0b-p

    fr0b-p New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2006
    Сообщения:
    118
    компилятор никак не заставить разве что гцц переделоть... пошифруй проще секцию целиком :)
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    fr0b-p
    Не факт. Шаблоны - мощная фича и на них можно писать вычислительные программы времени компиляции. Другое дело, что это скажется на времени и ресурсах процесса компиляции :)
     
  6. fr0b-p

    fr0b-p New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2006
    Сообщения:
    118
    строковые литералы не могут быть параметрами шаблона (пока)
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    fr0b-p
    Да, ты прав - там только натуральные вычисления.
     
  8. Kmet

    Kmet New Member

    Публикаций:
    0
    Регистрация:
    24 июн 2006
    Сообщения:
    28
    Адрес:
    Belarus
    fr0b-p
    Инстанцировать с строковым литералов в качестве параметра шаблона действительно нельзя. Но все же с бубном поплясать можно.

    Согласно 14.3.2/2, строковые литералы не могут быть параметрами шаблона в силу того, что они имеют internal linkage.
    Если в параметрах шаблоны тип задан явно, то инстанцировать его можно только "обьектом" с external linkage

    Т.е. следующий код вполне соответсвует стандарту:

    template< char * sz>class test{};
    char a[] = "blabla";
    test<a>aa;
     
  9. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Kmet
    А дальше? Как ты на этапе компиляции хотя бы проксоришь символы?
     
  10. Kmet

    Kmet New Member

    Публикаций:
    0
    Регистрация:
    24 июн 2006
    Сообщения:
    28
    Адрес:
    Belarus
    IceStudent
    Вы меня не так поняли. Я всего лишь показал, что С++ позволяет реализовать некотое подобие инстанцирования строкой.

    По поводу сабжа, думаю что реализация подобного на шаблонах возможна, но задача эта в некоторой степени нетривиальна.
     
  11. fr0b-p

    fr0b-p New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2006
    Сообщения:
    118
    а как инстанциировать шаблон вычисленным в компайл тайм строковым литералом?
     
  12. fr0b-p

    fr0b-p New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2006
    Сообщения:
    118
    дотнет рулез форева все изучаем nemerle :)
     
  13. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    fr0b-p
    в фасме на раз такое решается.
     
  14. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    IceStudent
    хватит флудить и заниматся пиаром
     
  15. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    censored
    Выписать рецепт окулисту? Где ты флуд увидел? Это раз. Твой пост здесь не к месту и является оффтопом. Это два. Есть претензии - есть пм. Это три. И за нарушение правил форума тебе предупреждение. Это четыре.
     
  16. Guest

    Guest Guest

    Публикаций:
    0
    - вот это хорошая идея, но с этим я ни разу не работал, поэтому не знаю как это реализовать. Может кто простой пример скинет?
    И насчет простоты решениния: 1. Фасм - ну да проще, но прога сложная и поэтому избавляясь от одной проблемы появится куча других, но фасм все равно рулит. 2. дотНет - тормазная вещь, а еще глючит сильно, поэтому я от нее отказался как то раз из-за нее сильно пролетел.
     
  17. fr0b-p

    fr0b-p New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2006
    Сообщения:
    118
    не пойдет скриптом парсить и шифровать. будут символы выходящие за допустимый диапазон. разве что в base64
     
  18. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    im1111
    можно сделать файл(ы) с "исходниками" строк в простом формате, скажем:
    <идентификатор>="<строка>".

    Для него создать custom build rule, с выходом .c и .h файлов (или только .h, но не забыть включить string pooling /GF).
     
  19. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    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.
     
  20. Proteus

    Proteus Member

    Публикаций:
    0
    Регистрация:
    19 июн 2004
    Сообщения:
    344
    Адрес:
    Russia
    До чего меня в своё время Alasm пёр. Там была команда incbin которая прямо так что угодно пихала. Сколько асмов в тех пор видел, ни одна тварь не додумалась...