Зашифровать строковые константы в драйвере

Тема в разделе "WASM.NT.KERNEL", создана пользователем ntcdm, 6 июл 2010.

  1. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    Необходимо скрыть с глаз константные юникод-строки в драйвере. Т.е. чтобы текстовых строк в явном виде не было в файле, а они расшифровывались в процессе выполнения. Конечно, это не остановит умелого взломщика, но по крайней мере несколько затруднит анализ непрофессионалам.

    Самое очевидное - это зашифровать строки заранее, а затем в программе их расшифровывать. Но это не очень красиво, потому что тогда это ухудшит читаемость кода.

    Хотелось бы использовать что то вроде макросов типа

    Код (Text):
    1. RtlInitUnicodeString(&suName, _CRYPTED_STRING(L"test"));
    Нашел вот нечто подобное здесь http://www.codeproject.com/KB/string/cxr.aspx но оно не работает с Юникод строками и с драйверами.

    А ведь задача довольно распространенная при защите кода.

    Кто сталкивался с подобной задачей? Как ее решили?
     
  2. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    на асме это макросами решаемо, не знаю как в вашем скрипте...
     
  3. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    Я пишу на С++, там тоже есть макросы и ассемблерные вставки.
     
  4. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    При беглом просмотре похоже, что CXR использует TCHAR и его несложно настроить под Юникод строки, подправив правило поиска
    Код (Text):
    1.                   // looking for _CXR ( "..." )
    2.                   if (
    3.                      (tokenizer.GetToken(i).csToken == _T("_CXR")) && !tokenizer.GetToken(i).bIsQuotedString &&
    4.                      (tokenizer.GetToken(i + 1).csToken == _T("(L")) && !tokenizer.GetToken(i + 1).bIsQuotedString && //== _T("(")) ...
    5.                      (tokenizer.GetToken(i + 2).bIsQuotedString) &&
    6.                      (tokenizer.GetToken(i + 3).csToken == _T(")")) && !tokenizer.GetToken(i + 3).bIsQuotedString
    7.                      )
    А с чем связана проблема с драйверами? (вникать в исходники этого энкриптора желания нет, проще переписать это на другом языке)

    Кстати это обсуждалось уже, однако искать лень (и не помню, были ли толковые ответы).

    Как это делается на скриптовом языке под названием "masm макро"? :) (учим матчасть, С++ это компилируемый язык)
     
  5. google

    google New Member

    Публикаций:
    0
    Регистрация:
    10 авг 2007
    Сообщения:
    140
    Создать отдельно asm файл в котором хранить нужные строки. У MASM макроязык вроде как помощнее чем у C, а если заюзать FASM, то можно строки хранить зашифрованными AES %) В соседней теме про макросы была ссылка.
     
  6. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    J0E
    скрипт это образное выражение (с) Clerk :)
     
  7. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Про fasm у меня вопросов нет. Подозреваю, что и на masm это возможно, но вдруг кто-то захочет показать фрагмент такого изврата? :) (замечание про матчасть было вызывано там, что в ассемблере нет макросов, в отличие от макроассемблеров ;)
     
  8. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    А Клерк сам не пишет всякие IF? (бугога :)
     
  9. СFF

    СFF PP

    Публикаций:
    0
    Регистрация:
    16 янв 2009
    Сообщения:
    233
    Пишет, сорсы его посмотри движка который функции по хешу находит, там есть функция сравнения строк вот там точно .if есть. Да реально его легче писать, чем посто раз cmp
     
  10. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    возможно, сам юзаю простое шифрование строк на макросах
     
  11. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    скрипт это образное выражение, а помоему автор выражения Sol_Ksacap
     
  12. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    я долго пытался что-то придумать шифрование на макросах, гуглил, но максимум к чему я пришел это:
    http://www.wasm.ru/forum/viewtopic.php?pid=385294#p385294
    плюс еще можно сделать иттерационный макрос, как в буст например (где N - максимальная длина строки):
    Код (Text):
    1. #define CRYPT_STRING_ITERATION_0(String, Array) if(String[0] != '\0') { Array[0] = CryptChar(String[0]; CRYPT_STRING_ITERATION_1(String, Array) } else { Array[0] = '\0'; }
    2. ....
    3. #define CRYPT_STRING_ITERATION_N(String, Array) ...
    в любом случае подход в крипте текста препроцессором плох, из-за того, что слишком много кода генерируется на создание шифрованной строки... хотя если таких строк будет не много, то это не критично...

    в своих же проектах я решил делать так, ко всем шифрованных строкам добавляется префикс:
    Код (Text):
    1. #define CRYPT_STRING(String) "PREfix" String
    затем постбилдивентом выполняется моя прога, которая ищет в собранном бинарнике строки с префиксом и шифрует их...