某酷ckey签名生成算法系列--(三)ast代码控制流平坦化


观察三个switch的值分别是Ci、mi和Ai。而这三个值又因为li的确定而确定的。也就是说已知li的值,就可以分别计算出Ci、mi和Ai,就可以确定执行的是哪一条语句。那么反过来,如果已知Ci、mi和Ai三个值,也可以反向计算出li的值了。

那么按照这个思路。就可以把多重的case的值计算出其对应最上一层的值,变成最简单的switch结构,形如下面

******省略代码******
for (var li = 16996; void 0 !== li;) {var Ci = 31 & li,fi = li >> 5,mi = 31 & fi,bi = fi >> 5,Ai = 31 & bi;switch (Ci) {case 0:switch (mi) {case 0:switch (Ai) {case 0:Dn.push(0), li = 11522;break;case 1:L = mo, li = 24641;break;
******省略代码******

上面这样的代码,应该被压缩成下面

******省略代码******
for (var li = 16996; void 0 !== li;) {switch (li) {case 0:Dn.push(0), li = 11522;break;case 1024:L = mo, li = 24641;break;
******省略代码******

使得原来需要处理三个变量的结构,直接变成只需要处理一个变量,调试上去会变得简单很多。


接着下来调试发现,一条语句里面是一个逗号表达式,一次就执行完了,没有办法一句一句的分析,所以想把这些逗号表达式都分开,更加清晰的来分析


这里用蔡老板的代码直接搞定,这一步相对是简单的,就不太详细说了,看看效果对比


此时可以看到,所有的逗号表达式都变成了一条一条的语句了,为后面的去除控制流平坦化提供了可能。

这时即使调试代码,依然会发现运行过程中,代码一直上下跳转,而不是从上往下的执行,需要想办法把这种跳来跳去的情况去除。

仔细观察可以发现,每一个case的最后一句,总是指向他的下一个case,那么如果把每一个case,按照这样拼接起来,那么函数执行的时候,不就不会再跳来跳去的了

******省略代码******case 0:Dn.push(0);li = 11522;break;
******省略代码******

拼接一次变成

******省略代码******case 0:Dn.push(0);li = z ? 8833 : 15362;break;******省略代码******

经过非常多次拼接后,使得每一个switch仅仅只有一个case。

switch中只有一个case,不是相当于没有这个结构吗,最后直接去掉这个switch结构,仅仅保留函数内容


这个时候控制流平坦化已经去除完成,整个代码已经是从上往下的执行了。但是代码中的字符串还是被混淆的,形如下面。下一章尝试还原这些字符串

某酷ckey签名生成算法系列--(三)ast代码控制流平坦化相关推荐

  1. C# 发送xml报文到用友U8生成凭证系列四(Biz代码)最终代码

    C# 发送xml报文到用友U8生成凭证系列一(配置信息) C# 发送xml报文到用友U8生成凭证系列二(基础代码) C# 发送xml报文到用友U8生成凭证系列三(Modal代码) C# 发送xml报文 ...

  2. API接口签名生成算法和签名验证算法

    1.参考网上资料和书本资料,实现了API接口签名生成算法和签名验证算法. (1)参考资料:https://www.jianshu.com/p/d47da77b6419 (2)参考书籍:高级软件架构师教 ...

  3. 【算法系列 三】 Quene

    为什么80%的码农都做不了架构师?>>>    1. 拓扑排序问题(HDU 1285) import java.io.BufferedReader; import java.io.I ...

  4. hilbert曲线序编码matlab,Hilbert曲线扫描矩阵的生成算法及其MATLAB程序代码

    Hilbert曲线扫描矩阵的生成算法及其MATLAB程序代码 王笋,徐小双(华中科技大学控制科学与工程系,武汉 430074) 摘 要 Hilbert曲线是一种重要的图像处理工具,在图像处理,特别是图 ...

  5. 利用AST对抗js混淆(三) 控制流平坦化(Control Flow Flattening)的处理

    控制流平坦化 参考:https://security.tencent.com/index.php/blog/msg/112 控制流平坦化,简单来讲就是将代码块之间的关系打断,由一个分发器来控制代码块的 ...

  6. 经典算法系列三----堆排序

    花了些时间好好看了堆排序的内容,代码也敲了,现在来总结一下. 为了说明白点,有些图片我就从网上截取了. 首先是堆的概念. 数据结构中的堆,又叫二叉堆 一般用数组来表示堆得结构,或者说是把堆数组化.举个 ...

  7. 【python算法系列三】 希尔排序算法

    希尔排序,又叫"缩小增量排序",是对插入排序进行优化后产生的一种排序算法.它的执行思路是:把数组内的元素按下标增量分组,对每一组元素进行插入排序后,缩小增量并重复之前的步骤,直到增 ...

  8. 【单机版,以两个文件为例】K-Shingle+最小Hash签名+LSH算法+LSH族....Java代码

    import java.util.ArrayList; import java.util.Random; import java.util.Scanner; import java.io.*; imp ...

  9. C# 发送xml报文到用友U8生成凭证系列二(基础代码)

    C# 发送xml报文到用友U8生成凭证系列一(配置信息) C# 发送xml报文到用友U8生成凭证系列二(基础代码) C# 发送xml报文到用友U8生成凭证系列三(Modal代码) C# 发送xml报文 ...

最新文章

  1. 明朝是中国历史上最有骨气的王朝?【ZZ】
  2. 美国汽车协会实测:行人检测系统都是渣渣,包括特斯拉
  3. 记一次php项目上线遇到的坑
  4. python用哪个软件好-写 Python 哪个编辑器 / IDE 最好用?
  5. 柴油发电机并机母线之间母联的设置分析
  6. [视频]中国军事专家论谷歌地球(Google Earth)
  7. vs 下如何调试js
  8. android 多行文字水印,android实现文字水印效果 支持多行水印
  9. Unity5 Space Shooter基础部分开发笔记
  10. 如何判断对方列表里是不是好友_微信如何快速查看是否为好友关系
  11. Sublime Merge for Mac(git客户端软件)2064
  12. Ignite 的使用过程(一)
  13. 均匀分布的期望和方差
  14. 【Java并发编程 四】Java的进程与线程
  15. 中关村刀片机服务器销售,刀片服务器
  16. 常用八大测试用例设计方法
  17. 省心又省力的华为云等保安全服务----助力企业等保快速通过
  18. 华为快应用IDE:如何使用华为快应用IDE进行快应用测试
  19. Flash鼠绘入门第六课:青翠竹子绘制过程-Flash鼠绘青翠竹子1
  20. 软工网络15团队作业8——Beta阶段敏捷冲刺

热门文章

  1. 性能测试指标和报告解析
  2. ElasticSearch的安装以及与springboot的集成
  3. 计算机组成原理题目透析(2)
  4. 直流电机驱动保护方案
  5. python哥德巴赫猜想证明要求其中一个素数最小_第4-4章“哥德巴赫猜想”的验证(20分),浙大,版,Python,程序设计,题目,集第...
  6. 安全的网络通道——网络准入之二层准入
  7. Linux下常用的工具软件
  8. QXcbConnection: Could not connect to display :0
  9. FlinkSQL to Kafka连接器报错:could not find any factory for identifier ‘kafka‘ that implements
  10. vol.173 乱炖 · 公司基因论靠不靠谱?