вот решил к своей тулзе прикрутить дизасм... нашёл неск. движков.. остановился на CADT by Ms-Rem но вот в чём проблема.... имеем код (олли): Код (Text): 0040100B |. 6A 00 PUSH 0 0040100D |. E8 05000000 CALL DEBUGGER.00401017 00401012 |. 54 65 73 74 00 ASCII "Test",0 00401017 |> E8 15000000 CALL DEBUGGER.00401031 0040101C |. 44 65 62 75 67 6>ASCII "Debugger NOT pre" 0040102C |. 73 65 6E 74 00 ASCII "sent",0 00401031 |> 6A 00 PUSH 0 тут содержатся строки, соотв. если не найти их до распознования, то код будет диз. не правильно... =\ какие будут советы, как это реализовать??? (asm или дельфя)... =\
Реализовано все IDA Pro, но даже там необходимо участие человека. Один из способов реализации (который вряд ли тебе подойдет) - это запустить этот кусок кода в пошаговое отладочное выполнение, и дезасемблировать по мере выполнения кода.
Берёшь длинну инструкции, если она 5 байтная, то проверяешь её опкод на call/jmp. Если это call/jmp, то начинаешь дизасемблировать с нового адреса. Строки обойдутся сами-собой.
Строки распознавать можно по тому факту, что они состоят из определенного набора символов и заканчиваются нулем. И обычно на них идет ссылка из кода.
Ms Rem Строки распознавать можно по тому факту, что они состоят из определенного набора символов и заканчиваются нулем. Строки не только нулем оканчиваются, есть и Unicode-строки и Delphi-строки (с 1 байтовой длиной и с 2-байтовой перед самой строкой). Короче говоря, пробовать надо кучу способов, может какой и поможет на автомате строку опознать. Hellspawn Явные прыжки и вызовы конечно надо "интерпретировать" по возможности. Кстати, в одной программе редко используются строки разных видов, так что опознав одну строку корректно надо именно этот метод и применять в дальнейшем в первую очередь. Ну если никакой способ не подошел и язык программы неизвестен, тогда есть несколько полуавтоматических вариантов. Например, дизассемблирование кода "назад", вместе с таблицей "неиспользуемых" команд (привелигированные и редкие сочетания, которые не должны были бы появляться в коде, типа arpl, bound). Тогда встретив такую команду, надо искать следующую ссылку по коду, которая будет кодом с большой вероятностью, и плясать от нее назад, подбирая команды. Там проблема в том, что многие корректные команды имеют одинаковые окончания, но разную длину и непонятно какая из них реально была в коде, поэтому надо выбирать какую-нибудь стратегию, например "жадный" или "ленивый" разбор (разбор позволяющий дальше всего назад продвинуться) и подбирать команды назад до предыдущего места останова. Иногда помогает, т.к. компилеры в код пихают не только строки, но и всякую другую муть неизвестного формата. Но панацеи, разумеется нет, и для всех случаев это не поможет. Не зря же в ida есть кнопки c и d
в принципе я набросал алгоритм... мне пока хватает.. потом ещё допишу второй... смысл такой... ищу 0 потом символы в алфавите (['A..Z','a..z', и т.д.]) потом ещё 0.. это и есть строка... забиваю её в массиве нопами.. тогда дизасм всё норм делает.. =) пока всё... а в листинге по этому адрессу подставляю найденную строку... а язык прогаммирования, в принципе известен.. я определяю на чём написана прога =)
Unicode строки в большинстве случаев тоже оканчиваются нулем (не обязательно), а Delphi строки всегда оканчиваются нулем в целях совместимости.