Skip to content

Emulator rewrite for ghidra 12.1 + client service tracing + refactor of ipc database + interface hashing#98

Open
borntohonk wants to merge 3 commits into
Adubbz:masterfrom
borntohonk:master
Open

Emulator rewrite for ghidra 12.1 + client service tracing + refactor of ipc database + interface hashing#98
borntohonk wants to merge 3 commits into
Adubbz:masterfrom
borntohonk:master

Conversation

@borntohonk

@borntohonk borntohonk commented Jun 14, 2026

Copy link
Copy Markdown
Contributor

changes:

  • rewrites the emulator for deprecation/removal notices for ghidra 12.1
  • add clientside service tracing ( this is not perfect, but it captures what commands it can prove - algorithm can likely be tweaked a tiny bit to discover more than what currently is mapped - best case example is qlaunch / sdk nso from games/game updates )
  • refactors the ipc database to be in emitted/discovered order, which allows interface name to be attributed to the discovered order, keyed by their program
  • adds a interface hash database, which allows for attributing interface names by hash
  • adds a swipc comparison script
  • add several ghidra scripts for -postScript usage headless analyzer;

example usage of one of them, processes all files inside of the project and exports their json formatted outputs of ipc interfaces and commands:

of a new projtect with a folder of sysmodules/.nso and .kips in a folder (note: this includes full analysis of the files, which takes longer time)

all the applets (about 21 different ones) from firmware version 22.1.0 on a 6c/12t amd 5600x processor takes about 1 hour and 32 minutes;
all the sysmodules/.nso and .ips from firmware version 22.1.0 on a 6c/12t amd 5600x processor takes about 1 hour and 2 minutes;

combined it takes about 2 hours and 34 minutes to process applets + sysmodules & kips, but provides the export, and of course every program analyzed and labelled if you open the GUI side of ghidra, alongside the json export of every ipc call (similar to how ninupdates/swipc_server_modern does it)

C:\ghidra\ghidra_12.1_PUBLIC\support\analyzeHeadless.bat "C:\Users\borntohonk" yourprojectname -postScript EnableSwitchIpcJsonExport.java "C:\Users\borntohonk\json_exports" -import "C:\Users\borntohonk\folder_with_sysmodules" -log "C:\Users\borntohonk\output.log"

