Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Дизасемблирование (http://forum.oszone.net/showthread.php?t=171804)

Snake750 31-03-2010 16:49 1381664

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

CyberDaemon 31-03-2010 17:28 1381697

Ты хочешь исполняемый файл дизассемблировать и получить на выходе код на языке высокого уровня (Turbo Delphi)?

Snake750 31-03-2010 22:21 1381933

у меня есть открытый код, его необходимо перевести в двоичную Сс

BlackEric 31-03-2010 22:57 1381969

Цитата:

Цитата Snake750
у меня есть открытый код, его необходимо перевести в двоичную Сс »

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

Ассемблер и дизассемблирование [Пирогов] Посмотрите эту книгу, для начала.

Snake750 31-03-2010 23:26 1382003

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 1382020

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

Snake750 31-03-2010 23:44 1382027

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

BlackEric 31-03-2010 23:50 1382036

Таблицы кодов операций? Спросите у препода. Или если под Intel то возможно у них :)

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

Snake750 31-03-2010 23:53 1382039

BlackEric, хорошо, по гуглю эти таблицы. у препода их нет.Мне вообще кажется что она не совсем адекватна.

BlackEric 31-03-2010 23:58 1382041

По идее, но я не пробовал.

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

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

Snake750 01-04-2010 00:01 1382043

BlackEric, а можно поподробнее как это сделать в Турбо Делфи или Делфи 7?

BlackEric 01-04-2010 00:24 1382052

Пробую сходу.

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 1382081

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

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

// продвинутые
distorm поддержка x64
beaengine поддержка x64
udis86 поддержка x64
движок от mika0x65 поддержка x64
hde дизассемблер длин, поддержка x64.
X86IME ассемблирование инструкций, поддержка x64
X86IME patch to compile in UNIX by nibble
pvdasm

// устаревшие
catchy32
cadt (masm 1.1 version by cyberdoomsystems)

[cadt c version]
cadt.h
cadt.c

disit

BlackEric 01-04-2010 00:54 1382083

Вложений: 1
Или же еще проще. Через PE Explorer. Дизассемблируем получившийся exeшник и в окошке видим

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

DillerInc 01-04-2010 01:11 1382103

BlackEric, вы видимо не до конца понимаете, что есть дизассемблирование.

Snake750 01-04-2010 01:45 1382122

DillerInc, вы правы. мне нужно получить именно то что вы сказали

CyberDaemon 01-04-2010 09:44 1382261

Цитата:

Цитата BlackEric
Или же еще проще. Через PE Explorer »

Такую тривиальную задачу можно старым добрым debug'ом решить :)
Код:

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

И получим как раз тот код, что в методичке:
Цитата:

Цитата Snake750
Исключаяя пояснительные обозначения, получим окончательный вид команды: 1011 000 00011101 00000000 (2)= B8 1D 00(16) »

Только если надо перевести небольшой отрывок кода на ASMе в машинный (бинарный) код, то готовое решение не прокатит - нужно же будет обьяснить, почему mov ax,1d это именно B8 1D 00

Или же Snake750, сам не знает, что ему нужно. В приведенной выдержке из
Цитата:

Цитата 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 1382286

DillerInc, можно подробнее? Что не так?

DillerInc 01-04-2010 12:56 1382401

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

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

...никто не отменял использование 16-битных регистров в 32-битных программах.

CyberDaemon 01-04-2010 13:57 1382442

Цитата:

Цитата DillerInc
мы сможем проанализировать поля возвращённой структуры и понять суть команды ровно как и составить её мнемонику »

В отрыве от контекста ничего мы не сможем понять.
В 16-ричнойразрядной среде эта последовательность совсем по другому смотрится.
Цитата:

Цитата DillerInc
Просто я думаю, что препод не настолько глуп, чтобы давать такую грошевую задачу как банальный вывод бинарного вида команды. »

Зависит от предмета.
Надо бы, для начала, все задание увидеть.
Правда, есть вероятность, что преподаватель эту ветку тоже прочтет :)

BlackEric 01-04-2010 14:07 1382452

DillerInc, я все это понимаю. Просто я сходу предложил автору пришедший мне в голову вариант автоматизированного решения:
1. скомпилировать имеющююся программу на ассемблере, что бы получить требуемый двоичный код
2. найти нужное место в полученном exe файле и забрать оттуда бинарные команды.
Насколько я понимаю, мое решение шаблон моего решения полностью соответствует задаче автра темы.

DillerInc 01-04-2010 14:50 1382483

Цитата:

Цитата CyberDaemon
В отрыве от контекста ничего мы не сможем понять »

...причём здесь в данном случае контекст?
Например, команда - mov esi, dword ptr [00A8681C] - скопирует DWORD по адресу 00A8681Ch в регистр ESI.Это нам и необходимо узнать.Какое значение она скопирует и какое значение будет находится в ESI в текущий момент времени - это уже совсем другая история.
Цитата:

Цитата CyberDaemon
В 16-ричной среде эта последовательность совсем по другому смотрится »

...не понял. О чём вы?

CyberDaemon 01-04-2010 15:20 1382506

DillerInc, пардон, 16-разрядной (16-битной). Вот та-же самая последовательность:
Код:

8B35          MOV    SI,[DI]
1C68          SBB    AL,68
A800          TEST    AL,00


Snake750 01-04-2010 15:22 1382509

Цитата:

Цитата CyberDaemon
Или же Snake750, сам не знает, что ему нужно. В приведенной выдержке из »

Я знаю что мне нужно. Со слов преподавателя лабораторная работа называется "дизасемблирование".
Есть ассемблерные команды из них необходимо получить машинный код. Лабу сегодня сдал, нашел норм методичку у другого препода с человеческим описанием. Вам спасибо за помошь

CyberDaemon 01-04-2010 15:38 1382521

Цитата:

Цитата Snake750
Со слов преподавателя лабораторная работа называется "дизасемблирование".
Есть ассемблерные команды из них необходимо получить машинный код. »

Значит, тебя дезинформировали :)
Цитата:

Цитата Википедия
Дизассе́мблер — транслятор, преобразующий машинный код, объектный файл или библиотечные модули в текст программы на языке ассемблера

Т.е. из "B8 1D 00" получить ассемблерную команду "mov ax,1d" - это дизассемблировать.

Snake750 01-04-2010 15:48 1382531

CyberDaemon, да я догадовался что она сама мало понимает о чем говорит. нашел сегодня методичку, в которой есть таблицы и примеры нормальные. на все ушло минут 25-30.


Время: 05:14.

Время: 05:14.
© OSzone.net 2001-