// Here be lions #include #include #include #include #include #include // Needs to be after for DEFINE_GUID #include "helpers.h" extern "C" { DWORD reg = 0; DEFINE_GUID (IID_CAuthFactory, 0x4603BB03, 0x058D, 0x43D9, 0xB9, 0x6F, 0x63, 0x9B, 0xE9, 0x08, 0xC1, 0xED); DEFINE_GUID (IID_CAuth, 0x045A5150, 0xD2B3, 0x4590, 0xA3, 0x8B, 0xC1, 0x15, 0x86, 0x78, 0xE1, 0xAC); class CAuth : public IUnknown { public: STDMETHODIMP QueryInterface (REFIID riid, LPVOID *ppvObj) { wchar_t *iid_str; StringFromCLSID (riid, &iid_str); printf ("QueryInterface %ls\n", iid_str); if (riid == IID_IUnknown || riid == IID_CAuth) { *ppvObj = this; this->AddRef (); return 0; } else { *ppvObj = 0; return E_NOINTERFACE; } } STDMETHODIMP_ (ULONG) AddRef () { return this->refCount++; } STDMETHODIMP_ (ULONG) Release () { this->refCount--; if (this->refCount <= 0) { delete this; return 0; } return this->refCount; } // Seems to verify that local network is valid? virtual i64 Unk3 (u32 a1) { return 1; } virtual i64 Unk4 () { return 1; } // Seems to check a config field, something to do with server/client virtual i32 Unk5 () { return 0; } // Seems to check that some config field is valid virtual i64 Unk6 () { return 1; } // Sets a random global to 1 virtual i32 Unk7 () { return 0; } // Set some global vars virtual i32 Unk8 () { return 0; } // Puts some globals into a1 virtual i32 Unk9 (i32 *a1) { printf ("Unk9\n"); a1[0x28] = 0; a1[1] = 1; a1[7] = 1; a1[0x2C] = 1; a1[0x2A] = 1; a1[0x2E] = 1; a1[0x31] = 0x11; a1[0x30] = 1; a1[0x2F] = 1; return 0; } // Copies from a global to a1 virtual i32 Unk10 (void *a1) { printf ("Unk10\n"); memset (a1, 0, 0xA8); return 0; } // Lotsa fancy stuff here virtual i32 Unk11 (char *a1) { printf ("Unk11\n"); memset (a1, 0, 0x13C); strncpy_s (a1, 4, "1", 3); strncpy_s (a1 + 4, 0x10, "ALLNET", 0xF); strncpy_s (a1 + 20, 8, "SWBY", 7); strncpy_s (a1 + 28, 8, "12.00", 7); strncpy_s (a1 + 36, 8, "S121", 7); strncpy_s (a1 + 44, 8, "08.18", 7); strncpy_s (a1 + 52, 4, "0", 3); strncpy_s (a1 + 56, 4, "PCB", 3); strncpy_s (a1 + 60, 0x100, "https://v402-front.mucha-prd.nbgi-amnet.jp:10122/mucha_front/", 0xFF); return 0; } // Some config stuff, unsure if true or false wanted virtual i32 Unk12 () { return 1; } virtual i32 Unk13 () { return 1; } // Seems to be some kind of copy? Can return E_FAIL and E_ACCESSDENIED virtual i32 Unk14 (void *a1) { printf ("Unk14\n"); memset (a1, 0, 0x8A2); return 0; } // Can return E_FAIL E_ABORT E_UNEXPECTED virtual i32 Unk15 () { return 0; } // Config stuff virtual i32 Unk16 () { return 0; } virtual i32 Unk17 () { return 0; } // Seems to be some kind of copy? Can return E_FAIL and E_ACCESSDENIED virtual i32 Unk18 (void *a1) { printf ("Unk18\n"); return 0; } // Fancy stuff happening here virtual i32 Unk19 (void *a1) { printf ("Unk19\n"); return 0; } // Can return E_FAIL E_ABORT E_UNEXPECTED E_NOTIMPL // Something to do with MH virtual i32 Unk20 () { printf ("Unk20\n"); return 0; } // Can return E_FAIL E_ABORT E_UNEXPECTED E_NOTIMPL // Something to do with a list // Maybe an init function virtual i32 Unk21 () { return 1; } virtual i32 Unk22 () { return 0; } virtual i32 Unk23 () { return 0; } // E_FAIL E_NOTIMPL virtual i32 Unk24 () { return 0; } // E_FAIL E_UNEXPECTED E_NOTIMPL virtual i32 Unk25 () { return 1; } // E_FAIL E_NOTIMPL virtual i32 Unk26 () { return 0; } // E_FAIL E_UNEXPECTED E_NOTIMPL virtual i32 Unk27 () { return 1; } // E_FAIL E_NOTIMPL virtual i32 Unk28 () { return 0; } // E_FAIL E_ACCESSDENIED virtual i32 Unk29 () { return 0; } virtual i32 Unk30 () { return 0; } // nothing special virtual i32 PrintDebugInfo () { return 0; } virtual i32 Unk32 (void *a1) { return 0; } virtual void Unk33 () {} public: CAuth () { printf ("CAuth\n"); } virtual ~CAuth () {} private: i32 refCount = 0; }; class CAuthFactory : public IClassFactory { public: STDMETHODIMP QueryInterface (REFIID riid, LPVOID *ppvObj) { wchar_t *iid_str; StringFromCLSID (riid, &iid_str); printf ("QueryInterface %ls\n", iid_str); if (riid == IID_IUnknown || riid == IID_IClassFactory || riid == IID_CAuthFactory) { *ppvObj = this; this->AddRef (); return 0; } else { *ppvObj = 0; return E_NOINTERFACE; } } STDMETHODIMP_ (ULONG) AddRef () { return 2; } STDMETHODIMP_ (ULONG) Release () { return 1; } virtual HRESULT CreateInstance (IUnknown *outer, REFIID riid, void **object) { if (outer != 0) return CLASS_E_NOAGGREGATION; wchar_t *iid_str; StringFromCLSID (riid, &iid_str); printf ("CreateInstance %ls\n", iid_str); if (riid == IID_CAuth) { CAuth *auth = new CAuth (); return auth->QueryInterface (riid, object); } else { *object = 0; return E_NOINTERFACE; } } virtual HRESULT LockServer (i32 lock) { return 0; } }; void Init () { CoInitializeEx (0, 0); CoRegisterClassObject (IID_CAuthFactory, (IUnknown *)new CAuthFactory (), 4, 1, ®); } void Exit () { CoRevokeClassObject (reg); CoUninitialize (); } }