Собствено сталкнулся стакой бедой. Есть функция "Х", которая напервый вгляд всегда разная, но стоит внимательней вглянуть на нее в диссасемблере то сразу увидем кучу jmp и мусора. Если вырежем весь мусор и не нужные jmp получим исходный код функции. Код (Text): Оригинал Функции код строка1 строка2 строка3 строка4 строка5 строка6 конец кода Модифицированая Функция код строка1 мусор мусор строка2 мусор мусор строка3 строка4 мусор строка5 мусор мусор мусор строка6 конец кода а строки связаны между собой jmp что не нарушает функциональность функции. Причем мусор и jmp вставляются в код рандомно. А вопрос вследуещем если какието приемы вернутся к исходному коду ? или нужно писать свой анализатор на основе дисасемблера?
Argot Первое, что приходит в голову вставить вместо "мусора" NOP. Далее поэтапно "сжимая" освободившееся место, можно востановить исходный код. Автор возможно встроил в свой алгоритм элементы, которые проверяют/зависят от растояния, на котором находятся фрагменты программы. Есть вариант, что среди "мусора" может оказаться некая контрольная сумма. В любом случае я бы рекомендовал анализ кода
На мусор думаю можно вообще забить. Помне что востановить нужно склеивать код от jmp к jmp (вот только с реализацие трабла). Да для чего мне это надо мне надо програмно рипать определеный код из этой функции, эта функция приходит ввиде байт кода посети и код который нужно рипнуть всегда разный, но его можно вылавлить используя сигнатуры, а для этого нужно избавится от мусора и связующих jmp. Те востановить код до полимирезации. З.Ы. еще ввиде мусора выступают следующие строки mov Eax, Eax и т.д. Но в основнов мусор который вообще неиспользуется. Вот кусок для примера Код (Text): MOV AL,BYTE PTR DS:[EBX] XCHG EBX,EBX ROR AL,0C0h ADD AL,3 ADD AL,CL ROL AL,0CCh DEC AL XOR AL,084h DEC AL XOR AL,08Bh MOV BYTE PTR DS:[EBX],AL MOV ESP,ESP JMP @04426B52 DB 0C9h DB 025h RETN DB 045h DB 059h DB 040h DB 056h DB 024h DB 034h
Argot Если не ошибаюсь, такую "лапшу" использовали в каких-то ключах (причем инструкции были не только разбиты на группы, связанные переходами, но и вдобавок ко всему еще и перемешаны. Боролся я с этим довольно просто (правда занудно) - брал тетрадь и ручку. Можно и в текстовом редакторе. Про какие-то программы, облегчающие процесс, что-то не слышал, хотя, наверное, можно написать простой эмулятор. В твоем случае, кстати, эмулятор не поможет - каждый кусок нужно просмотреть на предмет, а нет ли в нем чего-то осмысленного. К примеру, в приведенном тобой куске видно, что на самом деле расшифровывается байт по адресу [ebx].
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
Mikl__ спс пригодится. Собствено нужно описать, да как и с чем я работаю. Есть клиент и сервер, которые обмениваются информацие по своему протоколу, а информация защищена слабым Xor алгоритмом. Но поверх все этого навешана доп. защита. Она релизована ввиде Длл с клиентской части, которая очень хорошо интегрируется и привязывается к клиенту (по средством хука перхватываются внутрение классы и функции, a не просто Send и Recv). При подключение клиента ему приходит байт функция, которая работает ввиде таймера и опеределом условии она дешифрует своим алгоритмом пакеты из буфера. З.Ы. Алгоритм с новой сесией новый он скорее всего генерирется рандомной.
Не, разницы нет, просто я такое уже видел в онлайновой игрушке. Во всяком случае очень похожее. Функция проверки делает какие то? Ну, скажем, если ее выкусить и запустить отдельно? Т.е. дело в мусоре или невозможности ее запуска с мусором? Собственно цель: убрать мусор или подделывать шифрование?
байт Функция которая приходит жеско завязана с клиентом, она заменяет 1 из таймеров в клиенте не нарушая его работу. Цель получать алгоритм дешифрования. Скажем для своего клиента. Но думаю без убирания мусора и востановления исходного кода я невижу решений.
Если в ней нет простейших проверок на оригинальность клиента - можно запускать как есть (во всяком случае функцию расшифровки). Выкусить мусор не получится вот почему: в код могут добавить кусок который не мусорный и зависит от определенных байт в клиенте. Т.е. ключ будет меняться, если в нужном месте не окажется нужных байт.
не получится. такак она оперирует функциями из дллок клиента в моем клиенте их нет. а 1 из алгоритмов декодировки я приводил выше. Всего несколько байт а байт функция весит около 70 Кб
Argot Судя по фрагменту алгоритм обратим (проходим в обратном направлении, заменяя инструкции на "обратные").
Угу, вот про это я и спрашивал. Есть возможность локализировать функцию расшифровки несмотря на мусор? Скажем ее старт и ее длину?
Тут проблема в другом - сам алгоритм спрятан между мусором. Т.е. приведенный пример это уже "очищенный" код.
суть в том чтоб чтоб автоматически вывдеркивать код из полиморфной байт функции. Код всегда разный, и мусор всегда по разному заполняется.
Argot Можно все-таки попробовать эмулятор написать, отслеживающий логику и оставляющий только те инструкции, которые изменяют код. Для начала хотя бы выделить эти инструкции (вроде этой: mov es:[bx], al). ЗЫ Чтобы был предмет обсуждения, неплохо было бы посмотреть на вышеупомянутый мусор. Поскольку кто-то генерит тело полиморфа, можно попытаться понять, как это делается и здесь без примеров не обойдесся. ЗЫ ИМХО, здесь может существенно помочь то, что алгоритм должен быть обратим (скорее всего), а значит на него наложены серьезные ограничения.
Вот я и прошу помоши в написание эмуля так как раньше не писал. С чего начать ? Сделаю свою функцию дешифровки для сессии. Откройте для себе внимательность. И перечитайте тему с начала. З.Ы. Всем спасибо кто помогает разобратся с проблемой. Вопрос до сих пор актуален. З.Ы.Ы. IDA`e не позубам этот байт код ))