iosObfuscation

马甲包混淆方案

Posted by kunnan on June 5, 2018

前言

anti-class-dump

LLVM Obfuscator

马甲包混淆方案

  • 通过技术手段,多次上架同一款产品的方法.
  • 另一种马甲包是内容和功能完全不合规,壳子本身功能正常是为了能通过审核,而一旦审核通过,大部分都会直接成为一个UIWebView展示内容

I、混淆方案组合一:Hikari 混淆调用树

  • 预编译完成的工具链

Hikari的Releases有预先编译好的工具链,将Hikari.xctoolchain解压到~/Library/Developer/Toolchains/ 或/Library/Developer/Toolchains/ 即可(区别是前者只有当前用户可用,后者所有用户都可使用)

/Users/devzkn/code/knHikari/Users/Naville/Library/Developer/Toolchains/Hikari.xctoolchain 

 /Users/devzkn/Library/Developer/Toolchains/Hikari.xctoolchain

这个脚本假设当前工作目录不是用户的家目录(即~/) ,如果是的话请先cd到其他目录。

git clone -b release_60 https://github.com/HikariObfuscator/Hikari.git Hikari \
&& mkdir Build && cd Build && \
cmake -G "Ninja" -DCMAKE_BUILD_TYPE=MinSizeRel -DLLVM_APPEND_VC_REV=on -DLLVM_CREATE_XCODE_TOOLCHAIN=on \
-DCMAKE_INSTALL_PREFIX=~/Library/Developer/ ../Hikari && ninja &&ninja install-xcode-toolchain && git clone \
https://github.com/HikariObfuscator/Resources.git ~/Hikari && rsync -ua \ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/ \ ~/Library/Developer/Toolchains/Hikari.xctoolchain/ && \
rm ~/Library/Developer/Toolchains/Hikari.xctoolchain/ToolchainInfo.plist

1.1 使用

  • Hikari目前支持下文所述的编译器标记
-enable-bcfobf 启用伪控制流  
-enable-cffobf 启用控制流平坦化
-enable-splitobf 启用基本块分割  
-enable-subobf 启用指令替换  
-enable-acdobf 启用反class-dump  
-enable-indibran 启用基于寄存器的相对跳转,配合其他加固可以彻底破坏IDA/Hopper的伪代码(俗称F5)  
-enable-strcry 启用字符串加密  
-enable-funcwra 启用函数封装
  • -enable-allobf一次性启用前文所述的所有标记
  • 对于Xcode而言所有的混淆标记应该加在Target的Other C Flags中

image

以clang为例,您需要在每个flag前加上-mllvm

1.2 content/Intergrating-with-Xcode

  • 对于工程中的每个Target.搜索Enable Index-While-Building并设置为NO
Build Setting -> Enable Index-While-Building Functionality -> ‘default’ change to ‘No’
  • 按照你的混淆需求在CFLAGS中增加混淆标记

image

开启混淆: 启用控制流平坦化、启用伪控制流, Build Settings -> OTHER_CFLAGS -> -mllvm -enable-cffobf -mllvm -enable-bcfobf
  • 记得关闭编译器优化(CFLAG加-O0,Xcode的Optimization Level设置为None,否则混淆会被编译器优化回去)
关闭编译优化 Build Settings -> OPTIMIZATION_LEVEL -> 0
  • 打开Xcode->Toolchains菜单, 选择 Hikari.
Build Settings -> Compiler for C/C++/Objective-C -> HikariObfuscator
  • [可选]关闭 bitcode

1.3 wiki

1.4 Known Issues

  • Running AntiClassDump On A File Without ObjC Class will crash the executable.在没有ObjC类的源码里打开反class-dump后编译产物会崩溃

1.5 HikariDemo

1.6 code backup

II、混淆方案组合二 混淆方法名,类名

2.1 原版

提供两个文件:func.list、confuse.sh

将要混淆的方法名、类名 填入func.list 文件里面。项目里不要引入func.list文件

