-
-
[原创] 关于多版本跟踪如何通过特征码快速定位函数
-
2021-9-11 16:30 4813
-
引出问题
1.逆向产品迭代快,如何快速定位算法处
现如今大厂APP版本更新实在太快,轻则2天重则7天必定更新一个小版本,这叫导致我们刚刚把老版本的算法分析出来,结果人家就更新了,就算只更改一小点地方,如果直接重新定位算法位置也是件非常繁琐的事情!
2.So层定位,对比
以上是某APK的一个特别的函数,一个是15版本,一个是16版本 期间跨越了大约16次迭代.但是经过重新定位我们发现 他的逻辑应该是没有改变. 如果我们能拿到老版本的秘钥位置,如果新版本更新了秘钥,我们只需要快速定位这个位置就好.
而大部分厂商也不可能经常性的把一个算法大改,所以寻找特征对于连续跟踪特别有用.
3.上干货,PC时代遗留的经验,特征码匹配
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | from idaapi import * from keystone import * ks = Ks(KS_ARCH_ARM, KS_MODE_ARM) #ks = Ks(KS_ARCH_ARM64,KS_MODE_LITTLE_ENDIAN) print ( "MagicIllusion Find" ) def ks_disasm(dis_str): global ks encoding, count = ks.asm(dis_str) return encoding func_start = 0x10000 func_end = func_start + 0x40000 #print(bytes(ks_disasm("ORR W11, W11, W15,LSR#26"))) for i in range (func_start, func_end): if get_bytes(i, 8 , 0 ) = = bytes(ks_disasm( "AND R7, R1, R5,LSR#11" ) + ks_disasm( "ORR R7, R7, R5,LSR#31" )): patch_start = i print ( hex (patch_start)) |
以上脚本就是在IDC里寻找特征码的脚本,有时候可能一条指令无法精确查找,需要各位基于场景小小的修改一下
这里我们就找到了两个匹配的地方,剩下的操作就简单了,再进IDA中精准比对一下
经过对比一模一样,定位成功.下一步分析就OK啦!
总结
技术手段比较简单,而且也是PC遗留下来的手段.但是对于项目需要的话还是很有用的.
赞赏
他的文章
看原图