udiboy1209 commited on
Commit
a3c7b4a
·
1 Parent(s): 7e94263

Fix hacky ldrd instruction in ARM32

Browse files
Files changed (2) hide show
  1. pyproject.toml +1 -1
  2. remend/disassemble.py +11 -15
pyproject.toml CHANGED
@@ -15,7 +15,7 @@ classifiers = [
15
  requires-python = ">=3.9"
16
  dependencies = [
17
  "networkx",
18
- "capstone",
19
  "Levenshtein",
20
  "tqdm",
21
  "numpy",
 
15
  requires-python = ">=3.9"
16
  dependencies = [
17
  "networkx",
18
+ "capstone==5.0.3",
19
  "Levenshtein",
20
  "tqdm",
21
  "numpy",
remend/disassemble.py CHANGED
@@ -142,25 +142,21 @@ class DisassemblerARM32(DisassemblerBase):
142
  def check_ldrd(self, insn):
143
  if insn.id != ARM_INS_LDRD:
144
  return False
145
- ops = insn.op_str.split(", ")
146
  if len(ops) != 3:
147
  return False
148
- mem = ops[2] # format: [<reg> + #<offset>]
149
- if mem[0] != "[" or mem[-1] != "]":
150
  return False
151
- memcomps = mem[1:-1].split(" ")
152
- if memcomps[0] == "pc":
153
- base = align4(insn.address + 4)
154
- else:
155
- basereg = ARM_REG_R0 + int(memcomps[0][1:]) # Shitty hack, may malfunction
156
- if basereg not in self.reg_values:
157
- return False
158
- base = align4(self.reg_values[basereg])
159
- if len(memcomps) == 3:
160
- offset = int(memcomps[2][1:])
161
  else:
162
- offset = 0
163
- addr = base + offset
 
 
164
  fhex = self.loader.memory.load(addr, 8)
165
  fval = struct.unpack("d", fhex)[0]
166
  return fval, addr, 8
 
142
  def check_ldrd(self, insn):
143
  if insn.id != ARM_INS_LDRD:
144
  return False
145
+ ops = list(insn.operands)
146
  if len(ops) != 3:
147
  return False
148
+ if ops[2].type != ARM_OP_MEM:
 
149
  return False
150
+ mem = ops[2].value.mem
151
+ if mem.base == ARM_REG_PC:
152
+ addr = align4(insn.address + 4) + mem.disp
153
+ elif mem.base in self.reg_values:
154
+ addr = align4(self.reg_values[mem.base]) + mem.disp
 
 
 
 
 
155
  else:
156
+ return False
157
+ if addr < self.loader.min_addr or addr + 8 > self.loader.max_addr:
158
+ # Out of bounds
159
+ return False
160
  fhex = self.loader.memory.load(addr, 8)
161
  fval = struct.unpack("d", fhex)[0]
162
  return fval, addr, 8