diff options
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/veridex/flow_analysis.cc | 10 | ||||
| -rw-r--r-- | tools/veridex/flow_analysis.h | 16 | ||||
| -rw-r--r-- | tools/veridex/hidden_api.h | 6 | ||||
| -rw-r--r-- | tools/veridex/hidden_api_finder.cc | 4 | ||||
| -rw-r--r-- | tools/veridex/veridex.cc | 5 | ||||
| -rw-r--r-- | tools/veridex/veridex.h | 2 |
6 files changed, 36 insertions, 7 deletions
diff --git a/tools/veridex/flow_analysis.cc b/tools/veridex/flow_analysis.cc index abd0b9b28c..a4553f9613 100644 --- a/tools/veridex/flow_analysis.cc +++ b/tools/veridex/flow_analysis.cc @@ -41,7 +41,11 @@ bool VeriFlowAnalysis::IsBranchTarget(uint32_t dex_pc) { bool VeriFlowAnalysis::MergeRegisterValues(uint32_t dex_pc) { // TODO: Do the merging. Right now, just return that we should continue // the iteration if the instruction has not been visited. - return !instruction_infos_[dex_pc].has_been_visited; + if (!instruction_infos_[dex_pc].has_been_visited) { + dex_registers_[dex_pc]->assign(current_registers_.begin(), current_registers_.end()); + return true; + } + return false; } void VeriFlowAnalysis::SetVisited(uint32_t dex_pc) { @@ -260,6 +264,10 @@ void VeriFlowAnalysis::ProcessDexInstruction(const Instruction& instruction) { RegisterValue obj = GetRegister(args[0]); last_result_ = RegisterValue( obj.GetSource(), obj.GetDexFileReference(), VeriClass::class_); + } else if (method == VeriClass::loadClass_) { + RegisterValue value = GetRegister(args[1]); + last_result_ = RegisterValue( + value.GetSource(), value.GetDexFileReference(), VeriClass::class_); } else { last_result_ = GetReturnType(instruction.VRegB_35c()); } diff --git a/tools/veridex/flow_analysis.h b/tools/veridex/flow_analysis.h index c065fb8c24..80ae5fc9df 100644 --- a/tools/veridex/flow_analysis.h +++ b/tools/veridex/flow_analysis.h @@ -20,6 +20,7 @@ #include "dex/code_item_accessors.h" #include "dex/dex_file_reference.h" #include "dex/method_reference.h" +#include "hidden_api.h" #include "veridex.h" namespace art { @@ -52,10 +53,19 @@ class RegisterValue { DexFileReference GetDexFileReference() const { return reference_; } const VeriClass* GetType() const { return type_; } - const char* ToString() const { + std::string ToString() const { switch (source_) { - case RegisterSource::kString: - return reference_.dex_file->StringDataByIdx(dex::StringIndex(reference_.index)); + case RegisterSource::kString: { + const char* str = reference_.dex_file->StringDataByIdx(dex::StringIndex(reference_.index)); + if (type_ == VeriClass::class_) { + // Class names at the Java level are of the form x.y.z, but the list encodes + // them of the form Lx/y/z;. Inner classes have '$' for both Java level class + // names in strings, and hidden API lists. + return HiddenApi::ToInternalName(str); + } else { + return str; + } + } case RegisterSource::kClass: return reference_.dex_file->StringByTypeIdx(dex::TypeIndex(reference_.index)); default: diff --git a/tools/veridex/hidden_api.h b/tools/veridex/hidden_api.h index 4c67768a00..b1c8559374 100644 --- a/tools/veridex/hidden_api.h +++ b/tools/veridex/hidden_api.h @@ -63,6 +63,12 @@ class HiddenApi { return HiddenApi::GetApiMethodName(*ref.dex_file, ref.index); } + static std::string ToInternalName(const std::string& str) { + std::string val = str; + std::replace(val.begin(), val.end(), '.', '/'); + return "L" + val + ";"; + } + private: static bool IsInList(const std::string& name, const std::set<std::string>& list) { return list.find(name) != list.end(); diff --git a/tools/veridex/hidden_api_finder.cc b/tools/veridex/hidden_api_finder.cc index b9be618ed7..b1ae7dd804 100644 --- a/tools/veridex/hidden_api_finder.cc +++ b/tools/veridex/hidden_api_finder.cc @@ -95,9 +95,7 @@ void HiddenApiFinder::CollectAccesses(VeridexResolver* resolver) { // Class names at the Java level are of the form x.y.z, but the list encodes // them of the form Lx/y/z;. Inner classes have '$' for both Java level class // names in strings, and hidden API lists. - std::string str = name; - std::replace(str.begin(), str.end(), '.', '/'); - str = "L" + str + ";"; + std::string str = HiddenApi::ToInternalName(name); // Note: we can query the lists directly, as HiddenApi added classes that own // private methods and fields in them. // We don't add class names to the `strings_` set as we know method/field names diff --git a/tools/veridex/veridex.cc b/tools/veridex/veridex.cc index 6e72faaf57..dc7ea94032 100644 --- a/tools/veridex/veridex.cc +++ b/tools/veridex/veridex.cc @@ -52,6 +52,7 @@ VeriClass* VeriClass::void_ = &v_; // Will be set after boot classpath has been resolved. VeriClass* VeriClass::object_ = nullptr; VeriClass* VeriClass::class_ = nullptr; +VeriClass* VeriClass::class_loader_ = nullptr; VeriClass* VeriClass::string_ = nullptr; VeriClass* VeriClass::throwable_ = nullptr; VeriMethod VeriClass::forName_ = nullptr; @@ -60,6 +61,7 @@ VeriMethod VeriClass::getDeclaredField_ = nullptr; VeriMethod VeriClass::getMethod_ = nullptr; VeriMethod VeriClass::getDeclaredMethod_ = nullptr; VeriMethod VeriClass::getClass_ = nullptr; +VeriMethod VeriClass::loadClass_ = nullptr; struct VeridexOptions { const char* dex_file = nullptr; @@ -176,6 +178,7 @@ class Veridex { // methods. VeriClass::object_ = type_map["Ljava/lang/Object;"]; VeriClass::class_ = type_map["Ljava/lang/Class;"]; + VeriClass::class_loader_ = type_map["Ljava/lang/ClassLoader;"]; VeriClass::string_ = type_map["Ljava/lang/String;"]; VeriClass::throwable_ = type_map["Ljava/lang/Throwable;"]; VeriClass::forName_ = boot_resolvers[0]->LookupDeclaredMethodIn( @@ -194,6 +197,8 @@ class Veridex { "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;"); VeriClass::getClass_ = boot_resolvers[0]->LookupDeclaredMethodIn( *VeriClass::object_, "getClass", "()Ljava/lang/Class;"); + VeriClass::loadClass_ = boot_resolvers[0]->LookupDeclaredMethodIn( + *VeriClass::class_loader_, "loadClass", "(Ljava/lang/String;)Ljava/lang/Class;"); std::vector<std::unique_ptr<VeridexResolver>> app_resolvers; Resolve(app_dex_files, resolver_map, type_map, &app_resolvers); diff --git a/tools/veridex/veridex.h b/tools/veridex/veridex.h index 75e4845293..9c0a158174 100644 --- a/tools/veridex/veridex.h +++ b/tools/veridex/veridex.h @@ -65,6 +65,7 @@ class VeriClass { static VeriClass* object_; static VeriClass* class_; + static VeriClass* class_loader_; static VeriClass* string_; static VeriClass* throwable_; static VeriClass* boolean_; @@ -83,6 +84,7 @@ class VeriClass { static VeriMethod getMethod_; static VeriMethod getDeclaredMethod_; static VeriMethod getClass_; + static VeriMethod loadClass_; private: Primitive::Type kind_; |