#if defined(_WIN_PLATFORM_) #include "run_as_node.h" #include #include #include #include #if defined(_X64_ARCH_) // {call winmain, check run as node function} std::map> mainAddrMap = { {"9.9.12-25234", {0x457A76D, 0x3A5D70, 0x1FFF710}}}; #endif int(__stdcall *oriWinMain)(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd); void(__fastcall *checkRunAsNode)(void *a1); std::shared_ptr (*nodeInitializeOncePerProcess)( const std::vector &args, uint32_t flags); int __stdcall fakeWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { checkRunAsNode(nullptr); return oriWinMain(hInstance, hPrevInstance, lpCmdLine, nShowCmd); } bool RunAsNode::RunNode() { struct Arguments { int argc = 0; wchar_t **argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); ~Arguments() { LocalFree(argv); } } arguments; std::vector argv(arguments.argc); std::transform(arguments.argv, arguments.argv + arguments.argc, argv.begin(), [](auto &a) { return std::wstring_convert>().to_bytes(a); }); nodeInitializeOncePerProcess(argv, (1 << 6) | (1 << 7)); return true; } bool RunAsNode::Init(const std::string &version) { uint64_t baseAddr = 0; #if defined(_WIN_PLATFORM_) HMODULE wrapperModule = GetModuleHandleW(NULL); if (wrapperModule == NULL) throw std::runtime_error("Can't GetModuleHandle"); baseAddr = reinterpret_cast(wrapperModule); printf("baseAddr: %llx\n", baseAddr); #elif defined(_MAC_PLATFORM_) auto pmap = hak::get_maps(); do { if (pmap->module_name.find("QQ") != std::string::npos && pmap->offset == 0) { baseAddr = pmap->start(); printf("baseAddr: %llx\n", baseAddr); break; } } while ((pmap = pmap->next()) != nullptr); #elif defined(_LINUX_PLATFORM_) auto pmap = hak::get_maps(); do { if (pmap->module_name.find("QQ") != std::string::npos && pmap->offset == 0) { baseAddr = pmap->start(); printf("baseAddr: %lx\n", baseAddr); break; } } while ((pmap = pmap->next()) != nullptr); #endif if (baseAddr == 0) throw std::runtime_error("Can't find hook address"); auto [callptr, func1ptr, func2ptr] = mainAddrMap[version]; uint8_t *abscallptr = reinterpret_cast(baseAddr + callptr); oriWinMain = reinterpret_cast(moehoo::get_call_address(abscallptr)); checkRunAsNode = reinterpret_cast(baseAddr + func1ptr); nodeInitializeOncePerProcess = reinterpret_cast (*)(const std::vector &, uint32_t)>(baseAddr + func2ptr); return moehoo::hook(abscallptr, &fakeWinMain); } #endif