Войти

Показать полную графическую версию : [решено] Дизасемблирование


Страниц : [1] 2

Snake750
31-03-2010, 16:49
Доброго времени суток. Интересует дизасемблирование. Подскажите пожалуйста какую нибудь понятную литературку( лучше чтобы это была небольшая статья на каком нить сайте) по дизасемблированию. В википедии вычитал что оно бывает автоматическое. Это значит что есть программы которые сами производят процесс дизасемблирования? Интересует дизасемблирование не огромных программ а простеньких состоящих в основном из арифметических команд, и команд пересылки( лабораторные работы). Код программ не более 12 строк. Программирование происходит в среде Турбо Делфи (asm.... end;) Спасибо:)

CyberDaemon
31-03-2010, 17:28
Ты хочешь исполняемый файл дизассемблировать и получить на выходе код на языке высокого уровня (Turbo Delphi)?

Snake750
31-03-2010, 22:21
у меня есть открытый код, его необходимо перевести в двоичную Сс

BlackEric
31-03-2010, 22:57
у меня есть открытый код, его необходимо перевести в двоичную Сс »

Это как? Скомпилировать?

Ассемблер и дизассемблирование [Пирогов] (http://samouchka.net/2006/12/19/assembler_i_dizassemblirovanie.html) Посмотрите эту книгу, для начала.

Snake750
31-03-2010, 23:26
BlackEric, если бы я сам понимал. Преподаватель выдал лабораторную работу, надо сделать. процитирую небольшой отрывок из описания к данной работе
mov ax, 29;
КОП данной команды = 1011(2)
Ее формат :КОПregB1B2, где В1, В2- младший и возможный старшый биты пересылаемого кода. В рассматриваемом случае код числа 29=11101(10)=1D(16) нужно записать в двухбайтовый регистр ax, следовательно параметр W должен быть равен 1. Это влечет за собой включение в команду кода непосредственного данного, занимающего два дополнительных байта 00 1D(16). По табл 3 находим код регистра ах. Таким образом искомая машинная команда должна иметь вид
КОП=1011W=1reg=000
B1 =00011101
B2=00000000.
Исключаяя пояснительные обозначения, получим окончательный вид команды: 1011 000 00011101 00000000 (2)= B8 1D 00(16)
Вот как то так.мне необходимо таким образом перевести небольшую программу. вот и интересуюсь если ли программы которые делают это автоматически, или нормальная простенькая литературка.

BlackEric
31-03-2010, 23:39
Если я правильно понял задание, то вам нужно не дизассемблировать программу, а наоборот _вручную_ перегнать имеющийся текст программы (на ассемблере?) в машинные коды.
Когда то на лабе под какой-то контроллер такое делали. Там были какие-то таблицы и по ним транслировали ассемблерные команды в машинный код. Т.е. берите таблицы и по описанию из методы.
А автоматически это делает компилятор :)

Snake750
31-03-2010, 23:44
BlackEric, вы правильно поняли. есть команды ассемблера а из них необходимо получить , как я понял, либо двоинчные коды или шестнадцатиричные. Есть ли какая нибудь программа которая это делает? Где можно взять эти таблицы, потому что в своей методе я не наблюдаю

BlackEric
31-03-2010, 23:50
Таблицы кодов операций? Спросите у препода. Или если под Intel то возможно у них :)

Эта программа - компилятор. Он перегонит в бинарный вид исходник вашей процедуры. Но вам это не поможет. Мы делали вручную там не так сложно как кажется.

Snake750
31-03-2010, 23:53
BlackEric, хорошо, по гуглю эти таблицы. у препода их нет.Мне вообще кажется что она не совсем адекватна.

BlackEric
31-03-2010, 23:58
По идее, но я не пробовал.

Если у вас как я понял есть ассемблерный кусок кода в делфе в процедуре вида
asm
....
end;
то если его скомпилить выключив всевозможную оптимизацию и потом открыть в WinHex получившийся exeшник то в каком-то месте будет то что нужно в машинных кодах.

Но это только идея!

Snake750
01-04-2010, 00:01
BlackEric, а можно поподробнее как это сделать в Турбо Делфи или Делфи 7?

BlackEric
01-04-2010, 00:24
Пробую сходу.

1. От вас хотят работу с 16 битными регистрами. Делфи же 32х. Возможно он не позволит.

Но попробуем.

У меня bds 2006.
Создаю консольное приложение


program asmtest;

{$APPTYPE CONSOLE}

//uses
// SysUtils;

begin
asm
mov eax, $1D1D;
add eax, $1D10;
end;
end.
Скомпилили.
Открываем exeшник WinHexом.
И ищем в нем HexValue 1D1D.
Находим одно единственное вхождение:
По offset 11952 есть строка: B8 1D 1D 00 00 05 10 1D 00 00 E8....
Я так понимаю, но не уверен, что это и есть то, что нас интересует.

Пробуйте! И отпишитесь о результате. Очень интересно, что получится.

