Полиморфная функция.

Тема в разделе "WASM.RESEARCH", создана пользователем Argot, 14 фев 2008.

  1. Argot

    Argot New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2007
    Сообщения:
    14
    Собствено сталкнулся стакой бедой. Есть функция "Х", которая напервый вгляд всегда разная, но стоит внимательней вглянуть на нее в диссасемблере то сразу увидем кучу jmp и мусора. Если вырежем весь мусор и не нужные jmp получим исходный код функции.

    Код (Text):
    1. Оригинал Функции
    2.  
    3. код    
    4.   строка1
    5.   строка2
    6.   строка3
    7.   строка4
    8.   строка5
    9.   строка6
    10. конец кода
    11.  
    12. Модифицированая Функция
    13.  
    14. код
    15.   строка1
    16.   мусор
    17.   мусор
    18.   строка2
    19.   мусор
    20.   мусор
    21.   строка3
    22.   строка4
    23.   мусор  
    24.   строка5
    25.   мусор
    26.   мусор  
    27.   мусор
    28.   строка6
    29. конец кода
    а строки связаны между собой jmp что не нарушает функциональность функции. Причем мусор и jmp вставляются в код рандомно.

    А вопрос вследуещем если какието приемы вернутся к исходному коду ? или нужно писать свой анализатор на основе дисасемблера?
     
  2. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Argot
    Первое, что приходит в голову вставить вместо "мусора" NOP. Далее поэтапно "сжимая" освободившееся место, можно востановить исходный код. Автор возможно встроил в свой алгоритм элементы, которые проверяют/зависят от растояния, на котором находятся фрагменты программы. Есть вариант, что среди "мусора" может оказаться некая контрольная сумма. В любом случае я бы рекомендовал анализ кода
     
  3. Argot

    Argot New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2007
    Сообщения:
    14
    На мусор думаю можно вообще забить. Помне что востановить нужно склеивать код от jmp к jmp (вот только с реализацие трабла). Да для чего мне это надо мне надо програмно рипать определеный код из этой функции, эта функция приходит ввиде байт кода посети и код который нужно рипнуть всегда разный, но его можно вылавлить используя сигнатуры, а для этого нужно избавится от мусора и связующих jmp. Те востановить код до полимирезации.

    З.Ы. еще ввиде мусора выступают следующие строки mov Eax, Eax и т.д. Но в основнов мусор который вообще неиспользуется.

    Вот кусок для примера
    Код (Text):
    1.         MOV AL,BYTE PTR DS:[EBX]
    2.         XCHG EBX,EBX
    3.         ROR AL,0C0h                          
    4.         ADD AL,3
    5.         ADD AL,CL
    6.         ROL AL,0CCh                        
    7.         DEC AL
    8.         XOR AL,084h
    9.         DEC AL
    10.         XOR AL,08Bh
    11.         MOV BYTE PTR DS:[EBX],AL
    12.         MOV ESP,ESP
    13.         JMP @04426B52
    14.         DB 0C9h
    15.         DB 025h                              
    16.         RETN
    17.         DB 045h                              
    18.         DB 059h                            
    19.         DB 040h                            
    20.         DB 056h                            
    21.         DB 024h                            
    22.         DB 034h
     
  4. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Argot
    Если не ошибаюсь, такую "лапшу" использовали в каких-то ключах (причем инструкции были не только разбиты на группы, связанные переходами, но и вдобавок ко всему еще и перемешаны. Боролся я с этим довольно просто (правда занудно) - брал тетрадь и ручку. Можно и в текстовом редакторе. Про какие-то программы, облегчающие процесс, что-то не слышал, хотя, наверное, можно написать простой эмулятор.
    В твоем случае, кстати, эмулятор не поможет - каждый кусок нужно просмотреть на предмет, а нет ли в нем чего-то осмысленного. К примеру, в приведенном тобой куске видно, что на самом деле расшифровывается байт по адресу [ebx].
     
  5. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Argot
    «ничегонеделающие» команды может быть пригодятся:)
    Длина |команда |Код
    в байтах| |
    1 |xchg eax,eax |90
    2 |mov eax,eax |8B C0
    2 |lea eax,[eax] |8D 00
    2 |jmp $+2 |EB 00
    3 |shl eax,0 |C1 E0 00
    3 |lea eax,[eax] |8D 04 20
    3 |lea eax,[eax] |8D 40 00
    4 |lea eax,[eax] |8D 44 20 00
    4 |shrd eax,eax,0|0F AC C0 00
    6 |lea eax,[eax] |8D 80 00 00 00 00
    7 |lea eax,[eax] |8D 84 20 00 00 00 00
    7 |lea eax,[eax] |8D 04 05 00 00 00 00
     
  6. Argot

    Argot New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2007
    Сообщения:
    14
    Mikl__ спс пригодится.

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

    Есть клиент и сервер, которые обмениваются информацие по своему протоколу, а информация защищена слабым Xor алгоритмом. Но поверх все этого навешана доп. защита. Она релизована ввиде Длл с клиентской части, которая очень хорошо интегрируется и привязывается к клиенту (по средством хука перхватываются внутрение классы и функции, a не просто Send и Recv). При подключение клиента ему приходит байт функция, которая работает ввиде таймера и опеределом условии она дешифрует своим алгоритмом пакеты из буфера.

    З.Ы. Алгоритм с новой сесией новый он скорее всего генерирется рандомной.
     
  7. Joes

    Joes New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2008
    Сообщения:
    98
    Это не о какой то игре идет речь?
     
  8. Argot

    Argot New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2007
    Сообщения:
    14
    есть какая то разница ? Мне интересна сама технология и ее обход.
     
  9. Joes

    Joes New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2008
    Сообщения:
    98
    Не, разницы нет, просто я такое уже видел в онлайновой игрушке. Во всяком случае очень похожее.

    Функция проверки делает какие то? Ну, скажем, если ее выкусить и запустить отдельно? Т.е. дело в мусоре или невозможности ее запуска с мусором?

    Собственно цель: убрать мусор или подделывать шифрование?
     
  10. Argot

    Argot New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2007
    Сообщения:
    14
    байт Функция которая приходит жеско завязана с клиентом, она заменяет 1 из таймеров в клиенте не нарушая его работу.

    Цель получать алгоритм дешифрования. Скажем для своего клиента. Но думаю без убирания мусора и востановления исходного кода я невижу решений.
     
  11. Joes

    Joes New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2008
    Сообщения:
    98
    Если в ней нет простейших проверок на оригинальность клиента - можно запускать как есть (во всяком случае функцию расшифровки).
    Выкусить мусор не получится вот почему: в код могут добавить кусок который не мусорный и зависит от определенных байт в клиенте. Т.е. ключ будет меняться, если в нужном месте не окажется нужных байт.
     
  12. Argot

    Argot New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2007
    Сообщения:
    14
    не получится. такак она оперирует функциями из дллок клиента в моем клиенте их нет.

    а 1 из алгоритмов декодировки я приводил выше. Всего несколько байт а байт функция весит около 70 Кб
     
  13. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Argot
    Судя по фрагменту алгоритм обратим (проходим в обратном направлении, заменяя инструкции на "обратные").
     
  14. Joes

    Joes New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2008
    Сообщения:
    98
    Угу, вот про это я и спрашивал.
    Есть возможность локализировать функцию расшифровки несмотря на мусор? Скажем ее старт и ее длину?
     
  15. Joes

    Joes New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2008
    Сообщения:
    98
    Тут проблема в другом - сам алгоритм спрятан между мусором. Т.е. приведенный пример это уже "очищенный" код.
     
  16. Argot

    Argot New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2007
    Сообщения:
    14
    суть в том чтоб чтоб автоматически вывдеркивать код из полиморфной байт функции.

    Код всегда разный, и мусор всегда по разному заполняется.
     
  17. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Argot
    Можно все-таки попробовать эмулятор написать, отслеживающий логику и оставляющий только те инструкции, которые изменяют код.
    Для начала хотя бы выделить эти инструкции (вроде этой: mov es:[bx], al).
    ЗЫ
    Чтобы был предмет обсуждения, неплохо было бы посмотреть на вышеупомянутый мусор. Поскольку кто-то генерит тело полиморфа, можно попытаться понять, как это делается и здесь без примеров не обойдесся.
    ЗЫ
    ИМХО, здесь может существенно помочь то, что алгоритм должен быть обратим (скорее всего), а значит на него наложены серьезные ограничения.
     
  18. Joes

    Joes New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2008
    Сообщения:
    98
    Хорошо, предположим что код выдергнули. Что делать с полученным кодом?
     
  19. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Argot
    откройте для себя дизассемблер IDA и его скриптинг или плагины
     
  20. Argot

    Argot New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2007
    Сообщения:
    14
    Вот я и прошу помоши в написание эмуля так как раньше не писал. С чего начать ?


    Сделаю свою функцию дешифровки для сессии.


    Откройте для себе внимательность. И перечитайте тему с начала.


    З.Ы. Всем спасибо кто помогает разобратся с проблемой. Вопрос до сих пор актуален.

    З.Ы.Ы. IDA`e не позубам этот байт код ))