MCPcopy Create free account
hub / github.com/CodingGay/BlackDex / InitArtMethod

Method InitArtMethod

Bcore/src/main/cpp/jnihook/ArtM.cpp:119–158  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

117}
118
119void ArtM::InitArtMethod(JNIEnv *env, int api_level) {
120 registerArtNative(env);
121 ArtMethodEnv.api_level = api_level;
122
123 jclass clazz = env->FindClass("top/niunaijun/jnihook/jni/ArtMethod");
124 jmethodID nativeOffsetId = env->GetStaticMethodID(clazz, "nativeOffset", "()V");
125 jmethodID nativeOffset2Id = env->GetStaticMethodID(clazz, "nativeOffset2", "()V");
126
127 void *nativeOffset = GetArtMethod(env, clazz, nativeOffsetId);
128 void *nativeOffset2 = GetArtMethod(env, clazz, nativeOffset2Id);
129 ArtMethodEnv.art_method_size = (size_t) nativeOffset2 - (size_t) nativeOffset;
130
131 // calc native offset
132 auto artMethod = reinterpret_cast<uintptr_t *>(nativeOffset);
133 for (int i = 0; i < ArtMethodEnv.art_method_size; ++i) {
134 if (reinterpret_cast<void *>(artMethod[i]) == native_offset) {
135 ArtMethodEnv.art_method_native_offset = i;
136 break;
137 }
138 }
139
140 uint32_t flags = 0x0;
141 flags = flags | kAccPublic;
142 flags = flags | kAccStatic;
143 flags = flags | kAccNative;
144 flags = flags | kAccFinal;
145 if (api_level >= __ANDROID_API_Q__) {
146 flags = flags | kAccPublicApi;
147 }
148
149 char *start = reinterpret_cast<char *>(artMethod);
150 for (int i = 1; i < ArtMethodEnv.art_method_size; ++i) {
151 auto value = *(uint32_t * )(start + i * sizeof(uint32_t));
152 if (value == flags) {
153 ArtMethodEnv.art_method_flags_offset = i * sizeof(uint32_t);
154 ArtMethodEnv.art_method_dex_code_item_offset = (i + 1) * sizeof(uint32_t);
155 break;
156 }
157 }
158}

Callers

nothing calls this directly

Calls 1

registerArtNativeFunction · 0.85

Tested by

no test coverage detected