From 4767bbeb134295d99cb31724343426a210b70b10 Mon Sep 17 00:00:00 2001 From: chinggg <24590067+chinggg@users.noreply.github.com> Date: Sat, 3 Sep 2022 12:54:57 +0800 Subject: [PATCH 1/2] fix(r2): skip ill instruction in disassembler in addition to 'invalid' instruction --- qiling/extensions/r2/r2.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qiling/extensions/r2/r2.py b/qiling/extensions/r2/r2.py index 13a655b2f..9ec2ba4ae 100644 --- a/qiling/extensions/r2/r2.py +++ b/qiling/extensions/r2/r2.py @@ -279,7 +279,7 @@ def disassembler(self, ql: 'Qiling', addr: int, size: int, filt: Pattern[str]=No anibbles = ql.arch.bits // 4 progress = 0 for inst in self.dis_nbytes(addr, size): - if inst.type.lower() == 'invalid': + if inst.type.lower() in ('invalid', 'ill'): break # stop disasm name, offset = self.at(inst.offset, parse=True) if filt is None or filt.search(name): From 0021e79b236f092b0c55bc2d7952c15b6f5cfc05 Mon Sep 17 00:00:00 2001 From: chinggg <24590067+chinggg@users.noreply.github.com> Date: Thu, 12 Oct 2023 16:11:50 +0800 Subject: [PATCH 2/2] test: QL_VERBOSE.DISASM implicitly uses r2.disassembler see https://github.com/qilingframework/qiling/issues/1396 --- tests/test_r2.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/tests/test_r2.py b/tests/test_r2.py index 4009c2f59..1d27891e8 100644 --- a/tests/test_r2.py +++ b/tests/test_r2.py @@ -1,12 +1,14 @@ #!/usr/bin/env python3 import unittest +from io import StringIO import sys sys.path.append("..") from qiling import Qiling -from qiling.const import QL_ARCH, QL_VERBOSE +from qiling.const import QL_ARCH, QL_INTERCEPT, QL_OS, QL_VERBOSE +from tests.test_shellcode import ARM64_LIN, graceful_execve try: from qiling.extensions.r2.r2 import R2 @@ -59,6 +61,20 @@ def test_addr_flag(self): print(r2.where('main')) self.assertEqual(r2.at(r2.where('main')), 'main') + def test_disasm_monkeypatch(self): + # QlArchUtils.setup_output(QL_VERBOSE.DISASM) implicitly uses r2.disassembler if available + # see https://github.com/qilingframework/qiling/issues/1396 + ql = Qiling(code=ARM64_LIN, archtype=QL_ARCH.ARM64, ostype=QL_OS.LINUX, verbose=QL_VERBOSE.DISASM) + ql.os.set_syscall('execve', graceful_execve, QL_INTERCEPT.EXIT) + + # store ql log output in a string + ql_log = StringIO() + ql.log.handlers[0].setStream(ql_log) + ql.run() + + ql_log_str = ql_log.getvalue() + self.assertFalse('invalid' in ql_log_str) + self.assertTrue('adr x1, #0x11ff058' in ql_log_str) if __name__ == "__main__": unittest.main()