Anti-Disassembly on ARM64

没被解析的DCQ可以C,但是函数开头结尾定位不准确的C不了即使能C也没法F5,br间接跳转只能靠动态trace。还有虚假控制流里的那些,需要精确地识别然后nop才算过掉。

1 个赞

这是我之前看到的x86平台上的anti-disa的一些技巧。 主要利用的变长指令特点。
anti-disas.pdf (585.9 KB)

ARM64上的比较少,网上我只搜到一篇,用的是PLD(preload)指令。我感觉用处不大。

这里面的很多思路最早期版本的私有光用过,比如说花 + BCF.

总的来说就是,对抗效果小于编译器侧实现的维护成本

1 个赞

ollvm、光、Armariris 的混淆都是基于IR 层实现的,基于 AST 的混淆,能做到语言无关吗?还是只针对特定语言混淆?

哪里做个人感觉都一样,JS也有很多基于AST的混淆方案,看相做到什么程度,背景是我们自己有SDK需要做加固,早期我们也用的OLLVM,但是app需要支持bitcode的时候就出现问题了,并且业务方必须要开启bitcode,找了很多思路去做bitcode的支持,有从苹果下载开源的clang版本拿来编,但是那个版本太老了只支持到ios9,10以后的很多新特性没法支持,后来考虑用vm的方式,解释器用苹果的clang编译,但是这种方式问题也比较多,最大的就是稳定性问题和对浮点计算不支持,使用非常不友好。后来也尝试过用苹果开源的llvm去尝试看能不能适配苹果的clang,但是都失败了,提交到appstore会被打回来。再结合上ollvm这种模式在前端开发上不是很友好比较难推广,比如说对于一般的开发者而言由于丢掉了中间过程,不熟悉的同学定位问题就会比较困难,需要找上下文动态调试去做crash问题定位,对于一些短函数没法支持(basicblock只有一块),还有就是包体积膨胀的问题 最早我也是从这种改源码+内联的方式做的 花指令,平坦化,虚假控制流的 所以后来就想从AST或者IR着手去做一些简单的混淆 由于clang的存在,AST其实是语法无关的,需要适配的就是一些复杂功能需要适配上层语言特性,内联汇编的话还要考虑架构 开发的时候比较不友好,目前还在探索阶段,但是字符串混淆,控制流平坦化,虚假控制流这些操作都是可以实现的

原理老哥也遇到了bitcode支持的问题,我之前也是用ollvm 去加固sdk,加固完集成sdk的app不能开启bitcode了,之前调研过一些加固厂商,好像只有顶象加固完可以支持bitcode,不知道他们怎么做的 。

如果不用高级API的话可以用https://github.com/apple-oss-distributions/clang/tree/clang-800.0.42.1 这个,苹果开源的clang,两个bitcode是一致且向后兼容的

可以请教下张总他们,他们应该研究比我多,我只是兼职做这个TAT

说的是这个吧,https://github.com/javascript-obfuscator/javascript-obfuscator
真羡慕脚本语言,纯字符串解释执行还能玩出来这么多花活来。。

1 个赞

之前打CTF,web题经常搞一些花活在里面,比如利用这种隐藏字符翻转字符串,骚得很。

2 个赞

当然不能, 因为AST本身就是语言相关的

是可以上线的。 整套流水线里有至少三处标记可以被苹果拿来识别是不是用的Apple原版编译器,可以研究一下是不是哪里没Patch完整

2 个赞

楼主您好,请问:在“ 用BR实现间接跳转”章节中,汇编代码 mul x8, x9, x8 表达的是什么意思?
我查了 ARM 的手册了解到“ mul”指的是乘法,例子上应该是 x8 = x9 * x8,我不理解的是为什么需要“x9 需要乘 x8”?在计算乘法的过程中 x8 应该是 0x1,这样做乘法有意义吗?或者说目的是为了混淆?

论坛上的一个例子,随意贴过来的,希望不要误解。
:grinning_face_with_smiling_eyes: 理解原理可以随意发挥。

2 个赞

有一种可能是不能用mov x8,x9这样的指令,猜测哈,好像是内联汇编对寄存器操作有限制

1 个赞

你好张哥,有事想咨询一下您,您无法私信请问怎么能联系到您

这也太牛逼了吧。

牛逼你倒是来个赞啊

1 个赞

学习了, 然后逆向的工作难度又提升了, 感谢对手 :+1:

mark