Skip to content

Commit

Permalink
Merge pull request #1 from kam800/master
Browse files Browse the repository at this point in the history
Upstream sync
  • Loading branch information
kkosowski-bt committed Jan 28, 2019
2 parents 01809a9 + 7835404 commit dc55bd0
Show file tree
Hide file tree
Showing 4 changed files with 113 additions and 4 deletions.
22 changes: 20 additions & 2 deletions MachObfuscator.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@
objects = {

/* Begin PBXBuildFile section */
88A1F2AC21F5F15A00C8389E /* ExportTrieMangler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88A1F2AB21F5F15A00C8389E /* ExportTrieMangler.swift */; };
88A1F2AE21F5F1FD00C8389E /* ExportTrieMangler_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88A1F2AD21F5F1FD00C8389E /* ExportTrieMangler_Tests.swift */; };
88A1F2AF21F5F3AA00C8389E /* ExportTrieMangler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88A1F2AB21F5F15A00C8389E /* ExportTrieMangler.swift */; };
D410A6CD20CF1FC3006A31E5 /* Obfuscator.swift in Sources */ = {isa = PBXBuildFile; fileRef = D410A6CC20CF1FC3006A31E5 /* Obfuscator.swift */; };
D410A6CF20CF2C30006A31E5 /* URL+NibLoading.swift in Sources */ = {isa = PBXBuildFile; fileRef = D410A6CE20CF2C30006A31E5 /* URL+NibLoading.swift */; };
D412C67A214076A200AA9A07 /* Options.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4F9B818213F39BC00253065 /* Options.swift */; };
Expand Down Expand Up @@ -224,6 +227,8 @@
/* End PBXCopyFilesBuildPhase section */

/* Begin PBXFileReference section */
88A1F2AB21F5F15A00C8389E /* ExportTrieMangler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExportTrieMangler.swift; sourceTree = "<group>"; };
88A1F2AD21F5F1FD00C8389E /* ExportTrieMangler_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExportTrieMangler_Tests.swift; sourceTree = "<group>"; };
D403A4F1217FACB300285492 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
D410A6CC20CF1FC3006A31E5 /* Obfuscator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Obfuscator.swift; sourceTree = "<group>"; };
D410A6CE20CF2C30006A31E5 /* URL+NibLoading.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "URL+NibLoading.swift"; sourceTree = "<group>"; };
Expand Down Expand Up @@ -372,11 +377,20 @@
/* End PBXFrameworksBuildPhase section */

