TMR::TMR(PDB1* ppdb1To_, DBI1* pdbi1To_, TPI* ptpiTo_) : TM(ppdb1To_, pdbi1To_, ptpiTo_), ptmpct(0), mptitiDefn(0), mptiptype(0), pbTypes(0) { instrumentation(pdbi1To->info.cTMR++); fTMPCT = FALSE; signature = 0; }
/* * Parse AndroidManifest from buffer, return a list of class names that are referenced */ std::unordered_set<std::string> extract_classes_from_manifest(const std::string& manifest_contents) { // Tags android::String16 activity("activity"); android::String16 activity_alias("activity-alias"); android::String16 application("application"); android::String16 provider("provider"); android::String16 receiver("receiver"); android::String16 service("service"); android::String16 instrumentation("instrumentation"); // Attributes android::String16 authorities("authorities"); android::String16 name("name"); android::String16 target_activity("targetActivity"); android::ResXMLTree parser; parser.setTo(manifest_contents.data(), manifest_contents.size()); std::unordered_set<std::string> result; if (parser.getError() != android::NO_ERROR) { return result; } android::ResXMLParser::event_code_t type; do { type = parser.next(); if (type == android::ResXMLParser::START_TAG) { size_t len; android::String16 tag(parser.getElementName(&len)); if (tag == activity || tag == application || tag == provider || tag == receiver || tag == service || tag == instrumentation) { std::string classname = get_attribute_value(parser, name); if (classname.size()) { result.insert(dotname_to_dexname(classname)); } if (tag == provider) { std::string text = get_attribute_value(parser, authorities); size_t start = 0; size_t end = 0; while ((end = text.find(';', start)) != std::string::npos) { result.insert(dotname_to_dexname(text.substr(start, end - start))); start = end + 1; } result.insert(dotname_to_dexname(text.substr(start))); } } else if (tag == activity_alias) { std::string classname = get_attribute_value(parser, target_activity); if (classname.size()) { result.insert(dotname_to_dexname(classname)); } } } } while (type != android::ResXMLParser::BAD_DOCUMENT && type != android::ResXMLParser::END_DOCUMENT); return result; }
TMTS::TMTS(PDB1* ppdb1To_, DBI1* pdbi1To_, TPI* ptpiTo_) : TM(ppdb1To_, pdbi1To_, ptpiTo_), ppdbFrom(0), pdbiFrom(0), ptpiFrom(0), pUDTRefs(0) { instrumentation(pdbi1To->info.cTMTS++); }
TMPCT::TMPCT(PDB1* ppdb1To_, DBI1* pdbi1To_, TPI* ptpiTo_) : TMR(ppdb1To_, pdbi1To_, ptpiTo_) { instrumentation(pdbi1To->info.cTMR--); instrumentation(pdbi1To->info.cTMPCT++); }