2016-12-08 6 views
0

Я знаю, что правильно разобрать двоичный код COST по-прежнему остается проблемой. Но, учитывая символы и отладочную информацию, может ли дизассемблер достичь 100% -ной точности в разборке любых двоичных файлов? Если нет, я хотел бы знать, каковы неудачные случаи.Может ли дизассемблер достичь 100% -ной точности?

ответ

0

Потому что на некоторых платформах разборки могут не иметь только одного решения. Проверьте этот код, например:

mov rax, 0x1111111111E8 
call get_eip 
get_eip: 
pop rax 
sub rax, 13 
jmp rax 

Собранным в следующем:

48 B8 E8 11 11 11 11 11 00 00 E8 00 00 00 00 58 48 2D 0D 00 00 00 FF E0 

jmp rax будет фактически перейти к середине mov rax, 0x1111111111E8 опкода, в частности, к байтам: E8 11 11 11 11, которые образуют действительные относительный код вызова вызова.

Итак, как вы разбираете вышеуказанный двоичный код? :)

На других платформах (например, ARM) значение или eip (pc на ARM) определяют архитектуру. На некотором ARM с, с LSB из PC на том, что вы используете thumb режим (другой набор команд), в то время как коды операций всегда 4 байта (по aarch64. В ARMv7 они имеют 4 байта в обычном режиме и 2 байтов на thumb режиме iirc).

Однако на практике большинство кода создаются компиляторами, где такие неприятные трюки не могут иметь место. Таким образом, код компилятора фактически легко разбирается.