bool BlackList::is_black_listed(uint32_t pid) { char buffer[2048]; sprintf(buffer, "/proc/%u/cmdline", pid); if (!file_exists(buffer)) { return true; } string contents; FILE *in = fopen(buffer, "r"); if (in == NULL) { return true; } *buffer = 0; if (NULL == fgets(buffer, sizeof (buffer), in)) { fclose(in); return true; } fclose(in); contents = buffer; replace_all(contents, "\n", ""); return is_black_listed(contents.c_str()); }
void find_bridges() { walk::methods(*m_scope, [&](DexMethod* m) { if (has_bridgelike_access(m)) { auto bridgee = find_bridgee(m); if (!bridgee || is_black_listed(bridgee)) return; m_bridges_to_bridgees.emplace(m, bridgee); TRACE(BRIDGE, 5, "Bridge:%p:%s\nBridgee:%p:%s\n", m, SHOW(m), bridgee, SHOW(bridgee)); } }); }