Как лучше всего шифровать строки в бинаре?

Тема в разделе "WASM.WIN32", создана пользователем nullPtr, 8 ноя 2020.

  1. nullPtr

    nullPtr Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2020
    Сообщения:
    138
    Нужно шифровать строки в своем бинаре, чтоб индуские-аверы немного помучались.
    Пишу все это дело на своем Си (без crt). Ксорить на этапе компиляции не получится как с constexpr в C++.

    Что я делал до этого. Брал строку: Hello. Ксорил его с 3 байтовым ключом. Полученные данные: "N1h(!9*Y2" например после ксора переобразовывал в int и каждому добавлял +5 единицу и снова переводил в ASCII. Т.е. N имеет в ASCII скажем 60, добавляем 5 = получается 65. Это все переводил обратно в ASCII как уже сказал. И полученные данные например: "*!60dsb&^1f" шифровал какой-то стороней либой c ключом и данные обратно ксорил 3х байтовым ключом. Канеш все это декриптят уже.

    Подскажите, как лучше всего шифровать строки в Си, еще буду рад если подкините либы шифрование на Си. (не плюсы, в плюсах не понимаю ничего)
     
  2. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    nullPtr,

    Сбивается авер вирта и дешифруется образ, это обычный штатный крипт. При этом статик строк нет, но они есть в памяти после распаковки. Можно убрать из памяти строки(с-анклавы), но это сложная задача тебе не по силам.
     
    nullPtr нравится это.
  3. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    О хоспаде, опять за свое. Он не про пакеры говорит, а про обфускацию, никакого распакованного образа нет.

    В моей статье на дамаге про обфускацию либшлангом есть алгоритм обхода ast и шифрования строк. Какой-то жесткий криптостойкий алгоритм особо смысла тут не имеет. Имхо лучше реализовать несколько разных алгоритмов и для каждой строки в ast выбирать псевдо случайный из них. Так реверсер не сможет вычленить единый алгоритм и дешифровывать все строки автоматом через тот же IDAPython.
     
    nullPtr нравится это.
  4. nullPtr

    nullPtr Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2020
    Сообщения:
    138
    Как раз хотел твой варик взять). Прост подумал, мб есть что-то поинтереснее.
    --- Сообщение объединено, 8 ноя 2020 ---
    Или как вариант можно мой вышописанный алгоритм взять и шифровать строки в перемешенном порядке. Т.е. сперва шифрование либой, потом ксор, потом base64 или сперва base64, либа, ксор. А ключ каждому дешифратору будет взят из предыдущего шифрование. Это позволит ключ не держать открыто.
    Например: ксор "1X*!G91", а моя либа берет и вырезает половину "!G91", переводит в int и это послужит ключом для дешифровки"

    А есть ли у Вас какие-либо малоизвестные надежные либы для шифрование строк?
     
  5. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    ROT13 - мегаэлитный, юзай его)
     
  6. nullPtr

    nullPtr Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2020
    Сообщения:
    138
    рофл штоль?) Ну лан
     
  7. Vicshann

    Vicshann Member

    Публикаций:
    0
    Регистрация:
    22 сен 2020
    Сообщения:
    36
    У меня раньше так было:
    Код (C++):
    1.  
    2. //---------------------------------------------------------------------------------
    3. //                     COMPILE TIME STRING ENCRYPTION   [ lstrlen(ENCS("Hello World!")); ]
    4. // Optimization must be turned ON to remove a HUGE portions of code (Macro expansion)
    5. //---------------------------------------------------------------------------------
    6. #define RESTRMAX 32
    7. #define INFOXOR 0x5257424B
    8. #define DOENCKEY(str,idx) (str[idx])
    9. #define EKEY2 DOENCKEY(__TIME__,6)
    10. #define EKEY1 DOENCKEY(__TIME__,7)
    11. #define EKEY  ((EKEY1) ^ (EKEY2))
    12.  
    13. #define ESB1(str,key,idx) ((BYTE)((idx < sizeof(str))?((((str)[(idx)] ^ (BYTE)(key)) ^ (idx))):(0)))
    14. #define ESB4(str,key,idx) ((DWORD)((ESB1(str,key,(idx*4))<<8)|(ESB1(str,key,((idx*4)+1))<<24)|(ESB1(str,key,((idx*4)+2)))|(ESB1(str,key,((idx*4)+3))<<16)))
    15. #define SINF(str,key)     ((DWORD)((sizeof(str)|((key)<<24)) ^ INFOXOR))  
    16. #define ESB(str,idx)      ((DWORD)ESB4(str,EKEY,idx))
    17.  
    18. // Try to construct this macro dynamically
    19. //#define ENCS(str)  SDecryptRtStr<8>(SINF(str,EKEY), ESB(str,0), ESB(str,1), ESB(str,2), ESB(str,3), ESB(str,4), ESB(str,5), ESB(str,6), ESB(str,7))  // 32
    20. #define ENCSN(nam,str)  SDecryptRtStr<8> nam (SINF(str,EKEY), ESB(str,0), ESB(str,1), ESB(str,2), ESB(str,3), ESB(str,4), ESB(str,5), ESB(str,6), ESB(str,7))  // 32
    21. #define ENCS(str) ENCSN( ,str)
    22. //#define ENCS(str) (str)
    23.  
    24. template<int i> class SDecryptRtStr
    25. {    // No another vars here - some optimization bug.
    26. WORD Size;    // Including terminating Zero
    27. union
    28.   {
    29.    DWORD dval[i];
    30.    char  cval[i*sizeof(DWORD)];
    31.   };
    32. public:
    33. __declspec(noinline) SDecryptRtStr(DWORD info, ...)
    34. {
    35.   info ^= INFOXOR;
    36.   DWORD Key  = (info >> 24);
    37.   DWORD bLen = (info & 0xFF);
    38.   DWORD VXor = (Key << 24)|(Key << 16)|(Key << 8)|Key;
    39.   if(bLen > (i*sizeof(DWORD)))bLen = (i*sizeof(DWORD));
    40.   UINT  wLen = (bLen/sizeof(DWORD))+(bool)(bLen%sizeof(DWORD));  // Always has a Zero DWORD at end
    41.   ULONG_PTR* args = reinterpret_cast<ULONG_PTR*>(&info);
    42.   args++;  
    43.   for(UINT ctr=0;ctr < wLen;ctr++)
    44.    {
    45.     DWORD data = args[ctr];  // reinterpret_cast<PUINT>(args)[ctr];   // On x64 it is 8 bytes
    46.     DWORD inx  = (ctr*4);
    47.     DWORD xval = (((inx+1) << 24)|((inx+3) << 16)|((inx+0) << 8)|(inx+2));
    48.     data = (data ^ VXor) ^ xval;
    49.     data = ((data << 16)&0x00FF0000)|((data >> 8)&0x000000FF)|((data << 8)&0xFF000000)|((data >> 16)&0x0000FF00);
    50.     this->dval[ctr] = data;
    51.    }
    52.   cval[bLen-1] = 0;
    53.   this->Size = bLen;
    54. }
    55. //------------------------
    56. ~SDecryptRtStr()
    57. {
    58.   UINT wLen = (this->Size/sizeof(DWORD))+(bool)(this->Size%sizeof(DWORD));
    59.   for(UINT ctr=0;ctr<wLen;ctr++)this->dval[ctr] = 0;
    60. }    
    61. operator const char*() const {return reinterpret_cast<const char*>(&this->cval);}
    62. operator LPSTR() const {return (LPSTR)&this->cval;}
    63. operator const int()   const {return this->Size;}
    64. };
    65. //---------------------------------------------------------------------------------
    66.  
    Наверно можно довести до совместимости с чистым С, применив еще больше уродливых макросов:)
     
    nullPtr нравится это.
  8. nullPtr

    nullPtr Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2020
    Сообщения:
    138
    Как Вы вообще пишите на С++?) Как по мне, очень не красивый язык с кучу непонятными сложностями. ИМХО еслчо)
    --- Сообщение объединено, 8 ноя 2020 ---
    В общем решил таким образом. Не стал сильно заморачиваться.
    Есть char data[] = "Hello";
    Смотрим последний char, переводим в int. Если число четное, то сперва данные декриптим ксором, после rot13, а в качестве последнего символа записываем '0', чтоб декриптор смог дешифровать, а если не четное число, то наоборот.

    Декрипт будет точно такой же. Смотрит последний char нашей зашифрованный строки (в нашем случае '0'). Переводит его в int, смотрит чет или не чет. В зависимости декриптит по опредленному порядку.
     
  9. Vicshann

    Vicshann Member

    Публикаций:
    0
    Регистрация:
    22 сен 2020
    Сообщения:
    36
    Сложностями пользоваться не обязательно, а для группировки кода много полезного, особенно в последних версиях стандарта. Можно получить почти что Java:)
     
  10. nullPtr

    nullPtr Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2020
    Сообщения:
    138
    сугубо для вир:dirol:ов в образовательных целях мне удобнее Си почему-то. Легкий синтаксис, мало сложных конструкции
     
  11. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    185
    как это вообще понять ?
     
  12. Vicshann

    Vicshann Member

    Публикаций:
    0
    Регистрация:
    22 сен 2020
    Сообщения:
    36
    Обычный cast, вроде "(ULONG_PTR*)&info" но с понтами:)
     
  13. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    185
    Vicshann, это преобразование типа но с понтами да ?
     
  14. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    nullPtr, пиши на говноскриптах (петон, пхп); на чистом Си нет нормальных инструментов. Макросы слабые (разве что GCC брать с расширениями, но я в нем не шарю). Сам когда-то искал похожее , обошел всех кодеров и фрилансы, нифига не нашел. Либо на плюсах кодить, либо сторонние тулзы.
     
  15. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    185
    AutoIT Script тоже можно заюзать
     
  16. nullPtr

    nullPtr Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2020
    Сообщения:
    138
    Малварь чтоль?) Не)
    ну возможно. Я все портирую из плюсов на Си
    Я видел твои посты типа для малварь онли Си.
    Канеш в плюсах много че интересного (обфускация при компиляции, ООП, очень много тулз, либ и т.д.).
    Так ты уже перешел в темную сторону?)
     
  17. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    да боже упаси, ты же знаешь мое отношение к малвари на петоне / шарпе.

    Ну я тоже, но что есть то есть; увы.

    Но учить ООП мне как то лень; разве что кодить в Зевс-стиле (взять неймспейсы сугубо, шаблоны еще неплохая фишка). Без STL короче.

    нет, я же "полковник мвд" (с) Инди.
    Если серьезно, то нет времени и возможности что-то кодить, последние два года больше в больнице, чем дома; изучаю матчасть, или какую-то мелочевку пишу (как консультация / РоС).
     
  18. nullPtr

    nullPtr Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2020
    Сообщения:
    138
    Помню на дамаге ты порекомендовал один раз какому-то челу изучать Си шарп для малварь. Там после этого тебя рофлили)
    То что на плюсах написанно (именно малварь) не читабельно фуфло. Дайте лучше 10к Си кода и я пойму каждую стркоу, чем 1к строк С++ с ООП.
    Да, мы общались на дамаге, говорил, что болеешь.
    Идете на поправление товарищ майор?)
     
  19. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    В плюсах есть свои преимущества, RAII тот же, можно defer запилить себе, очень удобно. Больше проблем с типами находит на этапе компиляции. Мне кажется, что многим любителям сишечки понравится язык D в режиме betterC.
     
  20. X-Shar

    X-Shar Active Member

    Публикаций:
    0
    Регистрация:
    24 фев 2017
    Сообщения:
    354
    Что-бы ответить на этот вопрос, прежде всего нужно понимать, что шифровать строки нужно для того что-бы реверсер не увидел эти самые строки в хекс редакторе например.)

    Это первое, второе, как используется строка ?

    Если например вы скрываете какие-то апи винды, то собственно достаточно захешировать строки, например мармархеш, или ещё что и не трогать её больше в коде, а сравнивать уже сами хеши при поиске, как вариант...

    А так-то можно много чего придумать, это использование несколько алгоритмов шифрования XOR, XTEA, также получение ключа и т.д., всё это затруднит анализ кода.

    Про С++, а чего он всем мешает-то, все вы с вероятностью 100% используете компилятор С++, ну нехочется использовать классы, пишите в Си стиле, никто-же незапрещает.

    Для удобства шифрования строк можно использовать constexpr, или как-там оператор называется, уже забыл...)))

    Но там есть минус, что нужно включать оптимизацию компилятора, иначе работать не будет.

    Можно хеши и шифрованные строки прям в код хардкодить, почему нет ?)

    Только комментарить не забывайте, а то сами потом запутаетесь, либо давайте понятные переменные, что это за магические числа, хе-хе...)
     
    nullPtr нравится это.