Add configurable scheme hook

Signed-off-by: Sean Du <do4suki@gmail.com>
This commit is contained in:
2026-06-20 08:12:46 +08:00
parent baa0f6e7e7
commit d98f16070e
5 changed files with 43 additions and 15 deletions
+10
View File
@@ -60,6 +60,13 @@ namespace config {
}
out = normalize_base_url(document[key].GetString());
}
void read_bool(const rapidjson::Document& document, const char* key, bool& out) {
if (!document.HasMember(key) || !document[key].IsBool()) {
return;
}
out = document[key].GetBool();
}
}
void load() {
@@ -88,9 +95,12 @@ namespace config {
return;
}
read_bool(document, "force_http", g_urls.force_http);
read_string(document, "api_url", g_urls.api_url);
read_string(document, "asset_url", g_urls.asset_url);
hook_logf("[cgss-http-hook] force_http=%s", g_urls.force_http ? "true" : "false");
if (!g_urls.api_url.empty()) {
hook_logf("[cgss-http-hook] normalized api_url=%s", g_urls.api_url.c_str());
}
+1
View File
@@ -2,6 +2,7 @@
namespace config {
struct OverrideUrls {
bool force_http = true;
std::string api_url;
std::string asset_url;
};
+27 -14
View File
@@ -43,6 +43,12 @@ namespace {
}
void patch_custom_preference_scheme() {
const auto& urls = config::get();
if (!urls.force_http) {
hook_log("[cgss-http-hook] force_http disabled, skipping CustomPreference scheme patch");
return;
}
auto custom_preference = il2cpp_symbols::get_class(
"Assembly-CSharp.dll", "Cute", "CustomPreference"
);
@@ -111,20 +117,25 @@ namespace {
return;
}
auto create_status = MH_CreateHook(
reinterpret_cast<void*>(addr),
reinterpret_cast<void*>(&get_scheme_type_hook),
reinterpret_cast<void**>(&g_orig_get_scheme_type)
);
if (create_status != MH_OK && create_status != MH_ERROR_ALREADY_CREATED) {
hook_log("[cgss-http-hook] MH_CreateHook failed");
return;
}
const auto& urls = config::get();
if (urls.force_http) {
auto create_status = MH_CreateHook(
reinterpret_cast<void*>(addr),
reinterpret_cast<void*>(&get_scheme_type_hook),
reinterpret_cast<void**>(&g_orig_get_scheme_type)
);
if (create_status != MH_OK && create_status != MH_ERROR_ALREADY_CREATED) {
hook_log("[cgss-http-hook] MH_CreateHook failed");
return;
}
auto enable_status = MH_EnableHook(reinterpret_cast<void*>(addr));
if (enable_status != MH_OK && enable_status != MH_ERROR_ENABLED) {
hook_log("[cgss-http-hook] MH_EnableHook failed");
return;
auto enable_status = MH_EnableHook(reinterpret_cast<void*>(addr));
if (enable_status != MH_OK && enable_status != MH_ERROR_ENABLED) {
hook_log("[cgss-http-hook] MH_EnableHook failed");
return;
}
} else {
hook_log("[cgss-http-hook] force_http disabled, keeping original scheme");
}
if (get_application_server_url_addr) {
@@ -156,7 +167,9 @@ namespace {
}
InterlockedExchange(&g_hook_installed, 1);
hook_log("[cgss-http-hook] hooked Stage.NetworkUtil.GetSchemeType");
if (urls.force_http) {
hook_log("[cgss-http-hook] hooked Stage.NetworkUtil.GetSchemeType");
}
}
DWORD WINAPI init_thread(void*) {