From a42fb8d5949eb91cfaa72885a915a02c2b011f1e Mon Sep 17 00:00:00 2001 From: xorhex Date: Wed, 10 Jul 2024 10:07:21 -0400 Subject: [PATCH 1/2] Fix for running Qiling inside of IDAPython interpreter. --- qiling/os/os.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/qiling/os/os.py b/qiling/os/os.py index 7982fe946..9178321e2 100644 --- a/qiling/os/os.py +++ b/qiling/os/os.py @@ -60,7 +60,15 @@ def __init__(self, ql: Qiling, resolvers: Mapping[Any, Resolver] = {}): # for the standard streams which usually do not support certain operations, # such as fileno(). here we use this to determine how we are going to use # the environment standard streams - sys.stdin.fileno() + + # IDAPython returns True for stdin but False for stdout and stderr so checking + # all three + if not hasattr(sys.stdin, "fileno"): + raise UnsupportedOperation + if not hasattr(sys.stdout, "fileno"): + raise UnsupportedOperation + if not hasattr(sys.stderr, "fileno"): + raise UnsupportedOperation except UnsupportedOperation: # Qiling is used on an interactive shell or embedded python interpreter. # if the internal stream buffer is accessible, we should use it From b5130746700f84b06a4ed98a7bd24f5f44f91d17 Mon Sep 17 00:00:00 2001 From: xorhex Date: Tue, 16 Jul 2024 09:18:30 -0400 Subject: [PATCH 2/2] Catching AttributeError versus redirecting it to UnsupportedOperation --- qiling/os/os.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/qiling/os/os.py b/qiling/os/os.py index 9178321e2..9108f7024 100644 --- a/qiling/os/os.py +++ b/qiling/os/os.py @@ -60,16 +60,13 @@ def __init__(self, ql: Qiling, resolvers: Mapping[Any, Resolver] = {}): # for the standard streams which usually do not support certain operations, # such as fileno(). here we use this to determine how we are going to use # the environment standard streams - + # IDAPython returns True for stdin but False for stdout and stderr so checking # all three - if not hasattr(sys.stdin, "fileno"): - raise UnsupportedOperation - if not hasattr(sys.stdout, "fileno"): - raise UnsupportedOperation - if not hasattr(sys.stderr, "fileno"): - raise UnsupportedOperation - except UnsupportedOperation: + sys.stdin.fileno() + sys.stdout.fileno() + sys.stderr.fileno() + except (UnsupportedOperation, AttributeError): # Qiling is used on an interactive shell or embedded python interpreter. # if the internal stream buffer is accessible, we should use it self._stdin = getattr(sys.stdin, 'buffer', sys.stdin)