From 54be2978288db5ca9e177158f85d37d59c96b7ca Mon Sep 17 00:00:00 2001 From: hakril Date: Sat, 1 Feb 2025 11:55:49 +0100 Subject: [PATCH] Trying to improve print output when stubborn call fails --- tests/test_orpc.py | 18 ++++++++++++++++-- windows/rpc/stubborn.py | 13 ++++++++++++- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/tests/test_orpc.py b/tests/test_orpc.py index d2e36fd..f9fff60 100644 --- a/tests/test_orpc.py +++ b/tests/test_orpc.py @@ -16,7 +16,14 @@ from .pfwtest import * # A second check about in parameters can be done with put_Left / get_Left or put_Visible def test_orpc_iexplore(): iid = gdef.IWebBrowser2.IID - client, ipid = windows.rpc.stubborn.stubborn_create_instance("0002DF01-0000-0000-C000-000000000046", iid) + try: + client, ipid = windows.rpc.stubborn.stubborn_create_instance("0002DF01-0000-0000-C000-000000000046", iid) + except Exception as e: + dbginfo = getattr(e, "stubborn_info", None) + if dbginfo: + for x in dbginfo.items(): + print(x) + raise # get_FullName addrep = client.call(iid, 38, b"", ipid=ipid) @@ -45,7 +52,14 @@ def test_orpc_iexplore(): def test_orpc_network_manager(): """ORPC: Testing ORPCTHAT size using a method that takes no arguments and returns a single bytes""" iid = gdef.GUID.from_string("D0074FFD-570F-4A9B-8D69-199FDBA5723B") - client, ipid = windows.rpc.stubborn.stubborn_create_instance("A47979D2-C419-11D9-A5B4-001185AD2B89", iid) + try: + client, ipid = windows.rpc.stubborn.stubborn_create_instance("A47979D2-C419-11D9-A5B4-001185AD2B89", iid) + except Exception as e: + dbginfo = getattr(e, "stubborn_info", None) + if dbginfo: + for x in dbginfo.items(): + print(x) + raise response = client.call(iid, 17, b"", ipid=ipid) assert response[0] not in (b"\x00", 0) diff --git a/windows/rpc/stubborn.py b/windows/rpc/stubborn.py index ea377a0..30f7ffe 100644 --- a/windows/rpc/stubborn.py +++ b/windows/rpc/stubborn.py @@ -73,7 +73,18 @@ def stubborn_create_instance(clsid, iid): # Bad alignement for everythin -> Legacy resolver_info = ctypes.cast(rpiv_infoptr, gdef.PPRIV_RESOLVER_INFO_LEGACY)[0] - psa = resolver_info.OxidInfo.psa[0] # Retrieve the bidings to our COM server + try: + psa = resolver_info.OxidInfo.psa[0] # Retrieve the bidings to our COM server + except ValueError as e: + # Seen case of NULL DEREF + # Embed more value to the except for better debugging + e.stubborn_info = { + "resolver_info.OxidInfo.containerVersion.version": resolver_info.OxidInfo.containerVersion.version, + "dcomversion": (dcomversionstruct.MajorVersion, dcomversionstruct.MinorVersion), + "resolver_info": resolver_info, + } + raise + # print("psa.bidings: {0}".format(psa.bidings)) # ipidRemUnknown = resolver_info.OxidInfo.ipidRemUnknown # Useful for IRemQueryInterface