Build Phases 点击’+’,new run script , Run Script -> add $PROJECT_DIR/confuse.sh

command + B 将生成的 codeObfuscation.h加入项目

注意

使用这套方案,(2种)目的是为了混淆我们的SDK

1)目前暂未出现因为机审不过的情况,通常是因为马甲本身的功能不够丰富。
2)另外方案一有可能导致当前项目无法使用xib以及无法继承自定义类的情况,暂时无法解决,发生几率不高,但是还是建议在工程做完之后再修改编译方式。

III 、验证效果

3.1 hopper

  • frida-ps -Ua
  • kndump appname

image

3.2 class-dump

 swiftOCclass-dump /Users/devzkn/decrypted/kn/Payload/kn.app/kn -H -o  /Users/devzkn/decrypted/kn/head
https://github.com/zhangkn/KNBin/blob/master/swiftOCclass-dump

可以class-dump混编的

swiftOCclass-dump  --arch arm64 /Users/devzkn/decrypted/AppStoreV10.2/Payload/AppStore.app/AppStore -H -o  /Users/devzkn/decrypted/AppStoreV10.2/head

swiftOCclass-dump knip  -H -o  /Users/devzkn/decrypted/knip/head

3.3 otool -tv

  • otool -hv knip
  • otool -l knip

3.4 cycript 进行快速分析

[[[UIWindow keyWindow] rootViewController] _printHierarchy].toString()

3.5 使用 console进行log 分析

destructor、constructor & knhook
static void __attribute__((destructor)) back_main1(void)
{
printf("Come to %s\n", __func__);
}
__attribute__((constructor)) static void before1()
{
    printf("beforeFunction\n");
	[KNHook hookClass:@"WebViewJavascriptBridge"];
}

3.6 process:MobileSafari 远程调试

IV 、知识补充

还原符号表

cmake

  • /Users/devzkn/Downloads/kevin-software/ios-Reverse_Engineering/llvm-3.9.0.src/build
  • /Users/devzkn/code/iosre/Hikari/Hikari/build

V、See Also

WebViewJavascriptBridge

WebViewJavascriptBridge 的结构是 WebViewJavascriptBridge(使用 UIWebView) 和 WKWebViewJavascriptBridge(使用 WKWebView) 公用一个 WKWebViewJavascriptBridgeBase,
    [_bridge callHandler:@"testJavascriptHandler" data:@{ @"foo":@"before ready" }];

iOSobfuscation

1) http://7xunik.com1.z0.glb.clouddn.com/Hikari.zip
  • Uploading LFS objects
2) Uploading LFS objects
remote: error: File Hikari.zip is 185.04 MB; this exceeds GitHub's file size limit of 100.00 MB
remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.
devzkndeMacBook-Pro:Hikari devzkn$ git lfs track "*.zip" 
Tracking "*.zip"
devzkndeMacBook-Pro:Hikari devzkn$ kngitinit git@github.com:iOSobfuscation/KNHikari.git
Uploading LFS objects:   0% (0/1), 114 MB | 591 KB/s                                                                                                                                                                         

AppStore上架-技术篇

1)而是通过创建本地http服务器的形式通过http://localhost:端口的方式浏览
2) 本地服务器那个是用的开源库:github搜索HTTPServer
3) 重点添加classprex前缀和后缀:加入指令混淆和函数封装
4)shell脚本类型和函数的重命名: https://my.oschina.net/FEEDFACF/blog/1627398
https://gitee.com/xtfjhhsfm/YTTInjectedContentKit.git

https://github.com/iOSobfuscation/KNInjectedContentKit

积分墙接口后台

aso

安全

blog

https://github.com/githubPagesio/free-programming-books-zh_CN
wufawei

则平

语言学习资料

other

https://my.oschina.net/FEEDFACF/blog/1528819
https://my.oschina.net/FEEDFACF/blog/1621956
/Users/devzkn/bin/knpost iosObfuscation 马甲包混淆方案 -t iosre
#原来""的参数,需要自己加上""

转载请注明: > iosObfuscation