# 知识点: AES算法魔改，md5算法魔改,环境检测

![debugger](./img/1.png)

第二届猿人学js逆向大赛，本以为送分题分分钟搞定，没想到第一题就这么难。

查看请求存在`token`加密参数，接下就是打断点找到加密点破解

![debugger](./img/2.png)

直接进入下一步函数

![debugger](./img/3.png)

可以看到如下代码

    var e = Date['now']()
      , f = a('crypto-js')
      , g = '666yuanrenxue66'
      , h = f['AES']['encrypt'](e + String(d), g, {
        'mode': f['mode']['ECB'],
        'padding': f['pad']['Pkcs7']
    })
      , i = '/api/match2023/1'
      , j = {
        'page': String(d),
        'token': f['MD5'](h['toString']())['toString'](),
        'now': e
    };

可以清楚的看到`AES`加密和`md5`加密，控制台调试了一下发现加密是魔改过的。

![debugger](./img/4.png)

接下来不要急着去扣加密代码，仔细看整段js代码

![debugger](./img/5.png)

发现这就是`browserify`打包，类似于`webpack`打包,这就比较简单了

直接扣下全部代码，在模块加载处插入`window.dddd = c;`，控制台输出`window.dddd;`就可以查看全部的模块

![debugger](./img/6.png)

先解决md5加密问题，找到模块位置，尝试控制台输出

**浏览器控制台**

![debugger](./img/7.png)

**源代码控制台**

![debugger](./img/8.png)

经测试发现，明文1加密后值是不同的，这里就要思考一个问题，同样的浏览器环境，为什么加密值不同。

我这里总结2种情况，一是当前页面的网址不同，二是代码没有压缩。

有了猜想就开始执行，搜索`location['href']`

![debugger](./img/9.png)

对比

![debugger](./img/10.png)

对比发现，在加密中存在判断当前网址的代码

将`location['href']['indexOf']('topic') !== -0x1`改成`location['href']['indexOf']('topic') == -0x1`

测试一下

![debugger](./img/11.png)

成功打印出相同的密文，以此类推`AES`加密也存在环境检测的代码，删除或者改写就OK了