Skip to content

Commit b56595b

Browse files
committed
Added POP intruction support to arithmetic partitioning transform.
1 parent 11fe4e7 commit b56595b

File tree

3 files changed

+27
-1
lines changed

3 files changed

+27
-1
lines changed

src/x86_64/deoptimizer.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ impl Deoptimizer {
240240
let mut decoder = Decoder::with_ip(bitness, bytes, start_addr, DecoderOptions::NONE);
241241
let replaced_bytes: Vec<u8>;
242242
if self.skipped_offsets.is_some() {
243-
replaced_bytes = self.replace_skipped_offsets(&bytes.clone(), 0x90)?;
243+
replaced_bytes = self.replace_skipped_offsets(&bytes, 0x90)?;
244244
decoder = Decoder::with_ip(bitness, &replaced_bytes, start_addr, DecoderOptions::NONE);
245245
}
246246

src/x86_64/tests.rs

+14
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,20 @@ mod tests {
536536
let mut decoder32 = Decoder::new(32, code_32, DecoderOptions::NONE);
537537
let mut inst = Instruction::default();
538538
let mut offset = 0;
539+
540+
fn convert_to_byte_value_instructions(
541+
bitness: u32,
542+
bytes: &[u8],
543+
rip: u64,
544+
) -> Result<Vec<Instruction>, DeoptimizerError> {
545+
let mut result = Vec::new();
546+
// let bytes = get_instruction_bytes(bitness, [inst].to_vec())?;
547+
for b in bytes.iter() {
548+
result.push(Instruction::with_declare_byte_1(*b));
549+
}
550+
Ok(rencode(bitness, result, rip)?)
551+
}
552+
539553
while decoder64.can_decode() {
540554
decoder64.decode_out(&mut inst);
541555
let mut dbs = convert_to_byte_value_instructions(

src/x86_64/transforms/arithmetic_partitioning.rs

+12
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,18 @@ pub fn apply_ap_transform(
2828
0,
2929
)?;
3030
}
31+
if inst.mnemonic() == Mnemonic::Pop {
32+
let mut info_factory = InstructionInfoFactory::new();
33+
let info = info_factory.info(&inst);
34+
let op0_size = get_op_size(0, inst)? * 8;
35+
let rand_reg =
36+
get_random_gp_register(bitness == 64, op0_size, Some(info.used_registers()))?;
37+
fix_inst = Instruction::with1(
38+
get_code_with_str(&format!("Xchg_rm{op0_size}_rm{op0_size}")),
39+
rand_reg,
40+
)?;
41+
return Ok(rencode(bitness, [*inst, fix_inst].to_vec(), rip)?);
42+
}
3143
if inst.mnemonic() == Mnemonic::Mov && inst.op1_kind() == OpKind::Immediate64 {
3244
set_op_immediate(inst, 1, !imm)?;
3345
fix_inst = Instruction::with1(get_code_with_str("Not_rm64"), inst.op0_register())?;

0 commit comments

Comments
 (0)