/* Begin PBXGroup section */
88A1F2AA21F5F13300C8389E /* ExportTrieMangler */ = {
isa = PBXGroup;
children = (
88A1F2AB21F5F15A00C8389E /* ExportTrieMangler.swift */,
);
path = ExportTrieMangler;
sourceTree = "<group>";
};
D41FCFE62152FAC100BE3C7A /* SymbolManglingTests */ = {
isa = PBXGroup;
children = (
D41FCFE72152FAF400BE3C7A /* RealWordsMangler_Tests.swift */,
D41FCFE92152FB1D00BE3C7A /* CezarMangler_Tests.swift */,
88A1F2AD21F5F1FD00C8389E /* ExportTrieMangler_Tests.swift */,
);
path = SymbolManglingTests;
sourceTree = "<group>";
Expand Down Expand Up @@ -448,6 +462,7 @@
D439AAC31F9152F100F9582D /* SymbolMangling */ = {
isa = PBXGroup;
children = (
88A1F2AA21F5F13300C8389E /* ExportTrieMangler */,
D4C98AD8214329AF008340B2 /* RealWordsMangler */,
D4C98AD9214329B7008340B2 /* CezarMangler */,
D44722661FABDBF1006B03AA /* SymbolManglingMap.swift */,
Expand Down Expand Up @@ -933,6 +948,7 @@
D48F19021FAFB75D00BAC63D /* Mach+Saving.swift in Sources */,
D48B8F481F7FEBC200E73BBD /* main.swift in Sources */,
D453DB701F9FF7F0006FE316 /* ObfuscationSymbols+Building.swift in Sources */,
88A1F2AC21F5F15A00C8389E /* ExportTrieMangler.swift in Sources */,
D43CF1BA21559F790055F482 /* SoutLogger+withOptions.swift in Sources */,
D432EAE5213DE03300C2ADA0 /* Savable.swift in Sources */,
D45B195F20CC8426008415FF /* Nib.swift in Sources */,
Expand Down Expand Up @@ -1017,6 +1033,7 @@
D481609821205D6C008671D8 /* SymbolsSourceLoader.swift in Sources */,
D4C48E9421E2B5A700498A62 /* Image+updateMachs_Tests.swift in Sources */,
D44D732F2118890100DE002B /* Sequence+uniq.swift in Sources */,
88A1F2AE21F5F1FD00C8389E /* ExportTrieMangler_Tests.swift in Sources */,
D432EAE3213DE02400C2ADA0 /* Image+machs.swift in Sources */,
D44D732B2118875700DE002B /* URL+containsURL_Tests.swift in Sources */,
D4816069211C69A4008671D8 /* DependencyNodeLoader.swift in Sources */,
Expand All @@ -1029,6 +1046,7 @@
D44D73812119E87300DE002B /* NibPlist+Loading_Tests.swift in Sources */,
D481609F2120CFF9008671D8 /* CezarMangler.swift in Sources */,
D41A66C020F0B87300FB19EB /* UnsafePointer+Leb128_readNibUleb128_Tests.swift in Sources */,
88A1F2AF21F5F3AA00C8389E /* ExportTrieMangler.swift in Sources */,
D481606D211C69AA008671D8 /* Trie+Parsing.swift in Sources */,
D481606A211C69A4008671D8 /* DependencyNodeLoader+isMachOExecutable.swift in Sources */,
D481609D2120CF8C008671D8 /* DependencyNode.swift in Sources */,
Expand Down Expand Up @@ -1240,7 +1258,7 @@
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = F49C5VX3A6;
DEVELOPMENT_TEAM = 33H6Y6XY79;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 4.2;
};
Expand All @@ -1250,7 +1268,7 @@
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = F49C5VX3A6;
DEVELOPMENT_TEAM = 33H6Y6XY79;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 4.2;
};
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import Foundation

protocol ExportTrieMangling: AnyObject {
func mangle(trie: Trie, fillingRootLabelWith labelFill: UInt8) -> Trie
}

final class ExportTrieMangler: ExportTrieMangling {
func mangle(trie: Trie, fillingRootLabelWith labelFill: UInt8) -> Trie {
var trieCopy = trie

trieCopy.label = trieCopy.label.map { _ in
labelFill
}

trieCopy.children = trieCopy.children.enumerated().map { (index, child) -> Trie in
guard let labelFill = UInt8(exactly: index + 1) else {
fatalError("Trie label values probably exhausted at \(child.labelRange)")
}

return mangle(trie: child, fillingRootLabelWith: labelFill)
}

return trieCopy
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ class RealWordsMangler: SymbolMangling {
static var key: String = "realWords"
static let helpDescription: String = "replace objc symbols with random words (dyld info obfuscation not supported yet)"

private let exportTrieMangler: ExportTrieMangling = ExportTrieMangler()

required init() {}

func mangleSymbols(_ symbols: ObfuscationSymbols) -> SymbolManglingMap {
Expand Down Expand Up @@ -32,11 +34,11 @@ class RealWordsMangler: SymbolMangling {
}
return nil
}
// Export tries strings mangling not supported by RealWordsMangler yet.

let identityManglingMap =
symbols.exportTriesPerCpuIdPerURL
.mapValues { exportTriesPerCpuId in
return exportTriesPerCpuId.mapValues { ($0, $0) }
return exportTriesPerCpuId.mapValues { ($0, exportTrieMangler.mangle(trie: $0, fillingRootLabelWith: 0)) }
}

return SymbolManglingMap(selectors: Dictionary(uniqueKeysWithValues: unmangledAndMangledSelectorPairs),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
import XCTest

class ExportTrieMangler_Tests: XCTestCase {

var sut: ExportTrieMangler!

var rootTrie: Trie!

override func setUp() {
sut = ExportTrieMangler()
var childrenLayer0 = trieChildren(number: 3)
var childrenLayer1 = trieChildren(number: 2)
var childrenLayer2 = trieChildren(number: 2)
let childrenLayer3 = trieChildren(number: 2)

childrenLayer2 = assignChildren(childrenLayer3, to: childrenLayer2)
childrenLayer1 = assignChildren(childrenLayer2, to: childrenLayer1)
childrenLayer0 = assignChildren(childrenLayer1, to: childrenLayer0)

rootTrie = Trie(exportsSymbol: false,
labelRange: 0..<0,
label: [],
children: childrenLayer0)
}

override func tearDown() {
sut = nil
rootTrie = nil
}

func test_exportTrieObfuscation() {
let obfuscatedTrie = sut.mangle(trie: rootTrie, fillingRootLabelWith: 0)
XCTAssertEqual(obfuscatedTrie.label, [])
XCTAssertEqual(obfuscatedTrie.children[0].label, [1, 1, 1])
XCTAssertEqual(obfuscatedTrie.children[0].children[1].label, [2, 2])
XCTAssertEqual(obfuscatedTrie.children[1].label, [2, 2, 2])
XCTAssertEqual(obfuscatedTrie.children[2].label, [3, 3, 3])
XCTAssertEqual(obfuscatedTrie.children[2].children[0].label, [1, 1])
XCTAssertEqual(obfuscatedTrie.children[2].children[1].label, [2, 2])
}

private func trieChildren(number: Int) -> [Trie] {
return (1...number).map { index in
return Trie(exportsSymbol: index % 2 == 0,
labelRange: 0..<UInt64(number),
label: randomLabels(count: number),
children: [])
}
}

private func randomLabels(count: Int) -> [UInt8] {
return (0..<count).map { _ in
return (UInt8.random(in: 1...UInt8.max))
}
}

private func assignChildren(_ children: [Trie], to parent: [Trie]) -> [Trie] {
return parent.map { (trie) in
var copy = trie
copy.children = children
return copy
}
}
}

0 comments on commit dc55bd0

Please sign in to comment.