A human-friendly monkey patch of QlArchUtils.disassembler powered by r2, can be used for hook_code :param ql: Qiling instance :param addr: start address for disassembly :param size: size in bytes :param filt: regex pattern to filter instructions
(self, ql: 'Qiling', addr: int, size: int, filt: Pattern[str]=None)
| 268 | return insts |
| 269 | |
| 270 | def disassembler(self, ql: 'Qiling', addr: int, size: int, filt: Pattern[str]=None) -> int: |
| 271 | '''A human-friendly monkey patch of QlArchUtils.disassembler powered by r2, can be used for hook_code |
| 272 | :param ql: Qiling instance |
| 273 | :param addr: start address for disassembly |
| 274 | :param size: size in bytes |
| 275 | :param filt: regex pattern to filter instructions |
| 276 | :return: progress of dissembler, should be equal to size if success |
| 277 | ''' |
| 278 | anibbles = ql.arch.bits // 4 |
| 279 | progress = 0 |
| 280 | for inst in self.dis_nbytes(addr, size): |
| 281 | if inst.type.lower() in ('invalid', 'ill'): |
| 282 | break # stop disasm |
| 283 | name, offset = self.at(inst.offset, parse=True) |
| 284 | if filt is None or filt.search(name): |
| 285 | ql.log.info(f'{inst.offset:0{anibbles}x} [{name:20s} + {offset:#08x}] {inst.bytes.hex(" "):20s} {inst.disasm}') |
| 286 | progress = inst.offset + inst.size - addr |
| 287 | if progress < size: |
| 288 | ql.arch.utils.disassembler(ql, addr + progress, size - progress) |
| 289 | return progress |
| 290 | |
| 291 | def enable_disasm(self, filt_str: str=''): |
| 292 | filt = re.compile(filt_str) |
nothing calls this directly
no test coverage detected