From 1a682ff12d1dc5271dec0b8ef10a14e0dfcc5f3e Mon Sep 17 00:00:00 2001 From: simplxs Date: Sat, 29 Jun 2024 19:01:26 +0800 Subject: [PATCH] fix linux --- src/hijacker.cpp | 2 +- src/run_as_node.cpp | 39 ++++++++++++++++++++++++++++++++++++++- src/run_as_node.h | 1 + 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/hijacker.cpp b/src/hijacker.cpp index d406125..a8c5897 100644 --- a/src/hijacker.cpp +++ b/src/hijacker.cpp @@ -1,6 +1,6 @@ +#if defined(_WIN_PLATFORM_) #include "run_as_node.h" -#if defined(_WIN_PLATFORM_) bool TlsOnce = false; // this runs way before dllmain void __stdcall TlsCallback(PVOID hModule, DWORD fdwReason, PVOID pContext) diff --git a/src/run_as_node.cpp b/src/run_as_node.cpp index 2cdabd5..4435231 100644 --- a/src/run_as_node.cpp +++ b/src/run_as_node.cpp @@ -1,5 +1,9 @@ +#if defined(_WIN_PLATFORM_) #include "run_as_node.h" +#include +#include +#include #include #if defined(_WIN_PLATFORM_) @@ -14,12 +18,42 @@ int(__stdcall *oriWinMain)(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR l 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) { + MessageBoxA(NULL, "Init", "fakeWinMain", MB_OK); 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); }); + + MessageBoxA(NULL, "pre nodeInitializeOncePerProcess", "fakeWinMain", MB_OK); + std::for_each(argv.begin(), argv.end(), [](const std::string &arg) + { MessageBoxA(NULL, arg.c_str(), "fakeWinMain", MB_OK);}); + nodeInitializeOncePerProcess(argv, (1 << 6) | (1 << 7)); + MessageBoxA(NULL, "post nodeInitializeOncePerProcess", "fakeWinMain", MB_OK); + return true; +} + bool RunAsNode::Init() { uint64_t baseAddr = 0; @@ -60,5 +94,8 @@ bool RunAsNode::Init() uint8_t *abscallptr = reinterpret_cast(baseAddr + callptr); oriWinMain = reinterpret_cast(moehoo::get_call_address(abscallptr)); checkRunAsNode = reinterpret_cast(baseAddr + funcptr); + nodeInitializeOncePerProcess = reinterpret_cast (*)(const std::vector &, uint32_t)>(baseAddr + 0x1FFF710); return moehoo::hook(abscallptr, &fakeWinMain); -} \ No newline at end of file +} + +#endif \ No newline at end of file diff --git a/src/run_as_node.h b/src/run_as_node.h index 3a1f597..61f8555 100644 --- a/src/run_as_node.h +++ b/src/run_as_node.h @@ -4,5 +4,6 @@ namespace RunAsNode { + bool RunNode(); bool Init(); } \ No newline at end of file