commit 5bf0ee294ecd221409ac920f034d42d166d63cac
parent a5ed05e41501dc1c1bb3f8c3d04cf80d95b8341c
Author: rhunk <101876869+rhunk@users.noreply.github.com>
Date: Tue, 29 Aug 2023 00:41:50 +0200
feat(native): armv7 unarycall sig
Diffstat:
2 files changed, 17 insertions(+), 8 deletions(-)
diff --git a/native/jni/src/library.cpp b/native/jni/src/library.cpp
@@ -8,6 +8,13 @@
#include "util.h"
#include "grpc.h"
+#ifdef __aarch64__
+#define ARM64 true
+#else
+#define ARM64 false
+#endif
+
+
static native_config_t *native_config;
static JavaVM *java_vm;
@@ -113,9 +120,9 @@ void JNICALL init(JNIEnv *env, jobject clazz, jobject classloader) {
// native lib object
native_lib_object = env->NewGlobalRef(clazz);
native_lib_on_unary_call_method = env->GetMethodID(
- env->GetObjectClass(clazz),
- "onNativeUnaryCall",
- "(Ljava/lang/String;[B)L" BUILD_NAMESPACE "/NativeRequestData;"
+ env->GetObjectClass(clazz),
+ "onNativeUnaryCall",
+ "(Ljava/lang/String;[B)L" BUILD_NAMESPACE "/NativeRequestData;"
);
// load libclient.so
@@ -132,9 +139,11 @@ void JNICALL init(JNIEnv *env, jobject clazz, jobject classloader) {
DobbyHook((void *) DobbySymbolResolver("libc.so", "fstat"), (void *) fstat_hook,
(void **) &fstat_original);
- //signature might change in the future (unstable for now)
- auto unaryCall_func = util::find_signature(client_module.base, client_module.size,
- "FD 7B BA A9 FC 6F 01 A9 FA 67 02 A9 F8 5F 03 A9 F6 57 04 A9 F4 4F 05 A9 FD 03 00 91 FF 43 13 D1");
+ auto unaryCall_func = util::find_signature(
+ client_module.base, client_module.size,
+ ARM64 ? "A8 03 1F F8 C2 00 00 94" : "0A 90 00 F0 3F F9",
+ ARM64 ? -0x48 : -0x38
+ );
if (unaryCall_func != 0) {
DobbyHook((void *) unaryCall_func, (void *) unaryCall_hook, (void **) &unaryCall_original);
} else {
diff --git a/native/jni/src/util.h b/native/jni/src/util.h
@@ -68,7 +68,7 @@ namespace util {
env->CallVoidMethod(runtime, loadLibraryMethod, classLoader, env->NewStringUTF(libName));
}
- uintptr_t find_signature(uintptr_t module_base, uintptr_t size, const std::string &pattern) {
+ uintptr_t find_signature(uintptr_t module_base, uintptr_t size, const std::string &pattern, int offset = 0) {
std::vector<char> bytes;
std::vector<char> mask;
for (size_t i = 0; i < pattern.size(); i += 3) {
@@ -91,7 +91,7 @@ namespace util {
break;
}
if (found) {
- return module_base + i;
+ return module_base + i + offset;
}
}
return 0;