Theos/Logos:跨多个挂钩进程访问 Static/Global 变量

Theos/Logos: Accessing Static/Global Variable Across Multiple Hooked Processes

当然,我对调整开发还很陌生,但我 运行 遇到了一个问题。我正在为个人使用进行调整,以挂钩到多个进程,但我很难在这些特定于进程的挂钩之间共享变量。例如,我的 SpringBoard 方法挂钩能够设置静态变量的值,然后访问该值集。但是特定于应用程序的方法挂钩无法检索在 SpringBoard 方法的上下文中设置的值。变量返回未初始化。

由于 tweak 库很常见,我如何在一个进程的挂钩上下文中初始化 "global" 库级变量并在另一个进程的上下文中访问该值。

我的第一次尝试是这样的:

static BOOL isEnabled;

%hook FirstProcessFirstClass

- (void) methodInFirstProcessFirstClass {
    isEnabled = YES;
    %orig;
}

%end

%hook FirstProcessSecondClass

- (void) methodInFirstProcessSecondClass {
    // This will be 1 if it occurs after methodInFirstProcessFirstClass
    NSLog("isEnabled equals %d", isEnabled);
    %orig;
}

%end

%hook SecondProcessClass

- (void) methodInSecondProcessClass {
    // This is always going to be uninitialized (i.e., 0)
    NSLog("isEnabled equals %d", isEnabled);
    %orig;
}

%end

你明白了,我想在挂钩进程之间共享一个 "global variable"。谢谢你逗我。 :/

跨进程共享变量比仅拥有全局变量要复杂一些。您需要使用某种形式的 IPC(进程间通信)来跨进程同步变量。由于您挂接了 SpringBoard 其他应用程序,您可以将 SpringBoard 设置为 "server" 以便它在其他进程上发送变量的新状态。

您还可以使用 %group 指令根据您的调整实际挂钩的进程来应用挂钩,以便 SpringBoard 的挂钩仅在 SpringBoard 进程中激活,而不在 SpringBoard 进程中激活应用程序。这不会有太大变化,但不会有不必要的钩子。