No need for signature prefix
This commit is contained in:
parent
f5422786c0
commit
45f0962d59
|
|
@ -128,7 +128,7 @@ namespace lspd {
|
|||
|
||||
RegisterResourcesHook(env);
|
||||
RegisterArtClassLinker(env);
|
||||
RegisterYahfa(env, obfuscated_signature_);
|
||||
RegisterYahfa(env);
|
||||
RegisterPendingHooks(env);
|
||||
RegisterNativeAPI(env);
|
||||
}
|
||||
|
|
@ -198,14 +198,12 @@ namespace lspd {
|
|||
|
||||
// Call application_binder directly if application binder is available,
|
||||
// or we proxy the request from system server binder
|
||||
auto dex = instance->RequestLSPDex(env, application_binder ? application_binder : system_server_binder);
|
||||
auto dex_fd = std::get<0>(dex);
|
||||
LoadDex(env, dex_fd, std::get<1>(dex));
|
||||
auto [dex_fd, size]= instance->RequestLSPDex(env, application_binder ? application_binder : system_server_binder);
|
||||
LoadDex(env, dex_fd, size);
|
||||
close(dex_fd);
|
||||
instance->HookBridge(*this, env);
|
||||
|
||||
if (application_binder) {
|
||||
obfuscated_signature_ = std::move(std::get<2>(dex));
|
||||
InstallInlineHooks();
|
||||
Init(env);
|
||||
FindAndCall(env, "forkSystemServerPost", "(Landroid/os/IBinder;)V", application_binder);
|
||||
|
|
@ -265,11 +263,9 @@ namespace lspd {
|
|||
: instance->RequestBinder(env, nice_name);
|
||||
if (binder) {
|
||||
InstallInlineHooks();
|
||||
auto dex = instance->RequestLSPDex(env, binder);
|
||||
auto dex_fd = std::get<0>(dex);
|
||||
LoadDex(env, dex_fd, std::get<1>(dex));
|
||||
auto [dex_fd, size] = instance->RequestLSPDex(env, binder);
|
||||
LoadDex(env, dex_fd, size);
|
||||
close(dex_fd);
|
||||
obfuscated_signature_ = std::move(std::get<2>(dex));
|
||||
Init(env);
|
||||
LOGD("Done prepare");
|
||||
FindAndCall(env, "forkAndSpecializePost",
|
||||
|
|
|
|||
|
|
@ -69,7 +69,6 @@ namespace lspd {
|
|||
jclass class_linker_class_ = nullptr;
|
||||
jmethodID post_fixup_static_mid_ = nullptr;
|
||||
bool skip_ = false;
|
||||
std::string obfuscated_signature_;
|
||||
|
||||
struct PreloadedDex {
|
||||
|
||||
|
|
|
|||
|
|
@ -38,8 +38,6 @@ namespace lspd {
|
|||
|
||||
std::vector<std::pair<void *, void *>> jit_movements_;
|
||||
std::shared_mutex jit_movements_lock_;
|
||||
|
||||
std::string obfuscated_signature_;
|
||||
}
|
||||
|
||||
bool isHooked(void *art_method) {
|
||||
|
|
@ -96,7 +94,7 @@ namespace lspd {
|
|||
}
|
||||
|
||||
LSP_DEF_NATIVE_METHOD(jclass, Yahfa, buildHooker, jobject app_class_loader, jchar return_class,
|
||||
jcharArray classes, jstring method_name) {
|
||||
jcharArray classes, jstring method_name, jstring hooker_name) {
|
||||
static auto *kInMemoryClassloader = JNI_NewGlobalRef(env, JNI_FindClass(env,
|
||||
"dalvik/system/InMemoryDexClassLoader"));
|
||||
static jmethodID kInitMid = JNI_GetMethodID(env, kInMemoryClassloader, "<init>",
|
||||
|
|
@ -121,7 +119,7 @@ namespace lspd {
|
|||
cbuilder.set_source_file("LSP");
|
||||
|
||||
auto hooker_type =
|
||||
TypeDescriptor::FromClassname(obfuscated_signature_.c_str());
|
||||
TypeDescriptor::FromClassname(JUTFString(env, hooker_name).get());
|
||||
|
||||
auto *hooker_field = cbuilder.CreateField("hooker", hooker_type)
|
||||
.access_flags(dex::kAccStatic)
|
||||
|
|
@ -212,13 +210,10 @@ namespace lspd {
|
|||
"(Ljava/lang/reflect/Executable;Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;Z)Z"),
|
||||
LSP_NATIVE_METHOD(Yahfa, isHooked, "(Ljava/lang/reflect/Executable;)Z"),
|
||||
LSP_NATIVE_METHOD(Yahfa, buildHooker,
|
||||
"(Ljava/lang/ClassLoader;C[CLjava/lang/String;)Ljava/lang/Class;"),
|
||||
"(Ljava/lang/ClassLoader;C[CLjava/lang/String;Ljava/lang/String;)Ljava/lang/Class;"),
|
||||
};
|
||||
|
||||
void RegisterYahfa(JNIEnv *env, std::string obfuscated_signature) {
|
||||
std::replace(obfuscated_signature.begin(), obfuscated_signature.end(), '/', '.');
|
||||
obfuscated_signature_ = obfuscated_signature.substr(1) + ".LspHooker";
|
||||
LOGD("RegisterYahfa: obfuscated_signature_=%s", obfuscated_signature_.c_str());
|
||||
void RegisterYahfa(JNIEnv *env) {
|
||||
REGISTER_LSP_NATIVE_METHODS(Yahfa);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -30,6 +30,6 @@ namespace lspd {
|
|||
|
||||
std::vector<std::pair<void*, void*>> getJitMovements();
|
||||
|
||||
void RegisterYahfa(JNIEnv *, std::string obfuscated_signature);
|
||||
void RegisterYahfa(JNIEnv *);
|
||||
|
||||
} // namespace lspd
|
||||
|
|
|
|||
|
|
@ -309,7 +309,7 @@ namespace lspd {
|
|||
return app_binder;
|
||||
}
|
||||
|
||||
std::tuple<int, size_t, std::string> Service::RequestLSPDex(JNIEnv *env, const ScopedLocalRef<jobject> &binder) {
|
||||
std::tuple<int, size_t> Service::RequestLSPDex(JNIEnv *env, const ScopedLocalRef<jobject> &binder) {
|
||||
auto data = JNI_CallStaticObjectMethod(env, parcel_class_, obtain_method_);
|
||||
auto reply = JNI_CallStaticObjectMethod(env, parcel_class_, obtain_method_);
|
||||
auto res = JNI_CallBooleanMethod(env, binder, transact_method_,
|
||||
|
|
@ -318,18 +318,15 @@ namespace lspd {
|
|||
reply, 0);
|
||||
if (!res) {
|
||||
LOGE("Service::RequestLSPDex: transaction failed?");
|
||||
return {-1, 0, ""};
|
||||
return {-1, 0};
|
||||
}
|
||||
auto parcel_fd = JNI_CallObjectMethod(env, reply, read_file_descriptor_method_);
|
||||
int fd = JNI_CallIntMethod(env, parcel_fd, detach_fd_method_);
|
||||
auto size = JNI_CallLongMethod(env, reply, read_long_method_);
|
||||
auto signature = JNI_CallObjectMethod(env, reply, read_string_method_);
|
||||
JNI_CallVoidMethod(env, data, recycleMethod_);
|
||||
JNI_CallVoidMethod(env, reply, recycleMethod_);
|
||||
|
||||
JUTFString sign(env, static_cast<jstring>(signature.get()));
|
||||
|
||||
LOGD("Service::RequestLSPDex fd=%d, size=%zu, sign=%s", fd, size, sign.get());
|
||||
return {fd, size, sign.get()};
|
||||
LOGD("Service::RequestLSPDex fd=%d, size=%zu", fd, size);
|
||||
return {fd, size};
|
||||
}
|
||||
} // namespace lspd
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ namespace lspd {
|
|||
|
||||
ScopedLocalRef<jobject> RequestApplicationBinderFromSystemServer(JNIEnv *env, const ScopedLocalRef<jobject> &system_server_binder);
|
||||
|
||||
std::tuple<int, size_t, std::string> RequestLSPDex(JNIEnv *env, const ScopedLocalRef<jobject> &binder);
|
||||
std::tuple<int, size_t> RequestLSPDex(JNIEnv *env, const ScopedLocalRef<jobject> &binder);
|
||||
|
||||
private:
|
||||
inline static std::unique_ptr<Service> instance_ = std::make_unique<Service>();
|
||||
|
|
|
|||
|
|
@ -34,5 +34,5 @@ public class Yahfa {
|
|||
|
||||
public static native boolean isHooked(Executable member);
|
||||
|
||||
public static native Class<?> buildHooker(ClassLoader appClassLoader, char returnType, char[] params, String methodName);
|
||||
public static native Class<?> buildHooker(ClassLoader appClassLoader, char returnType, char[] params, String methodName, String hookerName);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -105,7 +105,7 @@ public class HookerDexMaker {
|
|||
}
|
||||
|
||||
private void doMake(String methodName) throws Exception {
|
||||
Class<?> hookClass = Yahfa.buildHooker(LspHooker.class.getClassLoader(), getDescriptor(mReturnType), getDescriptors(mActualParameterTypes), methodName);
|
||||
Class<?> hookClass = Yahfa.buildHooker(LspHooker.class.getClassLoader(), getDescriptor(mReturnType), getDescriptors(mActualParameterTypes), methodName, LspHooker.class.getCanonicalName());
|
||||
if (hookClass == null) throw new IllegalStateException("Failed to hook " + methodName);
|
||||
// Execute our newly-generated code in-process.
|
||||
Method backupMethod = hookClass.getMethod(METHOD_NAME_BACKUP, mActualParameterTypes);
|
||||
|
|
|
|||
|
|
@ -54,7 +54,6 @@ public class LSPApplicationService extends ILSPApplicationService.Stub {
|
|||
ParcelFileDescriptor pfd = ParcelFileDescriptor.fromFd(ObfuscationManager.preloadDex());
|
||||
reply.writeFileDescriptor(pfd.getFileDescriptor());
|
||||
reply.writeLong(ObfuscationManager.getPreloadedDexSize());
|
||||
reply.writeString(ObfuscationManager.getObfuscatedSignature());
|
||||
} catch (IOException ignored) {
|
||||
Log.e(TAG, "LSPApplicationService.onTransact: ParcelFileDescriptor.fromFd failed");
|
||||
return false;
|
||||
|
|
|
|||
Loading…
Reference in New Issue