· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Определение длины процедуры

Посл.отвђт Сообщенiе


Дата: Июн 21, 2004 01:34:20

Подскажите пожолуйста, каким образом можно определить длину данной процедуры(разность между адресом команды ret и адресм процедуры). Хотелось бы также узнать, как можно из массива байтов кода выделить команнды. Например, есть такая чаcть кода $A186ECFF861658, причем команды распологаются таким образом:| A1 | 86EC | FF | 861658 |.
Спаибо.


Дата: Июн 21, 2004 01:53:05 · Поправил: The Svin

1. Ты вроде сам ответил на вопрос :)
Только почему то "выкинул" в своём вычислении длину команды ret ;)
Также можно сказать что само вычисление верно (с указанной выше поправкой) только если ret была последней командой в теле процедуры.
У меня в практике часто возврат распологается где то в начале кода, чтобы была возможность в различных ситуациях переходить на него по jcc.
2. Непонятен вопрос про то "выделить команды". Зная начало кода найти адреса каждой из команд?


Дата: Июн 21, 2004 12:53:20

> Хотелось бы также узнать, как можно из массива байтов кода выделить команнды. Например, есть такая чаcть кода $A186ECFF861658, причем команды распологаются таким образом:| A1 | 86EC | FF | 861658 |.

Это называется "Мне нужен дизассемблер".


Дата: Июн 21, 2004 13:08:06

Zdesbilmax
Вобще в большинстве ассемблеров есть такая вещь, как препроцессор. Например, в фасме можно после нужной инструкции (до которой считаешь) написать:
procsize = $-MyProc и получишь нужное число.


Дата: Июн 21, 2004 13:28:00

> Вобще в большинстве ассемблеров есть такая вещь, как препроцессор.

Угу, только эта фича не всегда применима, например когда процедура находится в секции .DATA то masm, например, не может правильно высчитать ее размер.


Дата: Июн 21, 2004 16:39:44

The Svin:
Тогда возникает вопрос, как найти адрес "ret". Не факт, что просматривая байты от начала процедуры и далее
и найдя код команды ret, это будет действительно команда ret. Найденый байт может быть,например, составной
частью адреса операнда и т.д. Может я мыслю не в том направлении? За неправильное вычисление длины спасибо,
не заметил.
Dr.Golova, n0p, Asterix: Я все пишу на ObjectPascal и использую встроенный в Delphi 6 ассемблер. Насколько я понимаю,
никокой препроцессор мне не светит(я,честно говорю, смутно представляя ,что это такое и чем это запивают), но есть
мысль: пошагово выполнять некоторые части процедуры и следить за EIP. Реально ли это осуществить(может создавать
дочерний процесс, не боясь краха основного...). Я использую W2k.


Дата: Июн 21, 2004 16:52:40

Процедура своя? Ты просто хочешь узнать сколько она заняла?
Тогда просто поставь бряк в начале процедуры и запусти в дебагере (например F9 в OllyDbg) она трапанётся на начале и ты в дебагере посчитаешь разницу между адресами.
Простым просмотром значения байт ты действительно не определишь ret, всё правильно, прийдётся писать декодер, так что коротко тут не ответить :)


Дата: Июн 21, 2004 17:15:09

мысль: пошагово выполнять некоторые части процедуры и следить за EIP. Реально ли это осуществить(может создавать дочерний процесс, не боясь краха основного...). Я использую W2k.
может тебе трейсер нужен? на z0mbie.host.sk есть


Дата: Июн 21, 2004 17:16:20

Функция API, придется каждый раз ручками все делать.
Спаибо за все.


Дата: Июн 22, 2004 00:12:13

LDE-32 v1.04 -- Length-Disassembler Engine, ~29k
http://z0mbie.host.sk/lde32.zip

Делать RTFM пока не поможет.


Дата: Июн 22, 2004 01:08:52

Dr.Golova
А чё Каспер на архив(файл example1.exe) ругается то? Вряд ли вирь но всё-таки ;-)


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.086