V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
yxnwh
V2EX  ›  JavaScript

网站的 js 文件被编码/加密了,请教如何解码/解密

  •  
  •   yxnwh · 314 天前 · 3628 次点击
    这是一个创建于 314 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近想研究下小蚁 app 的自动化签到,发现其签到的链接中有一个 hmac 参数应该是由一定规律生成并经 base64 加密的,于是想从网站的 js 文件中寻找 hmac 参数的生成规律,结果发现 js 文件均被编码 /加密化了,想请教该如何解码 /解密,谢谢!

    http://app.xiaoyi.com/cnApph5/_nuxt/f118e97bbcaab8f492a4.js

    http://app.xiaoyi.com/cnApph5/_nuxt/ae71fc08bc9bf6f6ccf5.js

    http://app.xiaoyi.com/cnApph5/_nuxt/26e00da666be514e9378.js

    http://app.xiaoyi.com/cnApph5/_nuxt/d1077a3d71f4093bd8d2.js

    http://app.xiaoyi.com/cnApph5/_nuxt/3d1b0b24ca149b778f98.js
    第 1 条附言  ·  313 天前
    研究了一天,基本已经搞定:),下面说下思路:

    1.苹果手机的 thor 抓包和调试着实不方便,于是在电脑上装 fiddler ,然后苹果手机和电脑在同一局域网,让电脑上的 fiddler 直接抓苹果手机的包,具体教程百度“fiddler ios 抓包”自行查阅;

    2.苹果手机上删除小蚁 app ,然后重新下载,此时开启抓包,在小蚁 app 上登录,进入签到页面,再进入任务中心,基本所需的 js 文件和一些链接就都抓到了,删除 app 再重新下载的目的是尽可能完整的抓到所有的包;

    3.查看 fiddler 的抓包记录,重点关注 js 文件,发现了 8 个 js 文件(连续的 8 个,排排坐,工整!!!),全部下载,并经过美化 /反混淆后保存在本地,方便分析

    4.对 8 个 js 文件全文搜索“hmac”,发现只有 247c36a83845ea02d71b.js 、d1077a3d71f4093bd8d2.js 和 e22a36afc057312c398a.js 这 3 个 js 文件含此关键字,故开始重点分析;

    5.结合 vscode 对含有 hmac 关键词的函数中的代码逐条调试后(为啥要用 vscode ,因为我读不懂啊),发现只有 247c36a83845ea02d71b.js 文件中的 hmac 函数是比较清晰,然后发现了该函数下的 Base64 和 HmacSha1 ,百度一下,发现刚好是 cryptojs 内的函数,而且还贴出了 HmacSha1 的加密方法,跟 js 文件中的十分相似,那就顺便借用把原 js 中复杂难懂的变量都替换掉,至此,加密方法已经搞定;

    6.加密方法虽已搞定,但密钥 token 和 tokensecret 还没找到,于是到处搜索 token 关键字,最后在 auth 登录链接的响应 body 下发现 token 和 token_secret ,瞬间恍然大悟,原来签到的链接为 get 请求,且请求的 header 里面根本没有 cookie 相关的参数,没有 cookie 之类的参数,服务器怎么判定是你登录还是我登录啊?于是这里的密钥 token 和 tokensecret 就身兼二职顺道充当了一把 cookie 角色

    7.hmac 实质是以 token 和 token_secret 作为密钥,以 get 请求中的 x-www-form-urlencoded 中的完整数据作为数据源进行加密,其中 x-www-form-urlencoded 中 timestamp 保证了 hmac 会一直变化,实质也是对 token 的一种很好的保护,另外一方面,这也是一种很好的二次校验,如果你不对 hmac 进行深入分析,随意修改 hmac 或者 x-www-form-urlencoded 中的数据,响应代码就会报错,无法返回正确的 body
    第 2 条附言  ·  313 天前
    这次解密确实有很大的运气成分,后面还要继续保持学习劲头,扎扎实实的学好 js 基本知识(本人目前的 js 知识都是看别人的签到脚本,然后依葫芦画瓢边百度边自己写 js 代码得来的)

    最后附上解密函数:

    var HmacSha1 = require('crypto-js/hmac-sha1');
    var Base64 = require('crypto-js/enc-base64');
    ss = {'token':'xxxx','token_secret':'xxxx'};
    time = new Date().getTime();
    console.log(time);
    hh = 'appPlatform=yihome&region=CN&seq=1&timestamp='+time+'&userid=xxxx';
    function t(a, b)
    {
    m = b.token,
    n = b.token_secret,
    o = Base64.stringify((HmacSha1(a,m+'&'+n)));
    c = 'hmac=' + encodeURIComponent(o) + '&' + a;
    console.log(c);
    return c
    }

    t(hh,ss);
    23 条回复    2022-01-29 19:38:22 +08:00
    mm163
        1
    mm163  
       314 天前
    就是简单的 ascii 码,把\xXX 的都转成字符就行了。
    pengtdyd
        2
    pengtdyd  
       314 天前
    换一个思路,不解密,直接用它的源码
    yxnwh
        3
    yxnwh  
    OP
       314 天前
    @mm163 多谢,我转换一下试试
    yxnwh
        4
    yxnwh  
    OP
       314 天前
    @pengtdyd 有好多个 js 文件,不知道哪一个包含生成 hmac 函数的
    coolan
        5
    coolan  
       314 天前
    https://www.prettifyjs.net/ 这玩意看起来乱得很
    locoz
        6
    locoz  
       314 天前
    KuroNekoFan
        7
    KuroNekoFan  
       314 天前
    为什么要研究这个呢,彻底点换成 wasm 模块你就啥都看不到了啊
    musi
        8
    musi  
       314 天前
    相比于解密,感觉运行时去 debug 要简单一点
    yxnwh
        9
    yxnwh  
    OP
       314 天前
    @musi 小蚁 app 是在手机上运行的一个 app ,不是一个单独的网页,可以 fiddler 抓包然后 debug 吗?对这一块不熟悉,求一个思路~
    yazoox
        10
    yazoox  
       313 天前
    @locoz 这是个啥网站,还可以还原 js 代码。好清爽!
    你们自己搭的?
    locoz
        11
    locoz  
       313 天前
    @yazoox #10 我们团队的蔡老板搞的一个小工具
    tsanie
        12
    tsanie  
       313 天前
    @locoz 捉个小虫,.ob-recovery .top-bar 加一个 box-sizing: border-box 😂
    lqfxz520
        13
    lqfxz520  
       313 天前
    好奇怎么把代码转吗码的,使用什么工具
    Juszoe
        14
    Juszoe  
       313 天前
    建议反编译 app 进行动态调试,光抓包很难看出什么,何况这 js 并不一定包含 hmac 的加密逻辑
    yxnwh
        15
    yxnwh  
    OP
       313 天前
    @Juszoe 好像被我解决了,分析了另外一个 js ( http://app.xiaoyi.com/cnApph5/_nuxt/247c36a83845ea02d71b.js ),然后搜索 hmac ,就找到了他的加密函数,我对 js 不是太精通,于是借助 vscode 对函数内的每一条语句单独调试,看看结果到底是什么,基本就摸清楚了
    yxnwh
        16
    yxnwh  
    OP
       313 天前
    @locoz 代码粘贴进去点还原,总是报错,还是用回笨办法,用了楼上一位老哥的链接,把 js 美化 /反混淆后直接硬着头皮去研究
    lvsemi1
        17
    lvsemi1  
       313 天前
    @KuroNekoFan 是什么让你产生了 wasm 就解密不了的错觉?
    ClarkAbe
        18
    ClarkAbe  
       313 天前 via Android
    @KuroNekoFan 你这话说得就和 jar 就不能反编译一样,而且 wasm 的可读性其实还更好
    locoz
        19
    locoz  
       313 天前
    @tsanie #12 👌谢谢,已修复
    locoz
        20
    locoz  
       313 天前
    @lqfxz520 #13 这个不叫“转码”,叫“混淆”。原理就是通过将代码解析成 AST ,然后在各个节点前后添加无意义的额外操作或实际根本不会执行的代码,又或是处理成一些对于程序执行而言逻辑一样但人看着会很复杂的样子,处理完再把 AST 转换回代码,就会是这个效果了。

    市面上很多混淆工具都是基于 https://github.com/javascript-obfuscator/javascript-obfuscator 这个项目搞的,基于这个项目的在线工具 https://obfuscator.io/ ,还有一些颜文字混淆之类的简单混淆工具网上搜一下很多,你可以自己玩玩。
    locoz
        21
    locoz  
       313 天前
    @yxnwh #16 报错应该是你提交的那个 JS 做了啥骚操作,工具没处理到,可以把链接发我一下,我让蔡老板看看。
    yxnwh
        22
    yxnwh  
    OP
       312 天前
    getcharch
        23
    getcharch  
       312 天前
    @locoz 反馈一下 中文 unicode 的还原会出现编码不对问题,需与 hex 字符分开处理

    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4924 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 46ms · UTC 03:02 · PVG 11:02 · LAX 19:02 · JFK 22:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.