某酷ckey签名生成算法系列--(三)ast代码控制流平坦化
某酷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代码控制流平坦化相关推荐
- C# 发送xml报文到用友U8生成凭证系列四(Biz代码)最终代码
C# 发送xml报文到用友U8生成凭证系列一(配置信息) C# 发送xml报文到用友U8生成凭证系列二(基础代码) C# 发送xml报文到用友U8生成凭证系列三(Modal代码) C# 发送xml报文 ...
- API接口签名生成算法和签名验证算法
1.参考网上资料和书本资料,实现了API接口签名生成算法和签名验证算法. (1)参考资料:https://www.jianshu.com/p/d47da77b6419 (2)参考书籍:高级软件架构师教 ...
- 【算法系列 三】 Quene
为什么80%的码农都做不了架构师?>>> 1. 拓扑排序问题(HDU 1285) import java.io.BufferedReader; import java.io.I ...
- hilbert曲线序编码matlab,Hilbert曲线扫描矩阵的生成算法及其MATLAB程序代码
Hilbert曲线扫描矩阵的生成算法及其MATLAB程序代码 王笋,徐小双(华中科技大学控制科学与工程系,武汉 430074) 摘 要 Hilbert曲线是一种重要的图像处理工具,在图像处理,特别是图 ...
- 利用AST对抗js混淆(三) 控制流平坦化(Control Flow Flattening)的处理
控制流平坦化 参考:https://security.tencent.com/index.php/blog/msg/112 控制流平坦化,简单来讲就是将代码块之间的关系打断,由一个分发器来控制代码块的 ...
- 经典算法系列三----堆排序
花了些时间好好看了堆排序的内容,代码也敲了,现在来总结一下. 为了说明白点,有些图片我就从网上截取了. 首先是堆的概念. 数据结构中的堆,又叫二叉堆 一般用数组来表示堆得结构,或者说是把堆数组化.举个 ...
- 【python算法系列三】 希尔排序算法
希尔排序,又叫"缩小增量排序",是对插入排序进行优化后产生的一种排序算法.它的执行思路是:把数组内的元素按下标增量分组,对每一组元素进行插入排序后,缩小增量并重复之前的步骤,直到增 ...
- 【单机版,以两个文件为例】K-Shingle+最小Hash签名+LSH算法+LSH族....Java代码
import java.util.ArrayList; import java.util.Random; import java.util.Scanner; import java.io.*; imp ...
- C# 发送xml报文到用友U8生成凭证系列二(基础代码)
C# 发送xml报文到用友U8生成凭证系列一(配置信息) C# 发送xml报文到用友U8生成凭证系列二(基础代码) C# 发送xml报文到用友U8生成凭证系列三(Modal代码) C# 发送xml报文 ...
最新文章
- 明朝是中国历史上最有骨气的王朝?【ZZ】
- 美国汽车协会实测:行人检测系统都是渣渣,包括特斯拉
- 记一次php项目上线遇到的坑
- python用哪个软件好-写 Python 哪个编辑器 / IDE 最好用?
- 柴油发电机并机母线之间母联的设置分析
- [视频]中国军事专家论谷歌地球(Google Earth)
- vs 下如何调试js
- android 多行文字水印,android实现文字水印效果 支持多行水印
- Unity5 Space Shooter基础部分开发笔记
- 如何判断对方列表里是不是好友_微信如何快速查看是否为好友关系
- Sublime Merge for Mac(git客户端软件)2064
- Ignite 的使用过程(一)
- 均匀分布的期望和方差
- 【Java并发编程 四】Java的进程与线程
- 中关村刀片机服务器销售,刀片服务器
- 常用八大测试用例设计方法
- 省心又省力的华为云等保安全服务----助力企业等保快速通过
- 华为快应用IDE:如何使用华为快应用IDE进行快应用测试
- Flash鼠绘入门第六课:青翠竹子绘制过程-Flash鼠绘青翠竹子1
- 软工网络15团队作业8——Beta阶段敏捷冲刺
热门文章
- 性能测试指标和报告解析
- ElasticSearch的安装以及与springboot的集成
- 计算机组成原理题目透析(2)
- 直流电机驱动保护方案
- python哥德巴赫猜想证明要求其中一个素数最小_第4-4章“哥德巴赫猜想”的验证(20分),浙大,版,Python,程序设计,题目,集第...
- 安全的网络通道——网络准入之二层准入
- Linux下常用的工具软件
- QXcbConnection: Could not connect to display :0
- FlinkSQL to Kafka连接器报错:could not find any factory for identifier ‘kafka‘ that implements
- vol.173 乱炖 · 公司基因论靠不靠谱?