名称混淆
- 混淆要求: 业务开发 -> 没有问题
- 但是业务上线 -> 名称混淆
- 逆向分析-> 入口 -> 从方法名/类名分析 -> 怎么隐藏?
- 用宏定义隐藏 -> .pch文件
- 建立pch文件, 如果项目中没有的话
- build setting -> prefix header -> 设置pch
image.png
d.这样写的好处, 代码完全不用变
e.这时给断点, 查看函数栈
image.png
f.这时如果别人逆向你, 恢复符号跟没恢复一样, 让人头大
- 有关Swift -> 就比较好, 自带混淆, 因为有类前缀
g.pch的好处 -> 轻量级, 对项目的污染度低(针对OC)
- 只能干掉自定义的方法名/函数
- 建议核心的类名 和 方法名可以使用
- 扩展: 写个脚本, 或者写一个算法, 让每次编译都不一样
扩展
可能导致上不了线的操作
- 大量的流程的混淆
- LLVM -> 会把冗余的代码干掉
- 混淆有可能产生大量的冗余代码
字符串常量的隐藏
- EncryptionTools -> 一个简单的加密工具
- 这时候破解者只要断你的CCCrypt函数就能拿到你的Key
- 查看汇编
- adrp -> 在某页取数据
- 如果说本地一定要有字符串常量怎么隐藏?
- 全局函数 -> 没有符号
image.png
c.目的 -> 在静态分析的时候找不到我们的Key字符串
d.但是这样如果找到函数地址, 字符串还是很明显
image.png
e.这时候可以来一个简单的疑惑算法来隐藏
image.png
f.上面的简单算法生成的字符串, 不会进入常量区, 别人看汇编也就看不到这个字符串.
ptrace防护fashhook
- 打符号断点, 拿到ptrace所属的库
image.png
- 拿到库路径
- image list
b.
image.png
#import <dlfcn.h>
image.png
- 这种通过dlopen懒加载的, 我们fishhook写的hook代码就失效了(通过间接符号表的hook)
- 再用fishhook来hook -> ptrace之前, 已经查看懒加载符号表, 看里面有没有ptrace的符号, 如果没有则肯定hook失败
- 这里有点坑啊, dlopen的写法, 好像过不了审吧 (要查资料验证一下)
- 但是通过hopper查看macho -> 全局搜ptrace还是能很快定位
- 这时候我们上面讲的字符串隐藏就可以起到作用隐藏ptrace字符串
- 此时, 工程用hopper打开, 全局搜ptrace也搜不到
怎么破解上面的防护呢?
- 符号断点, 确实能断到ptrace, 但是就是找不到, 这时候就考虑别人有可能做了防护
- 这时候看符号断点, 通过函数调用栈找到调用者
1.
image.png
- 1028f5e34
- image list -> 拿到首地址
- 相减 -> 5E34
- 用这个地址去hopper打开的文件中搜就能找到关键函数
d.
image.png
- 修改汇编源码比如把 cbz改为b -> 就不会走5E34的汇编代码, 就绕过了ptrace
再套娃, 如何防护
- 打开strip, 脱去所有不必要的符号
- 这样别人就不好找了
- 其实只是增加了别人找的难度, 这里的重点是怎么隐藏符号断点让别人断不到
隐藏符号断点
#import <sys/syscall.h>
- syscall(26,31,0.0) -> 这个方法等同于ptrace
- 自己查下该函数
- 这里是隐藏了其他的符号断点, 但是syscall的符号断点又暴露了, 感觉是个套娃
- 怎么办, 这里给个建议, 可以写汇编代码来代替syscall
- 当然也可以写ptrace的汇编
- 平时的防护检测后, 用的exit(0)的汇编
- 这里注意32位和64位
- 这种其实叫软中断, 怎么破解 -> 全局搜svc