前言
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中
以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中增加混淆标记
开启混淆: 启用控制流平坦化、启用伪控制流, 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
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