JS反混淆-控制流平展(二)

本文探讨在JavaScript反混淆过程中遇到的控制流平展中的循环问题。通过寻找最小相邻重复子串来识别并修复循环,利用树形结构表示循环嵌套,并提供递归算法实现循环路径的恢复。
摘要由CSDN通过智能技术生成

0x00 问题定义

接第一篇遗留的问题,在做控制流平展反混淆时,用动态执行的方式获取执行路径时,如果原控制流中存在循环的情况,那么获取到的路径就会有重复的现象,如下所示:

[
  [ 3 ], [ 1 ], [ 2 ], [ 1 ],
  [ 2 ], [ 1 ], [ 2 ], [ 1 ],
  [ 2 ], [ 1 ], [ 2 ], [ 1 ],
  [ 2 ], [ 1 ], [ 2 ], [ 1 ],
  [ 2 ], [ 1 ], [ 2 ], [ 1 ],
  [ 2 ], [ 1 ], [ 2 ], [ 0 ]
]

这里可以发现,[1],[2]的序列重复出现了11次,这种重复的路径信息可以推断其原始路径是一种循环的状态。如果想把它还原成循环的形式,那么就需要做两部分工作:

  1. 识别路径结果中的重复路径。
  2. 以循环的方式修复控制流。

0x01 解决方案

  • 最小相邻重复子串问题

假定有一个字符串A,找到它的最小相邻的重复子串,该子串符合如下特征:

(1)必有一个有多个与其相邻且相同的子串

(2)子串内部不存在重复子串(最小粒度)

这样的子串,就是要找的典型的执行路径存在循环的情况,最小子串即循环内部的逻辑。

如上所示执行路径,其存在一个最小相邻重复子串[1],[2],长度为2,起始位置是1,重复了11次。就可以用1,2,11这样的三元组来表示查找结果。

还原时&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值