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

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

2021-9-11 16:30
5741

现如今大厂APP版本更新实在太快,轻则2天重则7天必定更新一个小版本,这叫导致我们刚刚把老版本的算法分析出来,结果人家就更新了,就算只更改一小点地方,如果直接重新定位算法位置也是件非常繁琐的事情!

图片描述

图片描述

以上是某APK的一个特别的函数,一个是15版本,一个是16版本 期间跨越了大约16次迭代.但是经过重新定位我们发现 他的逻辑应该是没有改变. 如果我们能拿到老版本的秘钥位置,如果新版本更新了秘钥,我们只需要快速定位这个位置就好.
而大部分厂商也不可能经常性的把一个算法大改,所以寻找特征对于连续跟踪特别有用.

以上脚本就是在IDC里寻找特征码的脚本,有时候可能一条指令无法精确查找,需要各位基于场景小小的修改一下

图片描述
这里我们就找到了两个匹配的地方,剩下的操作就简单了,再进IDA中精准比对一下
图片描述

经过对比一模一样,定位成功.下一步分析就OK啦!

技术手段比较简单,而且也是PC遗留下来的手段.但是对于项目需要的话还是很有用的.

 
 
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))
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")
 

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//