| 1236 | }; |
| 1237 | |
| 1238 | static void Resolve(const ResolverImpl &resolver = {}) |
| 1239 | { |
| 1240 | static bool resolved = false; |
| 1241 | |
| 1242 | if (resolved) |
| 1243 | return; |
| 1244 | |
| 1245 | std::string systemVersionString(128, 0); |
| 1246 | systemVersionString.resize(__system_property_get("ro.build.version.release", systemVersionString.data())); |
| 1247 | if (!systemVersionString.empty()) |
| 1248 | compat::SystemVersion = std::stoi(systemVersionString); |
| 1249 | |
| 1250 | if (compat::SupportedMinVersion > compat::SystemVersion) |
| 1251 | { |
| 1252 | LogError("[!] Unsupported system version: %zu", compat::SystemVersion); |
| 1253 | return; |
| 1254 | } |
| 1255 | |
| 1256 | LogInfo("[*] Starting to resolve symbols for Android %zu", compat::SystemVersion); |
| 1257 | |
| 1258 | #ifdef __LP64__ |
| 1259 | auto libgui = resolver.Open("/system/lib64/libgui.so", RTLD_LAZY); |
| 1260 | auto libutils = resolver.Open("/system/lib64/libutils.so", RTLD_LAZY); |
| 1261 | #else |
| 1262 | auto libgui = resolver.Open("/system/lib/libgui.so", RTLD_LAZY); |
| 1263 | auto libutils = resolver.Open("/system/lib/libutils.so", RTLD_LAZY); |
| 1264 | #endif |
| 1265 | if (nullptr == libgui || nullptr == libutils) |
| 1266 | { |
| 1267 | LogError("[!] Failed to open libgui.so or libutils.so"); |
| 1268 | throw std::runtime_error("Failed to open libgui.so or libutils.so"); |
| 1269 | } |
| 1270 | |
| 1271 | const auto &[libutilsApis, libguiApis] = ApiTableDescriptor::GetDefaultDescriptors(); |
| 1272 | for (const auto &descriptor : libutilsApis) |
| 1273 | { |
| 1274 | if (!descriptor.IsSupported(compat::SystemVersion)) |
| 1275 | continue; |
| 1276 | |
| 1277 | *descriptor.storeToTarget = resolver.Resolve(libutils, descriptor.apiSignature); |
| 1278 | if (nullptr == *descriptor.storeToTarget) |
| 1279 | { |
| 1280 | LogError("[!] Version[Android %zu] [libutils] failed to resolve symbol: %s", compat::SystemVersion, descriptor.apiSignature); |
| 1281 | throw std::runtime_error("Failed to resolve symbol"); |
| 1282 | } |
| 1283 | } |
| 1284 | |
| 1285 | for (const auto &descriptor : libguiApis) |
| 1286 | { |
| 1287 | if (!descriptor.IsSupported(compat::SystemVersion)) |
| 1288 | continue; |
| 1289 | |
| 1290 | *descriptor.storeToTarget = resolver.Resolve(libgui, descriptor.apiSignature); |
| 1291 | if (nullptr == *descriptor.storeToTarget) |
| 1292 | { |
| 1293 | LogError("[!] Version[Android %zu] [libgui] failed to resolve symbol: %s", compat::SystemVersion, descriptor.apiSignature); |
| 1294 | throw std::runtime_error("Failed to resolve symbol"); |
| 1295 | } |
nothing calls this directly
no test coverage detected