Merge pull request #1397 from chinggg/fix-r2

Fix r2 disassembler invalid instruction and add test
This commit is contained in:
xwings
2023-10-15 20:48:50 -05:00
committed by GitHub
2 changed files with 18 additions and 2 deletions
+1 -1
View File
@@ -279,7 +279,7 @@ class R2:
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):
+17 -1
View File
@@ -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 @@ class R2Test(unittest.TestCase):
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()