漁滒 发表于 2021-12-26 13:39

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

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


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

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

```javascript
******省略代码******
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;
******省略代码******
```

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

```javascript
******省略代码******
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,按照这样拼接起来,那么函数执行的时候,不就不会再跳来跳去的了

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

拼接一次变成

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

******省略代码******
```

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


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


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

zhchxu123 发表于 2021-12-26 15:12

学到了学到了,每天看一看{:17_1068:}

zztoozzt 发表于 2021-12-26 16:44

大佬太强了,我现在还在学习研究你上次分享的猿人学第二题思路{:1_907:}

xlsz 发表于 2021-12-26 17:08

支持支持!

mark68 发表于 2021-12-27 17:32

还是有点太难对于我来说。。

ll090822 发表于 2021-12-29 08:41

谢谢分享,学习的好东西

hua111 发表于 2022-1-17 15:17

Ram9943 发表于 2022-3-14 11:48

大佬厉害

lijun19990416 发表于 2022-8-8 09:43

大佬,能不能发一下相应的代码呀:lol

rmin 发表于 2022-9-5 17:57

大佬,想咨询一下如果是出现那种控制流死循环的情况下,有没有什么好方法来进行处理。
页: [1]
查看完整版本: 某酷ckey签名生成算法系列--(三)ast代码控制流平坦化