| 1169 | |
| 1170 | |
| 1171 | uintptr_t KittyInjector::getJavaVM(inject_elf_info_t &injected) |
| 1172 | { |
| 1173 | if (!injected.is_valid()) |
| 1174 | { |
| 1175 | KITTY_LOGE("getJavaVM: Invalid info."); |
| 1176 | return false; |
| 1177 | } |
| 1178 | |
| 1179 | auto libart = _kMgr->elfScanner.findElf("libart.so", EScanElfType::Native, EScanElfFilter::System); |
| 1180 | uintptr_t pJNI_GetCreatedJavaVMs = libart.findSymbol("JNI_GetCreatedJavaVMs"); |
| 1181 | if (!pJNI_GetCreatedJavaVMs) |
| 1182 | { |
| 1183 | KITTY_LOGE("getJavaVM: Couldn't find function \"JNI_GetCreatedJavaVMs\"."); |
| 1184 | return false; |
| 1185 | } |
| 1186 | |
| 1187 | jint status = _kMgr->trace.callFunction(pJNI_GetCreatedJavaVMs, _rbuffer, 1, _rbuffer + sizeof(uintptr_t)) |
| 1188 | .result.val; |
| 1189 | |
| 1190 | uintptr_t pJvm = 0; |
| 1191 | jsize nJvms = 0; |
| 1192 | _kMgr->readMem(_rbuffer, &pJvm, sizeof(pJvm)); |
| 1193 | _kMgr->readMem(_rbuffer + sizeof(uintptr_t), &nJvms, sizeof(nJvms)); |
| 1194 | |
| 1195 | if (status != 0 || !pJvm || nJvms != 1) |
| 1196 | { |
| 1197 | KITTY_LOGE("getJavaVM: %p JNI_GetCreatedJavaVMs Failed to get JavaVM err(%d).", |
| 1198 | (void *)pJNI_GetCreatedJavaVMs, |
| 1199 | status); |
| 1200 | return 0; |
| 1201 | } |
| 1202 | |
| 1203 | return pJvm; |
| 1204 | } |
| 1205 | |
| 1206 | bool KittyInjector::callEntryPoint(inject_elf_info_t &injected) |
| 1207 | { |