Существует ли более или менее надежный способ определить, являются ли данные в каком-либо месте в памяти началом инструкции процессора или какими-то другими данными?
Например, E8 3F BD 6A 00
может быть call
инструкцией (E8
) с относительным смещением 0x6ABD3F
, или это может быть три байта данных, принадлежащих какой-либо другой инструкции, за которыми следует push 0
(* 1008) *).
Я знаю, что вопрос звучит глупо, и, вероятно, не существует простого способа, но, возможно, набор инструкций был разработан с учетом этой проблемы, и, возможно, некоторый простой код, исследующий + -100 байт вокруг местоположения, может дать ответ, который, скорее всего, правильный .
Я хочу знать это, потому что я сканирую код программы и заменяю все вызовы какой-либо функции вызовами моей замены. Это работает так далеко, но не исключено, что в какой-то момент, когда я увеличу количество заменяемых функций, некоторые данные будут выглядеть точно так же, как вызов функции по этому точному адресу, и будут заменены, и это заставит программу перерыв самым неожиданным образом. Я хочу уменьшить вероятность этого.