of an existing project (note this assumes the project contains analyzed files, and skips that analysis process to save time, 6 minutes at most for the largest program, "NS" :

"C:\ghidra\ghidra_12.1_PUBLIC\support\analyzeHeadless.bat" "C:\Users\borntohonk" yourprojectname -postScript EnableSwitchIpcJsonExport.java "C:\Users\borntohonk\json_exports" -process "*" -recursive -log "C:\Users\borntohonk\output.log" -noanalysis

example output of processing the 22.5.0 firmware files:
https://github.com/borntohonk/Switch-Ghidra-Guides/tree/master/ipc_json_dumps/22.5.0
( also have an output of a 22.2.0 sdk nso0 sourced in Satryn DX[01001F701F7C2800][v196608] )
( https://github.com/borntohonk/Switch-Ghidra-Guides/blob/master/ipc_json_dumps/sdk_22.2.0.json )

example output of clientside service import from NS (largest program), from the .json export feature:

    "_services": ["acc:e", "acc:su", "acc:u0", "acc:u1", "aoc:u", "arp:r", "arp:w", "bcat:a", "bcat:m", "bcat:s", "bcat:u", "bgtc:t", "caps:c", "caps:dc", "csrng", "dauth:0", "dtlman", "erpt:c", "fatal:u", "friend:a", "friend:m", "friend:s", "friend:u", "friend:v", "fsp-srv", "hid:sys", "ins:s", "ldn:s", "ndrm:la", "ndrm:lu", "nifm:a", "nifm:s", "nifm:u", "nim:shp", "notif:s", "npns:s", "ns:am2", "ns:dev", "ns:ec", "ns:rid", "ns:ro", "ns:rt", "ns:su", "ns:vm", "ns:web", "nsd:a", "nsd:u", "nxeshop", "olsc:s", "ovln:snd", "pctl:a", "pctl:r", "pctl:s", "pdm:ntfy", "pm:bm", "pm:info", "psc:m", "set:sys", "srepo:a", "srepo:u", "time:a", "time:r", "time:s", "time:su", "time:u"],
    "_invokes": {
      "bcat:a": {
        "interface": "nn::bcat::ipc::IServiceCreator",
        "commands": {
          "8": { "vt_off": "0x68", "stub": "0x710004f1d0", "cmd_proof_offset": "0x710004f20c", "cmd_proof_instruction": "mov w3,#0x8", "cmd_hex_and_dec": "0x8 / 8", "calls": ["0x710022fb3c"] }
        }
      },
      "bcat:m": {
        "interface": "nn::bcat::ipc::IServiceCreator",
        "commands": {
          "8": { "vt_off": "0x68", "stub": "0x710004f1d0", "cmd_proof_offset": "0x710004f20c", "cmd_proof_instruction": "mov w3,#0x8", "cmd_hex_and_dec": "0x8 / 8", "calls": ["0x710022fb3c"] }
        }
      },
      "bcat:s": {
        "interface": "nn::bcat::ipc::IServiceCreator",
        "commands": {
          "8": { "vt_off": "0x68", "stub": "0x710004f1d0", "cmd_proof_offset": "0x710004f20c", "cmd_proof_instruction": "mov w3,#0x8", "cmd_hex_and_dec": "0x8 / 8", "calls": ["0x710022fb3c"] }
        }
      },
      "bcat:u": {
        "interface": "nn::bcat::ipc::IServiceCreator",
        "commands": {
          "8": { "vt_off": "0x68", "stub": "0x710004f1d0", "cmd_proof_offset": "0x710004f20c", "cmd_proof_instruction": "mov w3,#0x8", "cmd_hex_and_dec": "0x8 / 8", "calls": ["0x710022fb3c"] }
        }
      },
      "bgtc:t": {
        "interface": "nn::bgtc::ITaskServiceRoot",
        "commands": {
          "0": { "vt_off": "0x20", "stub": "0x71001ba800", "cmd_proof_offset": "0x71001ba828", "cmd_proof_instruction": "mov w1,wzr", "cmd_hex_and_dec": "0x0 / 0", "calls": ["0x71001b9fc4"] }
        }
      },
      "csrng": {
        "interface": "nn::spl::detail::IRandomInterface",
        "commands": {
          "0": { "name": "GenerateRandomBytes", "vt_off": "0x20", "stub": "0x7100065610", "cmd_proof_offset": "0x7100065618", "cmd_proof_instruction": "mov w3,wzr", "cmd_hex_and_dec": "0x0 / 0", "calls": ["0x710006553c"] }
        }
      },
      "fatal:u": {
        "interface": "nn::fatalsrv::IService",
        "commands": {
          "2": { "name": "ThrowFatalWithCpuContext", "vt_off": "0x30", "stub": "0x7100065b70", "cmd_proof_offset": "0x7100065b80", "cmd_proof_instruction": "mov w6,#0x2", "cmd_hex_and_dec": "0x2 / 2", "calls": ["0x7100065860"] }
        }
      },
      "fsp-srv": {
        "interface": "nn::fssrv::sf::IFileSystemProxy",
        "commands": {
          "10": { "name": "OpenFileSystemWithId", "vt_off": "0x48", "stub": "0x71000051a0", "cmd_proof_offset": "0x7100005218", "cmd_proof_instruction": "mov w7,#0xa", "cmd_hex_and_dec": "0xa / 10", "calls": ["0x710001deb8", "0x7100022b90", "0x7100023004"] },
          "12": { "name": "OpenBisStorage", "vt_off": "0x58", "stub": "0x7100005320", "cmd_proof_offset": "0x7100005374", "cmd_proof_instruction": "mov w3,#0xc", "cmd_hex_and_dec": "0xc / 12", "calls": ["0x7100023198"] },
          "18": { "name": "OpenSdCardFileSystem", "vt_off": "0x70", "stub": "0x7100005470", "cmd_proof_offset": "0x71000054b4", "cmd_proof_instruction": "mov w2,#0x12", "cmd_hex_and_dec": "0x12 / 18", "calls": ["0x710001f6f8", "0x710001f768", "0x710001f7a8", "0x710001f7ec", "0x710001f830", "0x710001f874", "0x710001f8b8", "0x710001f8fc", "0x710001f940", "0x710001f984"] },
          "19": { "name": "FormatSdCardFileSystem", "vt_off": "0x78", "stub": "0x7100005500", "cmd_proof_offset": "0x7100005504", "cmd_proof_instruction": "mov w1,#0x13", "cmd_hex_and_dec": "0x13 / 19", "calls": ["0x71000203d8", "0x7100020448", "0x7100020478", "0x71000204a8", "0x71000204d8", "0x7100020508", "0x7100020538", "0x7100020568", "0x7100020598", "0x71000205c8"] },
          "21": { "name": "DeleteSaveDataFileSystem", "vt_off": "0x80", "stub": "0x7100005510", "cmd_proof_offset": "0x7100005514", "cmd_proof_instruction": "mov w2,#0x15", "cmd_hex_and_dec": "0x15 / 21", "calls": ["0x7100018d40"] },
          "23": { "name": "CreateSaveDataFileSystemBySystemSaveDataId", "vt_off": "0x90", "stub": "0x7100005530", "cmd_proof_offset": "0x7100005534", "cmd_proof_instruction": "mov w3,#0x17", "cmd_hex_and_dec": "0x17 / 23", "calls": ["0x7100019260"] },
          "24": { "name": "RegisterSaveDataFileSystemAtomicDeletion", "vt_off": "0x98", "stub": "0x7100005540", "cmd_proof_offset": "0x7100005548", "cmd_proof_instruction": "mov w3,#0x18", "cmd_hex_and_dec": "0x18 / 24", "calls": ["0x7100018ebc"] },
          "25": { "name": "DeleteSaveDataFileSystemBySaveDataSpaceId", "vt_off": "0xa0", "stub": "0x7100005560", "cmd_proof_offset": "0x7100005568", "cmd_proof_instruction": "mov w3,#0x19", "cmd_hex_and_dec": "0x19 / 25", "calls": ["0x7100018df8"] },
          "26": { "name": "FormatSdCardDryRun", "vt_off": "0xa8", "stub": "0x7100005570", "cmd_proof_offset": "0x7100005574", "cmd_proof_instruction": "mov w1,#0x1a", "cmd_hex_and_dec": "0x1a / 26", "calls": ["0x7100020638"] },
          "27": { "name": "IsExFatSupported", "vt_off": "0xb0", "stub": "0x7100005580", "cmd_proof_offset": "0x7100005584", "cmd_proof_instruction": "mov w2,#0x1b", "cmd_hex_and_dec": "0x1b / 27", "calls": ["0x71000206d0"] },
          "31": { "name": "OpenGameCardFileSystem", "vt_off": "0xd0", "stub": "0x7100005660", "cmd_proof_offset": "0x71000056bc", "cmd_proof_instruction": "mov w4,#0x1f", "cmd_hex_and_dec": "0x1f / 31", "calls": ["0x7100021210", "0x7100022248"] },
          "32": { "name": "ExtendSaveDataFileSystem", "vt_off": "0xd8", "stub": "0x7100005710", "cmd_proof_offset": "0x7100005718", "cmd_proof_instruction": "mov w5,#0x20", "cmd_hex_and_dec": "0x20 / 32", "calls": ["0x7100019358"] },
          "38": { "name": "DetachSdCard", "vt_off": "0x108", "stub": "0x7100005810", "cmd_proof_offset": "0x7100005814", "cmd_proof_instruction": "mov w1,#0x26", "cmd_hex_and_dec": "0x26 / 38", "calls": ["0x7100020a74"] },
          "52": { "name": "OpenSaveDataFileSystemBySystemSaveDataId", "vt_off": "0x128", "stub": "0x71000058f0", "cmd_proof_offset": "0x710000594c", "cmd_proof_instruction": "mov w4,#0x34", "cmd_hex_and_dec": "0x34 / 52", "calls": ["0x7100020f48"] },
          "57": { "name": "ReadSaveDataFileSystemExtraDataBySaveDataSpaceId", "vt_off": "0x138", "stub": "0x7100005a50", "cmd_proof_offset": "0x7100005a60", "cmd_proof_instruction": "mov w5,#0x39", "cmd_hex_and_dec": "0x39 / 57", "calls": ["0x7100019584"] },
          "58": { "name": "ReadSaveDataFileSystemExtraData", "vt_off": "0x140", "stub": "0x7100005a70", "cmd_proof_offset": "0x7100005a7c", "cmd_proof_instruction": "mov w4,#0x3a", "cmd_hex_and_dec": "0x3a / 58", "calls": ["0x7100019440", "0x71000196e0"] },
          "59": { "name": "WriteSaveDataFileSystemExtraData", "vt_off": "0x148", "stub": "0x7100005a90", "cmd_proof_offset": "0x7100005a9c", "cmd_proof_instruction": "mov w5,#0x3b", "cmd_hex_and_dec": "0x3b / 59", "calls": ["0x71000195d8"] },
          "61": { "name": "OpenSaveDataInfoReaderBySaveDataSpaceId", "vt_off": "0x158", "stub": "0x7100005b40", "cmd_proof_offset": "0x7100005b94", "cmd_proof_instruction": "mov w3,#0x3d", "cmd_hex_and_dec": "0x3d / 61", "calls": ["0x710001905c"] },
          "100": { "name": "OpenImageDirectoryFileSystem", "vt_off": "0x1b8", "stub": "0x7100005f80", "cmd_proof_offset": "0x7100005fd4", "cmd_proof_instruction": "mov w3,#0x64", "cmd_hex_and_dec": "0x64 / 100", "calls": ["0x7100022874"] },
          "202": { "name": "OpenDataStorageByDataId", "vt_off": "0x1f0", "stub": "0x7100006340", "cmd_proof_offset": "0x710000639c", "cmd_proof_instruction": "mov w4,#0xca", "cmd_hex_and_dec": "0xca / 202", "calls": ["0x7100019f10"] },
          "400": { "name": "OpenDeviceOperator", "vt_off": "0x220", "stub": "0x7100006730", "cmd_proof_offset": "0x7100006774", "cmd_proof_instruction": "mov w2,#0x190", "cmd_hex_and_dec": "0x190 / 400", "calls": ["0x710001fd7c", "0x7100020068", "0x7100020a10", "0x71000210d4", "0x71000214cc", "0x7100021724", "0x71000218f8", "0x7100021a28", "0x7100021b88", "0x7100021cc0", "0x7100021e60", "0x7100021fa8", "0x7100022114", "0x710002231c"] },
          "500": { "name": "OpenSdCardDetectionEventNotifier", "vt_off": "0x228", "stub": "0x71000067c0", "cmd_proof_offset": "0x7100006804", "cmd_proof_instruction": "mov w2,#0x1f4", "cmd_hex_and_dec": "0x1f4 / 500", "calls": ["0x710001fa00", "0x710001fad8", "0x710001fb14", "0x710001fb50", "0x710001fb8c", "0x710001fbc8", "0x710001fc04", "0x710001fc40", "0x710001fc7c", "0x710001fcb8"] },
          "501": { "name": "OpenGameCardDetectionEventNotifier", "vt_off": "0x230", "stub": "0x7100006850", "cmd_proof_offset": "0x7100006894", "cmd_proof_instruction": "mov w2,#0x1f5", "cmd_hex_and_dec": "0x1f5 / 501", "calls": ["0x7100021390"] },
          "502": { "name": "OpenSdCardAwakenReadyEventNotifier", "vt_off": "0x238", "stub": "0x71000068e0", "cmd_proof_offset": "0x7100006924", "cmd_proof_instruction": "mov w2,#0x1f6", "cmd_hex_and_dec": "0x1f6 / 502", "calls": ["0x71000208d0"] },
          "503": { "name": "OpenGameCardAwakenReadyEventNotifier", "vt_off": "0x240", "stub": "0x7100006970", "cmd_proof_offset": "0x71000069b4", "cmd_proof_instruction": "mov w2,#0x1f7", "cmd_hex_and_dec": "0x1f7 / 503", "calls": ["0x71000215d0"] },
          "511": { "name": "NotifySystemDataUpdateEvent", "vt_off": "0x250", "stub": "0x7100006a90", "cmd_proof_offset": "0x7100006a94", "cmd_proof_instruction": "mov w1,#0x1ff", "cmd_hex_and_dec": "0x1ff / 511", "calls": ["0x71000229a8"] },
          "618": { "name": "GetProgramId", "vt_off": "0x2e0", "stub": "0x7100006bf0", "cmd_proof_offset": "0x7100006bfc", "cmd_proof_instruction": "mov w5,#0x26a", "cmd_hex_and_dec": "0x26a / 618", "calls": ["0x7100022760"] },
          "620": { "name": "SetSdCardEncryptionSeed", "vt_off": "0x2e8", "stub": "0x7100006c10", "cmd_proof_offset": "0x7100006c14", "cmd_proof_instruction": "mov w2,#0x26c", "cmd_hex_and_dec": "0x26c / 620", "calls": ["0x7100020760"] },
          "630": { "name": "SetSdCardAccessibility", "vt_off": "0x2f0", "stub": "0x7100006c20", "cmd_proof_offset": "0x7100006c28", "cmd_proof_instruction": "mov w2,#0x276", "cmd_hex_and_dec": "0x276 / 630", "calls": ["0x7100020800"] },
          "810": { "name": "RegisterProgramIndexMapInfo", "vt_off": "0x338", "stub": "0x7100006d50", "cmd_proof_offset": "0x7100006d5c", "cmd_proof_instruction": "mov w4,#0x32a", "cmd_hex_and_dec": "0x32a / 810", "calls": ["0x7100022a58"] },
          "1008": { "name": "OpenRegisteredUpdatePartition", "vt_off": "0x378", "stub": "0x7100006df0", "cmd_proof_offset": "0x7100006e34", "cmd_proof_instruction": "mov w2,#0x3f0", "cmd_hex_and_dec": "0x3f0 / 1008", "calls": ["0x71000224fc"] },
          "1017": { "name": "OutputApplicationInfoAccessLog", "vt_off": "0x3a8", "stub": "0x7100006ed0", "cmd_proof_offset": "0x7100006ed4", "cmd_proof_instruction": "mov w2,#0x3f9", "cmd_hex_and_dec": "0x3f9 / 1017", "calls": ["0x71000226bc"] },
          "1300": { "name": "OpenBisWiper", "vt_off": "0x3e0", "stub": "0x7100007050", "cmd_proof_offset": "0x71000070ac", "cmd_proof_instruction": "mov w4,#0x514", "cmd_hex_and_dec": "0x514 / 1300", "calls": ["0x7100022d20"] }
        },
        "sub_interfaces": {
          "400 (nn::fssrv::sf::IDeviceOperator)": {
            "0": { "name": "IsSdCardInserted", "vt_off": "0x20", "stub": "0x710000ed30", "cmd_proof_offset": "0x710000ed34", "cmd_proof_instruction": "mov w2,wzr", "cmd_hex_and_dec": "0x0 / 0", "calls": ["0x710001fdb8", "0x710001fe30", "0x710001fe60", "0x710001fe90", "0x710001fec0", "0x710001fef0", "0x710001ff20", "0x710001ff50", "0x710001ff80", "0x710001ffb0"] },
            "2": { "name": "GetSdCardCid", "vt_off": "0x30", "stub": "0x710000ed40", "cmd_proof_offset": "0x710000ed4c", "cmd_proof_instruction": "mov w4,#0x2", "cmd_hex_and_dec": "0x2 / 2", "calls": ["0x710002009c", "0x7100020188", "0x71000201c4", "0x7100020200", "0x710002023c", "0x7100020278", "0x71000202b4", "0x71000202f0", "0x710002032c", "0x7100020368"] },
            "7": { "name": "SetSdCardActivationMode", "vt_off": "0x58", "stub": "0x710000eda0", "cmd_proof_offset": "0x710000eda8", "cmd_proof_instruction": "mov w2,#0x7", "cmd_hex_and_dec": "0x7 / 7", "calls": ["0x7100020a3c", "0x7100020b40", "0x7100020b74", "0x7100020ba8", "0x7100020bdc", "0x7100020c10", "0x7100020c44", "0x7100020c78", "0x7100020cac", "0x7100020ce0"] },
            "200": { "name": "IsGameCardInserted", "vt_off": "0xc8", "stub": "0x710000eec0", "cmd_proof_offset": "0x710000eec4", "cmd_proof_instruction": "mov w2,#0xc8", "cmd_hex_and_dec": "0xc8 / 200", "calls": ["0x7100021508"] },
            "202": { "name": "GetGameCardHandle", "vt_off": "0xd8", "stub": "0x710000eee0", "cmd_proof_offset": "0x710000eee4", "cmd_proof_instruction": "mov w2,#0xca", "cmd_hex_and_dec": "0xca / 202", "calls": ["0x7100021100"] },
            "203": { "name": "GetGameCardUpdatePartitionInfo", "vt_off": "0xe0", "stub": "0x710000eef0", "cmd_proof_offset": "0x710000eef8", "cmd_proof_instruction": "mov w4,#0xcb", "cmd_hex_and_dec": "0xcb / 203", "calls": ["0x7100021758"] },
            "205": { "name": "GetGameCardAttribute", "vt_off": "0xf0", "stub": "0x710000ef10", "cmd_proof_offset": "0x710000ef18", "cmd_proof_instruction": "mov w3,#0xcd", "cmd_hex_and_dec": "0xcd / 205", "calls": ["0x7100021928"] },
            "206": { "name": "GetGameCardDeviceCertificate", "vt_off": "0xf8", "stub": "0x710000ef20", "cmd_proof_offset": "0x710000ef34", "cmd_proof_instruction": "mov w6,#0xce", "cmd_hex_and_dec": "0xce / 206", "calls": ["0x7100021e9c"] },
            "218": { "name": "GetGameCardDeviceId", "vt_off": "0x158", "stub": "0x710000f080", "cmd_proof_offset": "0x710000f08c", "cmd_proof_instruction": "mov w4,#0xda", "cmd_hex_and_dec": "0xda / 218", "calls": ["0x7100022358"] },
            "220": { "name": "GetGameCardCompatibilityType", "vt_off": "0x168", "stub": "0x710000f0f0", "cmd_proof_offset": "0x710000f0f8", "cmd_proof_instruction": "mov w3,#0xdc", "cmd_hex_and_dec": "0xdc / 220", "calls": ["0x7100021bb8"] },
            "222": { "name": "GetGameCardCardHeader", "vt_off": "0x178", "stub": "0x710000f120", "cmd_proof_offset": "0x710000f134", "cmd_proof_instruction": "mov w5,#0xde", "cmd_hex_and_dec": "0xde / 222", "calls": ["0x71000217a8", "0x7100021a68", "0x7100021d00"] },
            "224": { "name": "GetGameCardApplicationIdList", "vt_off": "0x188", "stub": "0x710000f160", "cmd_proof_offset": "0x710000f174", "cmd_proof_instruction": "mov w6,#0xe0", "cmd_hex_and_dec": "0xe0 / 224", "calls": ["0x7100021fe8"] },
            "225": { "name": "RegisterGameCardConfigurationData", "vt_off": "0x190", "stub": "0x710000f180", "cmd_proof_offset": "0x710000f18c", "cmd_proof_instruction": "mov w4,#0xe1", "cmd_hex_and_dec": "0xe1 / 225", "calls": ["0x7100022148"] }
          }
        }
      },
      "ins:s": {
        "interface": "nn::ins::ISenderManager",
        "commands": {
          "0": { "name": "GetNotifyEvent", "vt_off": "0x20", "stub": "0x71001d1880", "cmd_proof_offset": "0x71001d1888", "cmd_proof_instruction": "mov w4,wzr", "cmd_hex_and_dec": "0x0 / 0", "calls": ["0x71001d14a0"] }
        }
      },
      "ldn:s": {
        "interface": "nn::ldn::detail::ISystemServiceCreator",
        "commands": {
          "0": { "name": "CreateSystemLocalCommunicationService", "vt_off": "0x20", "stub": "0x7100288a40", "cmd_proof_offset": "0x7100288a84", "cmd_proof_instruction": "mov w2,wzr", "cmd_hex_and_dec": "0x0 / 0", "calls": ["0x7100286bf8"] },
          "1": { "name": "CreateClientProcessMonitor", "vt_off": "0x28", "stub": "0x7100288ad0", "cmd_proof_offset": "0x7100288b14", "cmd_proof_instruction": "mov w2,#0x1", "cmd_hex_and_dec": "0x1 / 1", "calls": ["0x7100286d48"] }
        },
        "sub_interfaces": {
          "0 (nn::ldn::detail::ISystemLocalCommunicationService)": {
            "404": { "name": "InitializeWithPriority", "vt_off": "0x158", "stub": "0x7100288f30", "cmd_proof_offset": "0x7100288f3c", "cmd_proof_instruction": "mov w4,#0x194", "cmd_hex_and_dec": "0x194 / 404", "calls": ["0x7100286c1c"] }
          }
        }
      },
      "ndrm:la": {
        "interface": "nn::ndrm::low::detail::INdrmLowAdminInterface",
        "commands": {
          "1": { "name": "Cmd1", "vt_off": "0x20", "stub": "0x710006a350", "cmd_proof_offset": "0x710006a358", "cmd_proof_instruction": "mov w3,#0x1", "cmd_hex_and_dec": "0x1 / 1", "calls": ["0x7100067dd4"] },
          "2": { "name": "Cmd2", "vt_off": "0x28", "stub": "0x710006a360", "cmd_proof_offset": "0x710006a364", "cmd_proof_instruction": "mov w2,#0x2", "cmd_hex_and_dec": "0x2 / 2", "calls": ["0x7100067e3c"] },
          "3": { "name": "Cmd3", "vt_off": "0x30", "stub": "0x710006a370", "cmd_proof_offset": "0x710006a37c", "cmd_proof_instruction": "mov w5,#0x3", "cmd_hex_and_dec": "0x3 / 3", "calls": ["0x7100067ec8"] },
          "4": { "name": "Cmd4", "vt_off": "0x38", "stub": "0x710006a390", "cmd_proof_offset": "0x710006a394", "cmd_proof_instruction": "mov w3,#0x4", "cmd_hex_and_dec": "0x4 / 4", "calls": ["0x7100067f54"] },
          "5": { "name": "Cmd5", "vt_off": "0x40", "stub": "0x710006a3a0", "cmd_proof_offset": "0x710006a3a8", "cmd_proof_instruction": "mov w4,#0x5", "cmd_hex_and_dec": "0x5 / 5", "calls": ["0x7100067fec"] },
          "7": { "name": "Cmd7", "vt_off": "0x50", "stub": "0x710006a3e0", "cmd_proof_offset": "0x710006a3e8", "cmd_proof_instruction": "mov w4,#0x7", "cmd_hex_and_dec": "0x7 / 7", "calls": ["0x7100068640"] },
          "8": { "name": "Cmd8", "vt_off": "0x58", "stub": "0x710006a400", "cmd_proof_offset": "0x710006a408", "cmd_proof_instruction": "mov w4,#0x8", "cmd_hex_and_dec": "0x8 / 8", "calls": ["0x7100068780"] },
          "10": { "name": "Cmd10", "vt_off": "0x68", "stub": "0x710006a440", "cmd_proof_offset": "0x710006a448", "cmd_proof_instruction": "mov w4,#0xa", "cmd_hex_and_dec": "0xa / 10", "calls": ["0x7100068970"] },
          "11": { "name": "Cmd11", "vt_off": "0x70", "stub": "0x710006a460", "cmd_proof_offset": "0x710006a464", "cmd_proof_instruction": "mov w2,#0xb", "cmd_hex_and_dec": "0xb / 11", "calls": ["0x7100068c4c"] },
          "12": { "name": "Cmd12", "vt_off": "0x78", "stub": "0x710006a470", "cmd_proof_offset": "0x710006a474", "cmd_proof_instruction": "mov w3,#0xc", "cmd_hex_and_dec": "0xc / 12", "calls": ["0x7100068d38"] },
          "13": { "name": "Cmd13", "vt_off": "0x80", "stub": "0x710006a480", "cmd_proof_offset": "0x710006a48c", "cmd_proof_instruction": "mov w6,#0xd", "cmd_hex_and_dec": "0xd / 13", "calls": ["0x7100068e0c"] },
          "14": { "name": "Cmd14", "vt_off": "0x88", "stub": "0x710006a4b0", "cmd_proof_offset": "0x710006a4b4", "cmd_proof_instruction": "mov w2,#0xe", "cmd_hex_and_dec": "0xe / 14", "calls": ["0x7100068f28"] },
          "15": { "name": "Cmd15", "vt_off": "0x90", "stub": "0x710006a4c0", "cmd_proof_offset": "0x710006a4c4", "cmd_proof_instruction": "mov w2,#0xf", "cmd_hex_and_dec": "0xf / 15", "calls": ["0x7100068fac"] },
          "16": { "name": "Cmd16", "vt_off": "0x98", "stub": "0x710006a4d0", "cmd_proof_offset": "0x710006a4d4", "cmd_proof_instruction": "mov w3,#0x10", "cmd_hex_and_dec": "0x10 / 16", "calls": ["0x7100069264"] },
          "17": { "name": "Cmd17", "vt_off": "0xa0", "stub": "0x710006a4e0", "cmd_proof_offset": "0x710006a4ec", "cmd_proof_instruction": "mov w5,#0x11", "cmd_hex_and_dec": "0x11 / 17", "calls": ["0x7100068a18"] },
          "18": { "name": "Cmd18", "vt_off": "0xa8", "stub": "0x710006a500", "cmd_proof_offset": "0x710006a508", "cmd_proof_instruction": "mov w4,#0x12", "cmd_hex_and_dec": "0x12 / 18", "calls": ["0x7100068b30"] },
          "20": { "name": "Cmd20", "vt_off": "0xb8", "stub": "0x710006a530", "cmd_proof_offset": "0x710006a538", "cmd_proof_instruction": "mov w4,#0x14", "cmd_hex_and_dec": "0x14 / 20", "calls": ["0x71000681b0", "0x710006824c"] },
          "22": { "name": "Cmd22", "vt_off": "0xc8", "stub": "0x710006a570", "cmd_proof_offset": "0x710006a57c", "cmd_proof_instruction": "mov w6,#0x16", "cmd_hex_and_dec": "0x16 / 22", "calls": ["0x7100068834"] },
          "23": { "name": "Cmd23", "vt_off": "0xd0", "stub": "0x710006a590", "cmd_proof_offset": "0x710006a598", "cmd_proof_instruction": "mov w4,#0x17", "cmd_hex_and_dec": "0x17 / 23", "calls": ["0x71000688d0"] },
          "24": { "name": "Cmd24", "vt_off": "0xd8", "stub": "0x710006a5b0", "cmd_proof_offset": "0x710006a5bc", "cmd_proof_instruction": "mov w5,#0x18", "cmd_hex_and_dec": "0x18 / 24", "calls": ["0x7100068bd8"] },
          "25": { "name": "Cmd25", "vt_off": "0xe0", "stub": "0x710006a5d0", "cmd_proof_offset": "0x710006a5dc", "cmd_proof_instruction": "mov w5,#0x19", "cmd_hex_and_dec": "0x19 / 25", "calls": ["0x7100068aa8"] },
          "26": { "name": "Cmd26", "vt_off": "0xe8", "stub": "0x710006a5f0", "cmd_proof_offset": "0x710006a5f4", "cmd_proof_instruction": "mov w3,#0x1a", "cmd_hex_and_dec": "0x1a / 26", "calls": ["0x7100068cc4"] },
          "27": { "name": "Cmd27", "vt_off": "0xf0", "stub": "0x710006a600", "cmd_proof_offset": "0x710006a604", "cmd_proof_instruction": "mov w2,#0x1b", "cmd_hex_and_dec": "0x1b / 27", "calls": ["0x71000690b8"] },
          "28": { "name": "Cmd28", "vt_off": "0xf8", "stub": "0x710006a610", "cmd_proof_offset": "0x710006a61c", "cmd_proof_instruction": "mov w5,#0x1c", "cmd_hex_and_dec": "0x1c / 28", "calls": ["0x71000682e8"] },
          "29": { "name": "Cmd29", "vt_off": "0x100", "stub": "0x710006a630", "cmd_proof_offset": "0x710006a638", "cmd_proof_instruction": "mov w5,#0x1d", "cmd_hex_and_dec": "0x1d / 29", "calls": ["0x71000685b8"] },
          "30": { "name": "Cmd30", "vt_off": "0x108", "stub": "0x710006a650", "cmd_proof_offset": "0x710006a654", "cmd_proof_instruction": "mov w2,#0x1e", "cmd_hex_and_dec": "0x1e / 30", "calls": ["0x71000692ec"] },
          "31": { "name": "Cmd31", "vt_off": "0x110", "stub": "0x710006a660", "cmd_proof_offset": "0x710006a66c", "cmd_proof_instruction": "mov w5,#0x1f", "cmd_hex_and_dec": "0x1f / 31", "calls": ["0x7100069158"] },
          "32": { "name": "Cmd32", "vt_off": "0x118", "stub": "0x710006a680", "cmd_proof_offset": "0x710006a690", "cmd_proof_instruction": "mov w6,#0x20", "cmd_hex_and_dec": "0x20 / 32", "calls": ["0x7100068530"] },
          "33": { "name": "Cmd33", "vt_off": "0x120", "stub": "0x710006a6a0", "cmd_proof_offset": "0x710006a6a8", "cmd_proof_instruction": "mov w4,#0x21", "cmd_hex_and_dec": "0x21 / 33", "calls": ["0x7100069030"] },
          "34": { "name": "Cmd34", "vt_off": "0x128", "stub": "0x710006a6c0", "cmd_proof_offset": "0x710006a6c8", "cmd_proof_instruction": "mov w4,#0x22", "cmd_hex_and_dec": "0x22 / 34", "calls": ["0x71000686e0"] },
          "35": { "name": "Cmd35", "vt_off": "0x130", "stub": "0x710006a6e0", "cmd_proof_offset": "0x710006a6e8", "cmd_proof_instruction": "mov w4,#0x23", "cmd_hex_and_dec": "0x23 / 35", "calls": ["0x7100068110"] },
          "36": { "name": "Cmd36", "vt_off": "0x138", "stub": "0x710006a700", "cmd_proof_offset": "0x710006a708", "cmd_proof_instruction": "mov w4,#0x24", "cmd_hex_and_dec": "0x24 / 36", "calls": ["0x710006807c"] },
          "37": { "name": "Cmd37", "vt_off": "0x140", "stub": "0x710006a720", "cmd_proof_offset": "0x710006a724", "cmd_proof_instruction": "mov w3,#0x25", "cmd_hex_and_dec": "0x25 / 37", "calls": ["0x71000691d8"] },
          "40": { "name": "Cmd40", "vt_off": "0x158", "stub": "0x710006a770", "cmd_proof_offset": "0x710006a77c", "cmd_proof_instruction": "mov w5,#0x28", "cmd_hex_and_dec": "0x28 / 40", "calls": ["0x7100068378"] },
          "42": { "name": "Cmd42", "vt_off": "0x160", "stub": "0x710006a790", "cmd_proof_offset": "0x710006a7a4", "cmd_proof_instruction": "mov w6,#0x2a", "cmd_hex_and_dec": "0x2a / 42", "calls": ["0x7100069410"] },
          "43": { "name": "Cmd43", "vt_off": "0x168", "stub": "0x710006a7c0", "cmd_proof_offset": "0x710006a7d4", "cmd_proof_instruction": "mov w6,#0x2b", "cmd_hex_and_dec": "0x2b / 43", "calls": ["0x71000684a0"] },
          "44": { "name": "Cmd44", "vt_off": "0x170", "stub": "0x710006a7f0", "cmd_proof_offset": "0x710006a800", "cmd_proof_instruction": "mov w6,#0x2c", "cmd_hex_and_dec": "0x2c / 44", "calls": ["0x7100069380"] },
          "45": { "name": "Cmd45", "vt_off": "0x178", "stub": "0x710006a810", "cmd_proof_offset": "0x710006a814", "cmd_proof_instruction": "mov w3,#0x2d", "cmd_hex_and_dec": "0x2d / 45", "calls": ["0x7100069708"] },
          "46": { "name": "Cmd46", "vt_off": "0x180", "stub": "0x710006a820", "cmd_proof_offset": "0x710006a824", "cmd_proof_instruction": "mov w3,#0x2e", "cmd_hex_and_dec": "0x2e / 46", "calls": ["0x71000698c4"] },
          "47": { "name": "Cmd47", "vt_off": "0x188", "stub": "0x710006a830", "cmd_proof_offset": "0x710006a83c", "cmd_proof_instruction": "mov w5,#0x2f", "cmd_hex_and_dec": "0x2f / 47", "calls": ["0x7100069948"] },
          "48": { "name": "Cmd48", "vt_off": "0x190", "stub": "0x710006a850", "cmd_proof_offset": "0x710006a860", "cmd_proof_instruction": "mov w6,#0x30", "cmd_hex_and_dec": "0x30 / 48", "calls": ["0x7100068410"] },
          "51": { "name": "Cmd51", "vt_off": "0x1a8", "stub": "0x710006a8b0", "cmd_proof_offset": "0x710006a8c0", "cmd_proof_instruction": "mov w6,#0x33", "cmd_hex_and_dec": "0x33 / 51", "calls": ["0x71000699f0"] },
          "8001": { "name": "Cmd8001", "vt_off": "0x1b8", "stub": "0x710006a8d0", "cmd_proof_offset": "0x710006a8dc", "cmd_proof_instruction": "mov w5,#0x1f41", "cmd_hex_and_dec": "0x1f41 / 8001", "calls": ["0x71000697a8"] },
          "8002": { "name": "Cmd8002", "vt_off": "0x1c0", "stub": "0x710006a8f0", "cmd_proof_offset": "0x710006a8f4", "cmd_proof_instruction": "mov w3,#0x1f42", "cmd_hex_and_dec": "0x1f42 / 8002", "calls": ["0x7100069834"] }
        }
      },
      "ndrm:lu": {
        "interface": "nn::ndrm::low::detail::INdrmLowUserInterface",
        "commands": {
          "1": { "name": "Cmd1", "vt_off": "0x20", "stub": "0x7100069ea0", "cmd_proof_offset": "0x7100069eb0", "cmd_proof_instruction": "mov w6,#0x1", "cmd_hex_and_dec": "0x1 / 1", "calls": ["0x71000694a4"] },
          "2": { "name": "Cmd2", "vt_off": "0x28", "stub": "0x7100069ed0", "cmd_proof_offset": "0x7100069ed8", "cmd_proof_instruction": "mov w4,#0x2", "cmd_hex_and_dec": "0x2 / 2", "calls": ["0x7100069540"] },
          "3": { "name": "Cmd3", "vt_off": "0x30", "stub": "0x7100069ef0", "cmd_proof_offset": "0x7100069ef8", "cmd_proof_instruction": "mov w4,#0x3", "cmd_hex_and_dec": "0x3 / 3", "calls": ["0x71000695e0"] },
          "1000": { "name": "Cmd1000", "vt_off": "0x38", "stub": "0x7100069f10", "cmd_proof_offset": "0x7100069f14", "cmd_proof_instruction": "mov w3,#0x3e8", "cmd_hex_and_dec": "0x3e8 / 1000", "calls": ["0x7100069678"] }
        }
      },
      "nifm:a": {
        "interface": "nn::nifm::detail::IStaticService",
        "commands": {
          "0": { "vt_off": "0x28", "stub": "0x710006ca70", "cmd_proof_offset": "0x710006ca9c", "cmd_proof_instruction": "mov w1,wzr", "cmd_hex_and_dec": "0x0 / 0", "calls": ["0x710006c1f4", "0x710006c374", "0x710006c4f4"] }
        }
      },
      "nifm:s": {
        "interface": "nn::nifm::detail::IStaticService",
        "commands": {
          "0": { "vt_off": "0x28", "stub": "0x710006ca70", "cmd_proof_offset": "0x710006ca9c", "cmd_proof_instruction": "mov w1,wzr", "cmd_hex_and_dec": "0x0 / 0", "calls": ["0x710006c1f4", "0x710006c374", "0x710006c4f4"] }
        }
      },
      "nifm:u": {
        "interface": "nn::nifm::detail::IStaticService",
        "commands": {
          "0": { "vt_off": "0x28", "stub": "0x710006ca70", "cmd_proof_offset": "0x710006ca9c", "cmd_proof_instruction": "mov w1,wzr", "cmd_hex_and_dec": "0x0 / 0", "calls": ["0x710006c1f4", "0x710006c374", "0x710006c4f4"] }
        }
      },
      "nim:shp": {
        "interface": "nn::nim::detail::IShopServiceManager",
        "commands": {
          "0": { "name": "RequestDeviceAuthenticationToken", "vt_off": "0x78", "stub": "0x71001d3b00", "cmd_proof_offset": "0x71001d3b2c", "cmd_proof_instruction": "mov w1,wzr", "cmd_hex_and_dec": "0x0 / 0", "calls": ["0x71001d3058", "0x71001d3190", "0x71001d32ac", "0x71001d4d0c", "0x71001d4ddc", "0x71001d4ea4"] },
          "600": { "name": "IsInitialLaunchFinished", "vt_off": "0xb8", "stub": "0x71001d40c0", "cmd_proof_offset": "0x71001d40c4", "cmd_proof_instruction": "mov w2,#0x258", "cmd_hex_and_dec": "0x258 / 600", "calls": ["0x71001d4c60"] },
          "601": { "name": "NotifyFinishInitialLaunch", "vt_off": "0xc0", "stub": "0x71001d40d0", "cmd_proof_offset": "0x71001d40d4", "cmd_proof_instruction": "mov w1,#0x259", "cmd_hex_and_dec": "0x259 / 601", "calls": ["0x71001d4ca8"] }
        }
      },
      "notif:s": {
        "interface": "nn::notification::server::INotificationServices",
        "commands": {
          "520": { "name": "ListAlarmSettings", "vt_off": "0x30", "stub": "0x710023cc00", "cmd_proof_offset": "0x710023cc08", "cmd_proof_instruction": "mov w4,#0x208", "cmd_hex_and_dec": "0x208 / 520", "calls": ["0x710023c584"] },
          "540": { "name": "DeleteAlarmSetting", "vt_off": "0x40", "stub": "0x710023cc40", "cmd_proof_offset": "0x710023cc48", "cmd_proof_instruction": "mov w2,#0x21c", "cmd_hex_and_dec": "0x21c / 540", "calls": ["0x710023c600"] }
        }
      },
      "olsc:s": {
        "interface": "nn::olsc::srv::IServiceGetter",
        "commands": {
          "0": { "vt_off": "0x40", "stub": "0x710005c570", "cmd_proof_offset": "0x710005c574", "cmd_proof_instruction": "mov w2,wzr", "cmd_hex_and_dec": "0x0 / 0", "calls": ["0x7100268c60"] },
          "1": { "vt_off": "0x48", "stub": "0x7100269ed0", "cmd_proof_offset": "0x7100269ed4", "cmd_proof_instruction": "mov w3,#0x1", "cmd_hex_and_dec": "0x1 / 1", "calls": ["0x7100268cac"] },
          "3": { "vt_off": "0x58", "stub": "0x7100008dc0", "cmd_proof_offset": "0x7100008dc4", "cmd_proof_instruction": "mov w2,#0x3", "cmd_hex_and_dec": "0x3 / 3", "calls": ["0x7100268cf0"] }
        }
      }
    }
  }
}

@borntohonk

Copy link
Copy Markdown
Contributor Author

(this most likely needs additional workflow adjustments to support 12.1.0)

… database, adjust export to be like swipc ninupdates, refactor ipcdatabase for 22.1.0 to be in emitted order, add service tracing
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant