constexpr и шифрование указателей на строки

Тема в разделе "WASM.BEGINNERS", создана пользователем HoShiMin, 22 янв 2018.

  1. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.486
    Адрес:
    Россия, Нижний Новгород
    Добрый день форумчанам! Хочу сделать шифрование указателей на строки в компайл-тайме и расшифровку в рантайме. Таким образом, при статическом анализе на строку не будет ни одной ссылки.

    Код (C++):
    1.  
    2. constexpr char* Crypt(char* String) {
    3.     return String + 3;
    4. }
    5.  
    6. int main() {
    7.     constexpr char* String = Crypt("123ABC");
    8. }
    9.  
    Ожидается, что в String ещё на этапе компиляции будет положен адрес, указывающий на "ABC", но Crypt работает как рантайм-функция: в рантайме загружается оригинальный адрес "123ABC", к нему прибавляется 3 и записывается в String (т.е., в статике остаётся ссылка на оригинальную строку).

    Можно ли как-то обмануть компилятор, заставив его ещё на этапе компиляции рассчитывать адрес из адреса строки?
     
  2. zerodawn

    zerodawn Member

    Публикаций:
    0
    Регистрация:
    16 янв 2018
    Сообщения:
    94
  3. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.486
    Адрес:
    Россия, Нижний Новгород
    Читал. Интересный подход, но хотелось бы не только (и даже не столько) зашифровать строку, сколько разорвать все ссылки на неё
     
  4. zerodawn

    zerodawn Member

    Публикаций:
    0
    Регистрация:
    16 янв 2018
    Сообщения:
    94
    если речь идет о XREF, то делай че то вроде:

    Перед этим убрать align
    Код (C++):
    1.  
    2. struct str
    3. {
    4. CHAR szReserved[16];
    5. PCHAR pString = "...";
    6. };
    7.  
    8. PCHAR pchFixPtr(str *_string)
    9. {
    10.   return (_string + 16 * sizeof(CHAR));
    11. }
    12. ...
    13.  
    14. str Somethx;
    15. SomeFunction(pchFixPtr(&Somethx));
    16.  
    17.  
    Думаю смысл понятен
     
  5. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.486
    Адрес:
    Россия, Нижний Новгород
    So complicated в плане использования. Хотелось бы более прозрачный способ
     
  6. zerodawn

    zerodawn Member

    Публикаций:
    0
    Регистрация:
    16 янв 2018
    Сообщения:
    94
    Да вы мсье эстет

    У меня в 5:30 глаза слипаются, поэтому я мог написать полнейшую фигню. Но вот вам менее complicated...
    Код (C++):
    1.  
    2. struct str
    3. {
    4.   str(PCHAR pStr)
    5. {
    6.   this->string = pStr + 1;
    7. }
    8.  PCHAR c_str() { return this->string; }
    9.  PCHAR string;
    10. };
    11.  
    12. ...
    13. str Self("HoShiMin privireda" - 1);
    14. SomeFunc(Self.c_str());
    15.  
    16.  
     
    HoShiMin нравится это.
  7. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.486
    Адрес:
    Россия, Нижний Новгород
    Улыбнуло)
    Намного лучше)