Сколько раз видел как ИДА неправильно определяет конец у процедур/функций. Используя при этом какие то странные алгоритмы, трассирует стэк. Счас затестил свой алгоритм, вроде все работает. Для начала получаем адрес функции (либо это точка входа, либо вызов другого call ) и заносим его в очередь инструкций. Это и есть начало фунции. Алгоритм дизасма функции: 1. Извлекаем из очереди инструкций адрес, дизасмим. 2. Если это call, заносим адрес в очередь функций. 3. Если это условный переход, заним адрес перехода в очередь инструкций. 4. Если это не безусловный переход заносим последующий адрес в очередь инструкций. 5. Если очередь инструкций пуста выходим. За конец функции считаем самый дальний адрес в очереди инструкций. Все отлично работает кроме функций переходников состоящих только из безусловного перехода. И конструкций вида: call som_addr; jmp ops call [ebx+4] ops: (редко но встречается) В чем еще могут быть недостатки алгоритма ? Или мож ну других процах могут быть заморочки ?
Да, я уже и СДК выкачал, и даже иду немного пореверсил. Переписать иду будет сложно, но вот написать плагин разбирающий проги так будет реально. Там есть процедурки позволяющие на это воздействовать. Пока ищю недостатки. Ведь не зря Ильфак не пошел по этому пути.
Ее огромный плюс - инерактивность. Фсе можно пофиксить движением мышки. И как задать диапазон функции я знаю. И как поставить галочку чтоб не дизасмить после jmp, тож знаю. Интересует работоспособность алгоритма. Я спецом не давал командам названия, интересно будет ли он живуч на других процессорах (Ида то не только х86 могет дизасмить). И мож есть другие ситуации когда он не справиться. (Не процедурное программирование на асме не интересует)