APP开启bitcode,生成.xcarchive文件,对.xcarchive文件做混淆加固

静态库文件可以用张总的Hikari做加固,但却不知道如何对开启bitcode的app的.xcarchive做混淆加固。

静态库

静态库重新编译bitcode的步骤:

1、拿到libWJNetwork.a中的.o文件:

ar -x libWJNetwork.a

目录下会生成两个文件:

WJNetwork.o
__.SYMDEF SORTED

2、终端输入命令,处理WJNetwork.o文件,生成result.bc文件,就是bitcode文件。

segedit WJNetwork.o -extract “__LLVM” “__bitcode” result.bc

3、使用Hikari处理bitcode文件,生成.o文件:

/path_to/Hikari.xctoolchain/usr/bin/clang -arch arm64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs -fobjc-arc -c result.bc -mllvm -enable-cffobf -mllvm -enable-bcfobf -o result.o

4、生成.a文件:

rm __.SYMDEF\ SORTED
ar -crs result.a result.o
ranlib result.a

混淆加固完成。

开启bitcode的app

APP开启bitcode,生成.xcarchive文件,对.xcarchive文件做混淆加固。
测试的APP项目名为 TestBitCode

1、把TestBitCode二进制文件中的bitcode分离出来,得到一个.bc文件

segedit TestBitCode -extract “__LLVM” “__bundle” result.bc

2、执行编译混淆

/path_to/Hikari.xctoolchain/usr/bin/clang -arch arm64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs -fobjc-arc -c result.bc -mllvm -enable-cffobf -mllvm -enable-bcfobf -o result.o

报错:

error: expected top-level entity

xar!<U+0000><U+001C><U+0000><U+0001><U+0000><U+0000><U+0000><U+0000><U+0000><U+0000><U+000B><9A><U+0000>…

^

1 error generated.

对app这样操作,应该是不行。
请问各位大佬,有没有做过类似的对开启bitcode的APP做过类似的加固处理,能指点我一下。
对开启bitcode的APP的.xcarchive文件,应该用怎样的步骤呢?????

1 个赞

把bc提取出来再xar解压就行了

多谢张总回复

用xar解压result.bc文件:

xar -xf result.bc

得到好多文件:

是要对生成的每一个文件 用Hikari 混淆加固 吗??

对每个文件 混淆加固,在用xar 压缩 ??

用xar 压缩 成一个文件,是要用这个文件替换掉.xcarchive中的二进制文件吗??

llvm-link * -o 123.bc && opt -obfus -enable-allobf 123.bc -o obf.bc && clang obf.bc XXXXXXXXX

1 个赞

正在做这方面的学习

可以交流下

按照您的步骤,编译出了APP的二进制文件,但是mach-o view里找不到签名相关的部分,应该是没有签名。使用codesign给文件签名,没有效果。请问这个签名具体是要在哪一步执行??如何做??

签名跟编译器没关系,手动调codesign就行了

按照楼主的步骤,加固完成之后报错Undefined symbols for architecture arm64:
“_clang.arc.use”, referenced from:

所以一般建议直接用编译器编译。Pass的排序好像有坑,有人说原版Clang也会遇到

另外实际上正确的做法是用opt来做混淆然后用原版clang来把ir编译回二进制 @xiaoxiaohljz @WangBeiCheng

Sc:OB qaq$ lipo libOBDemo.a -thin arm64 -output OB64.a
Sc:OB qaq$ ar -x OB64.a 
Sc:OB qaq$ segedit OBDemo.o -extract "__LLVM" "__bitcode" result.bc

Sc:OB qaq$ ./Hikari.xctoolchain/usr/bin/opt -enable-allobf result.bc -o resultNew.bc

Sc:OB qaq$ clang -arch arm64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs -fobjc-arc -c resultNew.bc -o result.o
warning: overriding the module target triple with arm64-apple-ios5.0.0 [-Woverride-module]
1 warning generated.
Sc:OB qaq$ ar -crs result.a result.o 
Sc:OB qaq$ ranlib result.a

生成静态库之后,一样报错

"_clang.arc.use", referenced from:
      +[OBDemo myName] in result.a(result.o)
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

emmm…可能我的打开方式不对吗,没用过opt

.a源码

@implementation OBDemo

+(void)myName{
    NSInteger i = 0;
    while (i < 100) {
        i = i + 1;
        NSString *str = [NSString stringWithFormat:@"Hello -> %d",i];
        NSLog(@"%@",str);
        NSString *str2 = @"呀呀呀呀呀呀呀呀呀呀呀呀呀呀";
        NSArray *array = @[str2];
        NSLog(@"%",array);
    }
    [self P1];
}


+(void)P1{
    NSString *p = @"p1";
    NSLog(@"%d",p.length);
}

@end

感觉还是Pass Scheduler的问题,两次跑clang的时候分别加上 -mllvm -debug-pass=Details 试试,看看输出日志是啥,贼长

日志太长了,放到网站上了
日志链接

hmmmm中途生成的bc也给我看下

bc日志

./Hikari.xctoolchain/usr/bin/opt -debug-pass=Details OBDemo.bc  -o result.bc
Pass Arguments:  -targetlibinfo -tti -targetpassconfig -verify -write-bitcode
Target Library Information
Target Transform Information
Target Pass Configuration
  ModulePass Manager
    FunctionPass Manager
      Module Verifier
    Bitcode Writer
[2018-11-05 17:29:18.894502000] 0x7fdc4d4038e0   Executing Pass 'Function Pass Manager' on Module 'OBDemo.bc'...
[2018-11-05 17:29:18.895022000] 0x7fdc4d406d00     Executing Pass 'Module Verifier' on Function '+[OBDemo myName]'...
 -*- 'Module Verifier' is the last user of following pass instances. Free these instances
[2018-11-05 17:29:18.895116000] 0x7fdc4d406d00      Freeing Pass 'Module Verifier' on Function '+[OBDemo myName]'...
[2018-11-05 17:29:18.895138000] 0x7fdc4d406d00     Executing Pass 'Module Verifier' on Function '+[OBDemo P1]'...
 -*- 'Module Verifier' is the last user of following pass instances. Free these instances
[2018-11-05 17:29:18.895183000] 0x7fdc4d406d00      Freeing Pass 'Module Verifier' on Function '+[OBDemo P1]'...
[2018-11-05 17:29:18.895204000] 0x7fdc4d4038e0   Executing Pass 'Bitcode Writer' on Module 'OBDemo.bc'...
 -*- 'Bitcode Writer' is the last user of following pass instances. Free these instances

我要混淆前的bc文件啊

BC文件
arm64库文件
分离出的.o文件

确认一下,你这个是还没混淆的文件是吧。有没开debug模式的bc吗我上mailing list问问,应该是上流的问题