balrog.git


balrog

~ ELF file analysis tool to be used after firmware extraction
git clone https://github.com/djnnvx/balrog.git
log | files | refs | archive | README

aarch64.rs (1397B)

      1 use super::{imm, mem, reg, Kind, Op};
      2 use capstone::arch::arm64::Arm64Reg;
      3 
      4 pub const ARG_REGS: [u16; 8] = [
      5     Arm64Reg::ARM64_REG_X0 as u16,
      6     Arm64Reg::ARM64_REG_X1 as u16,
      7     Arm64Reg::ARM64_REG_X2 as u16,
      8     Arm64Reg::ARM64_REG_X3 as u16,
      9     Arm64Reg::ARM64_REG_X4 as u16,
     10     Arm64Reg::ARM64_REG_X5 as u16,
     11     Arm64Reg::ARM64_REG_X6 as u16,
     12     Arm64Reg::ARM64_REG_X7 as u16,
     13 ];
     14 
     15 pub const SP: u16 = Arm64Reg::ARM64_REG_SP as u16;
     16 
     17 pub fn decode(mnemonic: &str, o: &[Op; 3]) -> Option<Kind> {
     18     match mnemonic {
     19         "bl" => Some(Kind::Call(imm(o, 0)? as u64)),
     20         "blr" => Some(Kind::CallInd { reg: reg(o, 0)? }),
     21         "ret" => Some(Kind::Ret),
     22         "adrp" | "adr" => Some(Kind::SetConst {
     23             dst: reg(o, 0)?,
     24             val: imm(o, 1)? as u64,
     25         }),
     26         "ldr" => {
     27             let (base, disp) = mem(o, 1)?;
     28             Some(Kind::Load {
     29                 dst: reg(o, 0)?,
     30                 base,
     31                 disp,
     32             })
     33         }
     34         "add" => Some(Kind::AddImm {
     35             dst: reg(o, 0)?,
     36             base: reg(o, 1)?,
     37             imm: imm(o, 2)?,
     38         }),
     39         "sub" => Some(Kind::AddImm {
     40             dst: reg(o, 0)?,
     41             base: reg(o, 1)?,
     42             imm: -imm(o, 2)?,
     43         }),
     44         "mov" => Some(Kind::Mov {
     45             dst: reg(o, 0)?,
     46             src: reg(o, 1)?,
     47         }),
     48         _ => None,
     49     }
     50 }