首页
论坛
课程
招聘
[原创] 关于多版本跟踪如何通过特征码快速定位函数
2021-9-11 16:30 2342

[原创] 关于多版本跟踪如何通过特征码快速定位函数

2021-9-11 16:30
2342

引出问题


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遗留下来的手段.但是对于项目需要的话还是很有用的.


2021 KCTF 秋季赛 防守篇-征题倒计时(11月14日截止)!

收藏
点赞1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回