Критерии "открытого текста" для программ

Тема в разделе "WASM.CRYPTO", создана пользователем crypto, 6 мар 2006.

  1. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    _BC_

    можно довольно надежно определять по частоте встречаемости байт, является ли фрагмент кодом или нет.



    Я согласен. Частотный анализ байт будет основой для определения "открытости текста".



    А вот если в случае прохождения текста через этот этап пробовать дизассемблировать несколько подряд идущих инструкций на предмет выяснения (1) возможности дизассемблирования (2) логичности следования инструкций (например после операции сравнения должен следовать, пусть и не сразу, а через одну или более инструкций mov, условный или безусловный переход).

    Понятно, что для этого мы должны иметь частоты встречаемости инструкций (в зависимости от компилятора) и частоты встречаемости пар, троек и т.д. инструкций.

    Конечно, в код могут быть вкраплены данные или таблицы косвенных переходов, SEH и прочая некодовая составляющая. В таком случае можно как-то ограничить количество инструкций, например, проверять таким образом порядка десятка.
     
  2. kropalik

    kropalik New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2005
    Сообщения:
    155
    Адрес:
    msk
    скорее всего не подойдет но рискну предложить

    безумый способ (зато весьма быстрый). просто

    ЗАПУСТИТЬ расшифрованную хрень. и посмотреть

    что за исключение будет и где. то есть примерный

    план такой: 1 процесс пытается расшифровать код

    и передает результат процессу 2 (каким нибудь

    быстрым способом типа shared memory). процесс 2

    пытается выполнить этот код. идея в том что мусор

    вызовет исключение практически сразу и это будет

    что нибудь типа EXCEPTION_ILLEGAL_INSTRUCTION или

    EXCEPTION_PRIV_INSTRUCTION. а более осмысленный

    код вылетит на jmp или call (вероятней всего EXCEPTION_ACCESS_VIOLATION).

    конечно этот способ вряд ли позволит точно

    определить корректность расшифрованного кода

    но зато отбросит значительную часть точно

    неправильно расшифрованных блоков. а оставниеся

    уже можно проверять более точными (и соответственно

    медленными) способами.
     
  3. OLS

    OLS New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2005
    Сообщения:
    322
    Адрес:
    Russia
    честное слово, интересный способ ...



    только на подготовке контекста для каждой очередной попытки и обработке исключения ты не наберешь ли столько же тактов, что и для плодсчета гистограммы частот ?
     
  4. kropalik

    kropalik New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2005
    Сообщения:
    155
    Адрес:
    msk
    если бы мне пришлось такое делать

    наверно для начала написал бы так:

    1. процесс-расшифровщик берет очередной

    блок ключей и пытается расшифровать N

    блоков шифротекста. результат кладет

    в sharedmemory (между блоками добавляем

    0xCC).

    2. процесс для проверки устанавливает

    по максимуму собствнную защиту (100%

    гарантировать конечно невозможно но

    хотябы сделать всю память кроме необходимой

    PAGE_READONLY). затем jmp на первый кусок.

    ну а если заглючит - перезапустить процесс

    а соответствующий блок проверять другим способом.

    3. для начала обрабатвыать исключения

    обычным способом (чтоб просто собрать

    статистику и выбрать критерии)

    затем скорее всего придется децл доработать

    ring0 код чтобы конкретно для нашего процесса

    делал все быстрее (возможно с некоторой потерей

    функциональности)



    4. еще можно подумать а зачем вообще windows

    если нужно лишь запустить децл мусора и посмотреть

    где упадет ?