DillerInc
01-04-2010, 00:52
По-моему, вы что-то не то делаете.
Вам скорее всего нужно именно дизассемблировать команды вашей программы(скомпилированной), чтобы далее можно было разложить коды команд на составляющие.
Для этого берёте какой-нибудь CADt by Ms-Rem, далее изучаете формат машинных команд по книге Юрова и начинаете дизассемблировать свою программку.Тогда вы будете выделять из кода т.н. КОП, флаг направления передачи данных, размер этих данных, байт mod r/m, смещение, непосредственный операнд и т.д.

За список дизасм-движков благодарю HandMill'а:

// продвинутые
distorm (http://ragestorm.net/distorm) поддержка x64
beaengine (http://www.beaengine.org/) поддержка x64
udis86 (http://udis86.sourceforge.net/) поддержка x64
движок от mika0x65 (http://mika0x65.livejournal.com/) поддержка x64
hde (http://patkov-site.narod.ru/) дизассемблер длин, поддержка x64.
X86IME (http://sites.google.com/site/x86pfxlab/projects) ассемблирование инструкций, поддержка x64
X86IME (http://nibble.develsec.org/get/x86im-1.0b.tar.gz) patch to compile in UNIX by nibble
pvdasm (http://pvdasm.reverse-engineering.net/)

// устаревшие
catchy32 (http://vx.netlux.org/vx.php?id=ec11)
cadt (http://cyberdoomsystems.narod.ru/CDS/cadt_masm32_fix.rar) (masm 1.1 version by cyberdoomsystems)

[cadt c version]
cadt.h (http://code.google.com/p/ngdbg/source/browse/trunk/Disasm.h)
cadt.c (http://code.google.com/p/ngdbg/source/browse/trunk/Disasm.c)

disit (http://www.piotrbania.com/all/disit)

BlackEric
01-04-2010, 00:54
Или же еще проще. Через PE Explorer. Дизассемблируем получившийся exeшник и в окошке видим

B81D1D0000 mov eax,00001D1Dh, где левая часть выражения, то что нам нужно
http://forum.oszone.net/attachment.php?attachmentid=42432&stc=1&d=1270068897

DillerInc
01-04-2010, 01:11
BlackEric, вы видимо не до конца понимаете, что есть дизассемблирование.

Snake750
01-04-2010, 01:45
DillerInc, вы правы. мне нужно получить именно то что вы сказали

CyberDaemon
01-04-2010, 09:44
Или же еще проще. Через PE Explorer »
Такую тривиальную задачу можно старым добрым debug'ом решить :)

C:\>debug
-a
13DC:0100 mov ax,1d
13DC:0103
-d 100 102
13DC:0100 B8 1D 00 ...

И получим как раз тот код, что в методичке:
Исключаяя пояснительные обозначения, получим окончательный вид команды: 1011 000 00011101 00000000 (2)= B8 1D 00(16) »
Только если надо перевести небольшой отрывок кода на ASMе в машинный (бинарный) код, то готовое решение не прокатит - нужно же будет обьяснить, почему mov ax,1d это именно B8 1D 00

Или же Snake750, сам не знает, что ему нужно. В приведенной выдержке из описания к данной работе » описан процесс ассемблирования. Дизассемблирование - это получение из машинного кода "B8 1D 00" ассемблерной команды "mov ax,1d"

хе-хе:

C:\>debug
-e 100
13DC:0100 00.b8 00.1d 00.00
-u 100
13DC:0100 B81D00 MOV AX,001D

BlackEric
01-04-2010, 10:32
DillerInc, можно подробнее? Что не так?

DillerInc
01-04-2010, 12:56
BlackEric, дизассемблирование - это в первую очередь разложение бинарного вида команды на составляющие(писал об этом выше).
Например, какой нам толк от последовательности следующих байт: 8Bh 35h 1Ch 68h 0A8h 00 ?
А скормив указатель на эту последовательность тому же CADt, мы сможем проанализировать поля возвращённой структуры и понять суть команды ровно как и составить её мнемонику:
mov esi, dword ptr [00A8681C]
Просто я думаю, что препод не настолько глуп, чтобы давать такую грошевую задачу как банальный вывод бинарного вида команды.
От вас хотят работу с 16 битными регистрами. Делфи же 32х. Возможно он не позволит. »
...никто не отменял использование 16-битных регистров в 32-битных программах.

CyberDaemon
01-04-2010, 13:57
мы сможем проанализировать поля возвращённой структуры и понять суть команды ровно как и составить её мнемонику »
В отрыве от контекста ничего мы не сможем понять.
В 16-ричнойразрядной среде эта последовательность совсем по другому смотрится.
Просто я думаю, что препод не настолько глуп, чтобы давать такую грошевую задачу как банальный вывод бинарного вида команды. »
Зависит от предмета.
Надо бы, для начала, все задание увидеть.
Правда, есть вероятность, что преподаватель эту ветку тоже прочтет :)




© OSzone.net 2001-2012