【猿人学】第一题逆向分析

难点

源码压缩混淆反调时间检测

Tip:文末可以下载例子

猿人学官网:http://match.yuanrenxue.com/

确定逆向目标

这个 m

mark

开始逆向

过反调

mark

跟值

此处是 加密的url 在发送出去最后出现的地方,我们可以通过函数调用的栈,进行跟值,找到大体加密的地方

mark

本地调试

最终我们跟到了此处,发现它在 <script> 标签里,我们无法格式化,就无法断点调试

mark

我采用把整个网页 扒下来,修改其中的 <href> 为绝对路径,采用fiddler 本地替换网页响应,实现把在本地把 <script> 压缩的代码 格式化,在手动加断点

mark

寻找 window.f 值

逆向需要有怀疑精神,oo0O0() 这个函数返回空,不会这么简单吧,进入它

mark

定位加密位置

经过分析最终确定在这一行

mark

改造加密函数

到这里,差不多就分析完成,就改造一下加密函数就完成了

function f(){
    var mv =  Date.parse(new Date()) + 100000000;
    var  window = {};
    var m = eval(" 把 eval 里的全部复制过来 window.f = hex_md5('bigdataboy')".replace(/bigdataboy/, mv)) // 这里有个小坑 必须要用替换,因为拼接的 md5 值是不对的
    return m + '丨' + mv / 1000
}

mark

请求计算结果

import execjs
import requests

def get_m():
    return execjs.compile(open('./main.js', 'r', encoding="utf-8").read()).call('f')

def app(page: int) -> dict:
    rep = requests.get(
        url="http://match.yuanrenxue.com/api/match/1",
        headers={
            "Cookie": "自己的 sessionid",
            'User-Agent': 'yuanrenxue.project',
        },
        params={"page": page,"m": get_m(),}
    )
    return rep.json()

if __name__ == '__main__':
    sum = 0
    count = 0
    for _ in range(1, 6):
        data = app(_)
        count = count + len(data.get("data"))
        for value in data.get("data"):
            sum = sum + value.get("value")
    print(sum / count)

结果成功

mark

完整代码:https://pan.bigdataboy.cn/s/Nnsy

发表评论 / Comment

用心评论~