Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(898)

Unified Diff: runtime/vm/precompiler.h

Issue 3003583002: [VM, Precompiler] PoC Obfuscator (Closed)
Patch Set: Discard obfuscation map Created 3 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: runtime/vm/precompiler.h
diff --git a/runtime/vm/precompiler.h b/runtime/vm/precompiler.h
index 2aff2a4d0cac1f6ef279bce0da3f815b4a4eb876..2fac04f85cd53f049fba32a9a2185784a18b436a 100644
--- a/runtime/vm/precompiler.h
+++ b/runtime/vm/precompiler.h
@@ -398,6 +398,8 @@ class Precompiler : public ValueObject {
void SwitchICCalls();
void ResetPrecompilerState();
+ void Obfuscate();
+
void CollectDynamicFunctionNames();
void PrecompileStaticInitializers();
@@ -476,6 +478,126 @@ class FunctionsTraits {
typedef UnorderedHashSet<FunctionsTraits> UniqueFunctionsSet;
+#if defined(DART_PRECOMPILER)
+// ObfuscationMap maps Strings to Strings.
+class ObfuscationMapTraits {
+ public:
+ static const char* Name() { return "ObfuscationMapTraits"; }
+ static bool ReportStats() { return false; }
+
+ // Only for non-descriptor lookup and table expansion.
+ static bool IsMatch(const Object& a, const Object& b) {
+ return a.raw() == b.raw();
+ }
+
+ static uword Hash(const Object& key) { return String::Cast(key).Hash(); }
+};
+typedef UnorderedHashMap<ObfuscationMapTraits> ObfuscationMap;
+
+class Obfuscator {
+ public:
+ Obfuscator(Thread* thread, const String& private_key);
+ ~Obfuscator();
+
+ RawString* Rename(const String& name, bool atomic = false) {
+ if (state_ == NULL) {
+ return name.raw();
+ }
+
+ return state_->RenameImpl(name, atomic);
+ }
+
+ static void ObfuscateSymbolInstance(Thread* thread, const Instance& instance);
+
+ static void Deobfuscate(Thread* thread, const GrowableObjectArray& pieces);
+
+ private:
+ void InitializeRenamingMap(Isolate* isolate);
+ void PreventRenaming(Dart_QualifiedFunctionName* entry_points);
+ void PreventRenaming(const char* name);
+ void PreventRenaming(const String& name) { state_->PreventRenaming(name); }
+
+ static const intptr_t kSavedStateNameIndex = 0;
+ static const intptr_t kSavedStateRenamesIndex = 1;
+ static const intptr_t kSavedStateSize = 2;
+
+ static RawArray* GetRenamesFromSavedState(const Array& saved_state) {
+ Array& renames = Array::Handle();
+ renames ^= saved_state.At(kSavedStateRenamesIndex);
+ return renames.raw();
+ }
+
+ static RawString* GetNameFromSavedState(const Array& saved_state) {
+ String& name = String::Handle();
+ name ^= saved_state.At(kSavedStateNameIndex);
+ return name.raw();
+ }
+
+ class ObfuscationState : public ZoneAllocated {
+ public:
+ ObfuscationState(Thread* thread,
+ const Array& saved_state,
+ const String& private_key)
+ : thread_(thread),
+ saved_state_(saved_state),
+ renames_(GetRenamesFromSavedState(saved_state)),
+ private_key_(private_key),
+ string_(String::Handle(thread->zone())),
+ renamed_(String::Handle(thread->zone())) {
+ memset(name_, 0, sizeof(name_));
+
+ string_ = GetNameFromSavedState(saved_state);
+ if (!string_.IsNull()) {
+ string_.ToUTF8(reinterpret_cast<uint8_t*>(name_), sizeof(name_));
+ }
+ }
+
+ void SaveState();
+
+ RawString* RenameImpl(const String& name, bool atomic);
+ RawString* BuildRename(const String& name, bool atomic);
+ RawString* NewAtomicRename(bool should_be_private);
+
+ void NextName();
+
+ void PreventRenaming(const String& name);
+ void PreventRenaming(const char* name);
+
+ private:
+ Thread* thread_;
+
+ const Array& saved_state_;
+
+ char name_[100];
+ ObfuscationMap renames_;
+
+ const String& private_key_;
+
+ String& string_;
+ String& renamed_;
+ };
+
+ ObfuscationState* state_;
+};
+#else
+// Minimal do-nothing implementation of an Obfuscator for non-precompiler
+// builds.
+class Obfuscator {
+ public:
+ Obfuscator(Thread* thread, const String& private_key) {}
+ ~Obfuscator() {}
+
+ RawString* Rename(const String& name, bool atomic = false) {
+ return name.raw();
+ }
+
+ static void ObfuscateSymbolInstance(Thread* thread,
+ const Instance& instance) {}
+
+ static void Deobfuscate(Thread* thread, const GrowableObjectArray& pieces) {}
+};
+#endif // DART_PRECOMPILER
+
} // namespace dart
#endif // RUNTIME_VM_PRECOMPILER_H_

Powered by Google App Engine
This is Rietveld 408576698