Я знаю, что правильно разобрать двоичный код COST по-прежнему остается проблемой. Но, учитывая символы и отладочную информацию, может ли дизассемблер достичь 100% -ной точности в разборке любых двоичных файлов? Если нет, я хотел бы знать, каковы неудачные случаи.Может ли дизассемблер достичь 100% -ной точности?
ответ
Потому что на некоторых платформах разборки могут не иметь только одного решения. Проверьте этот код, например:
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).
Однако на практике большинство кода создаются компиляторами, где такие неприятные трюки не могут иметь место. Таким образом, код компилятора фактически легко разбирается.