Awesome
code-obfuscation
A code obfuscation tool for iOS.
Because I turned to Swift, the code-obfuscation won't be updated any more. And I am coding Swift Obfuscator that based on Swift Syntax and Structured Editing Library.
Pre-setting
-
Copy the directory Obfuscation-Objective-C File.xctemplate to
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/File Templates/Source
, like below order:sudo cp -r Obfuscation-Objective-C\ File.xctemplate/ /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/File\ Templates/Source
Now, you can create obfuscation files in your projects. You might try to create them in your project, and then you will get 3 files.
-
Copy the file CO-Features.h to your project if you need the blow macro Features.
How to Use
Execute the order ./CodeObfuscation-release
or ./CodeObfuscation-debug
at your root path of your project.
Also set the shell script at you Xcode project to exectue it. Also see Features.
You could copy the program obfuse-code for iOS platform.
Obfuscation Syntax
-
Add macro
CO_CONFUSION_CLASS
after keyword@interface
and before classname. It tags the class is added to obfuscation task. e.g.@interface CO_CONFUSION_CLASS COTemplateFile : NSObject @end
-
Also modify the category by
CO_CONFUSION_CATEGORY
. And the macroCO_CONFUSION_CATEGORY
must be before category-name at bracket e.g.@interface NSString (CO_CONFUSION_CATEGORY abcde) @end
-
Add macro
CO_CONFUSION_PROPERTY
before a property-name declared. It tags the property is added to obfuscation task. e.g.@interface CO_CONFUSION_CLASS COTemplateFile : NSObject @property (nonatomic, strong) NSString * CO_CONFUSION_PROPERTY prop1; @property CGFloat CO_CONFUSION_PROPERTY prop2; @end
-
Add macro
CO_CONFUSION_METHOD
before a method head of declare or implementation. It tags the method is added to obfuscation task. e.g.// .h @interface CO_CONFUSION_CLASS COTemplateFile : NSObject CO_CONFUSION_METHOD - (void)makeFoo:(NSString *)foo1 arg2:(NSInteger)arg2; CO_CONFUSION_METHOD - (instancetype)initWithArg1:(CGFloat)arg, ...; @end // .m or .mm @implementation COTemplateFile CO_CONFUSION_METHOD - (void)_private:(NSString *)arg1 method:(float)arg2 scanned:(BOOL)scanned { ; } @end
-
Add macro
CO_CONFUSION_PROTOCOL
before a method head of declare or implementation. It tags the method is added to obfuscation task. e.g.@protocol CO_CONFUSION_PROTOCOL COProtocol <NSObject> @property (nonatomic, strong) id CO_CONFUSION_PROPERTY aVar; CO_CONFUSION_METHOD - (BOOL)doSome:(NSString *)task withYou:(id)you another:(id)someWho; @end
Property and method are same to
CO_CONFUSION_PROPERTY
andCO_CONFUSION_METHOD
.
Features
-
Support commands. (You can alse obtain these from command: -h or -help)
-id string
The directory of info.plist. Default is current executed path. (default ".")
-offset int
The offset of obfuscation. Default is 0.
-db string
The directory of obfuscation database. Default is current executed path. (default ".")
-root string
The directory of project file or what you want to start. Default is current executed path. (default ".")
-super
Check the user-class' names which have been entranced obfuscation whether their super classes exist or not. If exists, will info a warning. For strict option, will check all of classes of iOS Kits.
-strict
See -super.
-st
Strengthen the obfuscation. Default is true. (default true)
-version
Get the program supported iOS SDK version.
-q string
Query the method whether exist or not.
-
Output
origin-name: obfuscation
map into database. Its structure like:Use the SQL to search real name:
SELECT real FROM JSONModel_coh WHERE fake = 'AAAAA_$_S97Gcom_placeholder_com_s_p' AND type = 'method' -- Output: toJSONStringWithKeys
-
Use the macro
CO_NAME
to obtain the class name on runtime if the class name has been obfused. The 'CO_NAME' always return correct name even If the class name has not been obfused. -
Use the macro
CO_PROPERTY_SET
orCO_PROPERTY_SET_TYPE
to help your write setter of property which is added to obfuscation task. e.g.// Assume there is a NSString property named fullpath at Foo class. CO_PROPERTY_SET(fullpath, Fullpath, Foo) { // Use macro _ or CO_VAR_NAME get the synthesis variable. if (![_(fullpath) isEqualToString:fullpath]) { _(fullpath) = fulpath; // TODO other things... } } // If you want not to use class name CO_PROPERTY_SET_TYPE(fullpath, Fullpath, NSString*) { // Some codes... }
-
Use
CO_PROPERTY_GET
to synthesis getter method. -
Use
CO_VAR_NAME
to obtain synthsis variable. It looks like a little long, you can use_
to do if available.
Notice
CO_CONFUSION_CLASS
andCO_CONFUSION_CATEGORY
is a prerequisite forCO_CONFUSION_PROPERTY
andCO_CONFUSION_METHOD
.- COULD NOT use the code-obfuscation if your code contains runtime code. Unless you can control it.
- [IMPORTANT] The obfuscator works with macro. So if a target label was obfuscated with the same name of another API and your code used it. That would cause a compile error under release model. For example,
class Foo
has a property namedlength
and been obfuscated, if you invoke it and then useNSString
's length property in a code block withFoo.length
. The propertylength
word ofNSString
will be replaced withFoo
's obfuscation in release model.
License
The MIT License.