Как использовать iced-x86 от Rust для генерации кодов операций из строки инструкций

#assembly #rust #disassembly

#сборка #Ржавчина #разборка

Вопрос:

Я новичок в Rust, и я возился с iced библиотекой, чтобы разобрать материал, и это чрезвычайно полезно.

Чего я, похоже, не могу понять, так это как использовать Encoder для генерации кодов операций из строки, а не Instruction структуры.

Насколько я могу судить, iced-x86 документация этого не описывает.

Согласно документации: The encoder can be used to re-encode decoded instructions at any address — ничего не говорится о кодировании инструкций из строки

Это то, чего я в основном пытаюсь достичь:

 use iced_x86::*;

let instr = "xchg ah,[rdx rsi 16h]";

let mut encoder = Encoder::new(64);
match encoder.encode(amp;instr, 0x5555_5555) {
    Ok(len) => assert_eq!(4, len),
    Err(err) => panic!("{}", err),
}
// We're done, take ownership of the buffer
let buffer = encoder.take_buffer();
assert_eq!(vec![0x86, 0x64, 0x32, 0x16], buffer);
  

Комментарии:

1. Документ не описывает это, потому что такой функции нет .

2. Да, я видел эту проблему, мне было интересно, есть ли обходной путь

3. Нет, конечно, нет. Отсутствует целая функция 🙂 Но, конечно, существуют другие библиотеки ассемблера, которые поддерживают сборку из строки в двоичный буфер. Затем вы могли бы декодировать буфер. Конечно, это халтурно и расточительно.