首页推荐iOS上架

ios代码混淆

2018-03-18  本文已影响885人  wu大维

前言

众所周知的是大部分iOS代码一般不会做加密加固,因为iOS APP一般是通过AppStore发布的,而且苹果的系统难以攻破,所以在iOS里做代码加固一般是一件出力不讨好的事情。不过在逆向工程中,不混淆的代码还是很容易看到源码的。

特别是在组件化开发中,可以单独对某个组件或者库进行混淆。

Demo

先来看一看混淆前后的效果,混淆的源代码如下代码:

#import "Test_llvm.h"
#import <objc/runtime.h>

@implementation Test_llvm

+(NSString*)getCurrentTimes{
    
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    
    [formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"];
    
    NSDate *datenow = [NSDate date];

    NSString *currentTimeString = [formatter stringFromDate:datenow];
    
    [self subclassesOfClass:self];
     [self logTest];
    
    return currentTimeString;
    
}

+ (NSArray*)subclassesOfClass:(Class)parentClass
{
    int numClasses = objc_getClassList(NULL, 0);
    Class *classes = (Class*)malloc(sizeof(Class) * numClasses);
    
    numClasses = objc_getClassList(classes, numClasses);
    
    NSMutableArray *result = [NSMutableArray array];
    for(NSInteger i=0; i<numClasses; i++){
        Class cls = classes[i];
        
        do{
            cls = class_getSuperclass(cls);
        }while(cls && cls != parentClass);
        
        if(cls){
            [result addObject:classes[i]];
        }
    }
    [self logTest];
    free(classes);
    
    return [result copy];
}

+(void)logTest{
    NSLog(@"currentTimeString =  %@",@"logTest");
}

@end

使用Hopper可以查看:

混淆前代码.jpg 混淆后代码.jpg 混淆前控制流.jpg 混淆后控制流.jpg

llvm-obfuscator的下载地址: https://github.com/obfuscator-llvm/obfuscator.git

也可以执行命令来下载

$ git clone -b llvm-4.0 https://github.com/obfuscator-llvm/obfuscator.git
$ mkdir build
$ cd build
$ cmake -DCMAKE_BUILD_TYPE=Release ../obfuscator/
$ make -j7

老的分支可以因此被克隆。构建完成后,所有的静态库都在build/bin目录下。注意,这个源代码包含LLVM 和 Clang。

Xcode配置

在Xcode中使用O-LLVM,你必须写一个Xcode插件,我是在Xcode9.2中测试的。

$ cd /Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer/Library/Xcode/Plug-ins/
$ sudo cp -r Clang\ LLVM\ 1.0.xcplugin/ Obfuscator.xcplugin
$ cd Obfuscator.xcplugin/Contents/
$ sudo plutil -convert xml1 Info.plist
$ sudo vim Info.plist

修改

<string>com.apple.compilers.clang</string> -> <string>com.apple.compilers.obfuscator</string>
<string>Clang LLVM 1.0 Compiler Xcode Plug-in</string> -> <string>Obfuscator Xcode Plug-in</string>

Then:

$ sudo plutil -convert binary1 Info.plist
$ cd Resources/
$ sudo mv Clang\ LLVM\ 1.0.xcspec Obfuscator.xcspec
$ sudo vim Obfuscator.xcspec

修改 Obfuscator.xcspec:

<key>Description</key>
<string>Apple LLVM 8.0 compiler</string> -> <string>Obfuscator 4.0 compiler</string>
<key>ExecPath</key>
//此处clang路径为obfuscator4.0中clang的路径
<string>clang</string> -> <string>/path/to/obfuscator_bin/clang</string>
<key>Identifier</key>
<string>com.apple.compilers.llvm.clang.1_0</string> -> <string>com.apple.compilers.llvm.obfuscator.4_0</string>
<key>Name</key>
<string>Apple LLVM 8.0</string> -> <string>Obfuscator 4.0</string>
<key>Vendor</key>
<string>Apple</string> -> <string>HEIG-VD</string>
<key>Version</key>
<string>7.0</string> -> <string>4.0</string>

Then:

$ cd English.lproj/
$ sudo mv Apple\ LLVM\ 5.1.strings "Obfuscator 3.4.strings"
$ sudo plutil -convert xml1 Obfuscator\ 3.4.strings
$ sudo vim Obfuscator\ 3.4.strings 

Change:

<key>Description</key>
<string>Apple LLVM 8.0 compiler</string> -> <string>Obfuscator 4.0 compiler</string>
<key>Name</key>
<string>Apple LLVM 8.0</string> -> <string>Obfuscator 4.0</string>
<key>Vendor</key>
<string>Apple</string> -> <string>HEIG-VD</string>
<key>Version</key>
<string>7.0</string> -> <string>4.0</string>

Then:

$ sudo plutil -convert binary1 Obfuscator\ 3.4.strings

然后可以通过Xcode设置来完成效果:


49916087-D88E-49EB-8DB4-FA3E3041D4B8.png

更改other c flags或者c++(CXXFLAGS or CFLAGS):


9E21A6CC-1A82-42EA-82DE-5D441EACB930.png

如果是Xcode9以上需要修改index:


F091C072-BCC2-4F40-B3CE-850FE979361C.png

使用Obfuscator-LLVM,最简单的方法是设置flags

  1. -fla 混淆控制流
  2. -sub 指令替换
  3. -bcf 虚假的控制流

例如:-mllvm -fla -mllvm -sub -mllvm -bcf_loop=3 -mllvm -split

上一篇下一篇

猜你喜欢

热点阅读