JS逆向分析某枝网的HMAC加密、wasm模块加密

这是我2022年学做JS逆向成功的例子,URL:(脱敏处理)aHR0cHM6Ly93d3cuZ2R0di5jbi9hdWRpb0NoYW5uZWxEZXRhaWwvOTE=

逆向分析:

1、每次XHR的GET请求携带的headers包括:

python 复制代码
{
    "X-ITOUCHTV-Ca-Timestamp": "1697608868940",
    "X-ITOUCHTV-Ca-Signature": "hGlre/JKwbHvCWLpO5JQdUHF7nP4HiaA5ya1DenJToA=",
    "X-ITOUCHTV-Ca-Key": "89541443007807288657755311869534",
    "X-ITOUCHTV-CLIENT": "WEB_PC",
    "X-ITOUCHTV-DEVICE-ID": "WEB_1c2f8b90-6bd8-11ee-96e0-5bc8d7091aa8"
}

2、该网站的JS文件采用webpack形式。找出关键的加密逻辑:

javascript 复制代码
this.s = function(t, n, a) {                
    var s = i.default.getUser
      , u = i.default.getJWT
      , c = i.default.getDeviceId
      , d = (new Date).getTime()
      , f = {}
      , p = ""
      , _ = "";
    a && (p = (0,
    r.default)(a),
    _ = l.default.stringify(p));
    var m = "".concat(t, "\n").concat(n, "\n").concat(d, "\n").concat(_);
    return f = {
        "Content-Type": "application/json",
        "X-ITOUCHTV-Ca-Timestamp": d,
        "X-ITOUCHTV-Ca-Signature": l.default.stringify((0,
        o.default)(m, "dfkcY1c3sfuw0Cii9DWjOUO3iQy2hqlDxyvDXd1oVMxwYAJSgeB6phO8eW1dfuwX")),
        "X-ITOUCHTV-Ca-Key": "89541443007807288657755311869534",
        "X-ITOUCHTV-CLIENT": "WEB_PC",
        "X-ITOUCHTV-DEVICE-ID": e.__DEVICEID__ || c()
    },
    u() && (f.Authorization = u()),
    s() && s().pk && (f["X-ITOUCHTV-USER-PK"] = s().pk),
    e.__X_FORWARDED_FOR__ && (f["X-Forwarded-For"] = e.__X_FORWARDED_FOR__),
    f
};

3、初步分析:

(1)X-ITOUCHTV-Ca-Timestamp很明显是时间戳。

(2)X-ITOUCHTV-Ca-Key这个值是固定的"89541443007807288657755311869534",可以写死。

(3)"X-ITOUCHTV-CLIENT": "WEB_PC"也是固定写死的。

(4)X-ITOUCHTV-DEVICE-ID:设备UUID,随便撸一串字符串都可以,但该网站要求一定要以 "WEB_"开头,比如:WEB_9527-3547-709394。

(5)X-ITOUCHTV-Ca-Signature:这是至关重要的签名值。

javascript 复制代码
l.default.stringify((0, o.default)(m, "dfkcY1c3sfuw0Cii9DWjOUO3iQy2hqlDxyvDXd1oVMxwYAJSgeB6phO8eW1dfuwX"))

这一行代码前面的 l.default 可以不管了,因此理解为:o.default(m, "dfkcY1c3sfuw0Cii9DWjOUO3iQy2hqlDxyvDXd1oVMxwYAJSgeB6phO8eW1dfuwX");

其中长串字符是密钥,通过 o.default 方法把 m 值和密钥进行加密。

m 是什么?上面几行已写清楚了:

javascript 复制代码
var m = "".concat(t, "\n").concat(n, "\n").concat(d, "\n").concat(_);

m 是由 t、n、d、值串联起来的字符。通过断点跟踪,可以得知:t 是发送请求的方式(GET、POST、OPTION之类),n 是URL链接,d 是时间戳,至于""嘛,是个空字符串,然后每个子字符串以换行符拼接,因此这一行可以简化成 m = t + '\n' + n + '\n' + d + '\n'。

4、算法分析:

通过断点跟踪上面提及的 o.default 方法,o 值来源于"o = a(n(1305))",是通过WebPack调取第序列号为1305的方法,可以看到

javascript 复制代码
function(e, _t, n) {
    var r;
    e.exports = (r = n(43),
    n(393),
    n(285),
    r.HmacSHA256)
},

也就是使用HmacSHA256算法加密,然后输出BASE64字符串。

找一个Python的HmacSHA256的加密代码尝试一下:

python 复制代码
import hmac
from base64 import b64encode
from hashlib import sha256


key = '。。。。。。'  # HMAC-SHA256加密的密钥
text = '。。。。。。' # 加密前的明文字符串
signature = str(b64encode(hmac.new(key.encode('utf-8'), text.encode('utf-8'), digestmod=sha256).digest()), 'utf-8')
print(signature)

输入明文、密钥,生成的结果结果对碰上了,跟开发者工具里看到的请求头的X-ITOUCHTV-Ca-Signature一致,幸好该网站没有魔改加密算法,因此接下来用Python的 hmac 库和 base64 库加密代码就水到渠成了。

2023年10月19日更新:

最近该网站的.js文件作了修改,在所有.js文件里已经找不到上述提到的加密逻辑了,而是通过wasm模块(WebAssembly)进行加密,逆向的难度进一步增强。

我通过逆向wasm、插桩分析,最后得知wasm只是纸老虎,加密算法依然是HmacSHA256而且没有被魔改,只是密钥以及 X-ITOUCHTV-Ca-Key 的值变了。

需要源代码的朋友欢迎联系我(+V:Scott373519)。

参考来源:

Python使用HmacSHA256并用base64加密_sha256+base64-CSDN博客

相关推荐
爱跑步的程序员~10 分钟前
RAG 技术全面解析:从原理到实践
python·ai·langchain·rag
gf132111120 分钟前
飞书长连接_事件订阅(接收消息,审批任务状态变更)
开发语言·python·飞书
vx_biyesheji000421 分钟前
计算机毕业设计:Python医疗数据分析平台 Flask框架 数据分析 可视化 医疗大数据 用户画像(建议收藏)✅
大数据·python·深度学习·数据分析·django·flask·课程设计
m0_7020365330 分钟前
CSS如何兼容新旧方案结合响应式容器查询
jvm·数据库·python
ZHW_AI课题组40 分钟前
基于ElasticNet网格搜索的汽车燃油效率预测
python·机器学习·回归算法
之歆42 分钟前
DAY_25 JavaScript 原型、原型链与值类型/引用类型 ── 深度全解(下)
开发语言·javascript·ecmascript
在坚持一下我可没意见1 小时前
Python 修仙修炼录 05:循环神通,省去无用苦修
开发语言·python·面试·入门·循环·复习
咪饭只吃一小碗1 小时前
从变量提升到 V8 预编译,彻底搞懂 JS 执行机制
javascript
农夫三拳有点疼=-=1 小时前
vue3实现输入框标签和文本交互
javascript·vue.js·交互
大飞记Python1 小时前
从“驱动地狱”到一行代码:WebDriverManager使用手记(附模板)
python·测试