块调度只是各个地方叫法不一样,这个就和开源的Hikari,
https://github.com/HikariObfuscator/Hikari/blob/release_60/lib/Transforms/Obfuscation/IndirectBranch.cpp
这部分代码类似,光这个块调度相对较弱,与苹果这个比较。聚安全(顶象)快调度,还有我自己做的也相对要强一些。
第一次接触这种混淆是为了开发一个类似的混淆(2018年6月),处于好奇心去分析,当时能做到函数中的块与块之间跳转的计算。
函数入口第一个块到第二个块之间当时是没有找到方法的,估计是被吓到了,分析过的人都说是和this(r0)指针相关的,没法解,
this(r0) 指针是动态的。这个一直在我心里有悬念,所以有花了两个晚上分析,然后发现都可以解了。
特别强调
这里只分析通过静态的方式计算下一个块的偏移,单纯是解混淆不存在对功能的分析,更不涉及黑灰。
块调度的原理无非就是把跳转指令diy下,由跳转到一个偏移变成跳转到一个寄存器的值。寄存器的值就可以通过算法计算得到呢。
先解函数中间的块,结构如下,
这个相对简单,口算假设下w8和w26的值就能得到x11.
在两种条件下分别得到跳转地址
口算不能解决数量级问题,还是得借助工具算,这里我使用unicorn https://github.com/unicorn-engine/unicorn
带this(r0)指针,或者说是带参数的,比如下图的X19,依赖于sub_100CB3AEC返回值
sub_100CB3AEC的参数往上又依赖于一堆东西,瞬间有点懵逼了。X0->X19->X0->X8->X9->SP一系列的回朔有点晕,
不过神奇的地方就是这是苹果的障眼法。这个函数是一个纯计算函数,也可知道参数是int8_t类型那么直无非就是0-0xff.继续带入计算,
解得w0永远等于0xfffffff0。这样这部分就和函数中间的一样了,同理解得x19等于0x1001594e4
然后毋庸置疑的进入了下一个函数sub_1001594E4
要分析流程解一两个肯定不算,还得继续分析,到这个函数更懵逼的事情发生了。
也是上一次我没解的问题,如下图,要得到X9,往上W20->W9->X25->X0.不一样的X0出现了,
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2018-9-26 20:25
被lpcdma编辑
,原因: