set *(unsigned short*)0x4005a5 = 0x8e0f
2 проблемы, я думаю:
set *0x4005a5 = 0x7e
вероятно, по умолчанию используется хранилище мечей, записывающее 4 байта вместо 1.
- И вы неправильно указали код операции двумя разными способами: короткая и ближняя, а затем проблема с порядком байтов для ближней.
Да, в оригинальной инструкции используется кодировка Near (jcc rel32
) , где код операции равен 2 байта 0f 8f
. Вы можете сказать, потому что полная инструкция имеет длину 6 байтов вместо 2 и начинается с 0f
(так что это не однобайтовый код операции.)
Вы заменяете его однобайтовым Short jle rel8
, поэтому второй байт кода операции становится rel8.
(Оригинальный 8086 имеет только jcc rel8
для условных переходов, только с безусловными переходами, такими как jmp
, с кодировкой rel8 и rel16; где-то между 186 и 386 было добавлено кодирование jcc rel16/rel32
.)
Ваша попытка установить 0x0f8e
имеет проблему с порядком байтов. x86 является прямым порядком байтов, поэтому опкод jle
0F 8E
как порядковый номер unsigned short
имеет значение 0x8e0f
.
8E
- это код операции для mov Sreg, r/m16
, поэтому 0x0f8e
(8E 0F
) будет декодироваться как mov к сегменту reg, с 0F
в качестве байта ModR / M. Используйте GDB, чтобы разобрать инструкцию после ее изменения.
Используйте GDB's disas /r
для разборки с необработанным гексом и мнемоникой.