12下一页
返回列表 发布新帖

[教程] 记一次爱丽丝书屋的正文解密

867 18
发表于 2025-8-16 12:55:46 | 查看全部 阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 凌零 于 2025-8-16 13:15 编辑

目标网址:https://www.alicesw.com/book/36968/f679b4cdb5096.html
找正文: 图片.webp
加密过后的,base64无法正常解密,定位到解密函数:
图片.webp
看看这个js:
图片.webp
同样混淆过,不过解混淆比较容易:
1. 提取字符串表
这段代码的核心混淆方式是通过 _0x464f() 返回的字符串数组进行引用。我们可以先提取这个字符串数组:
  1. const _0x464f = () => [
  2.     '310lmMnFN', 'TextDecoder not available', 'decrypt_base64', 'Module', 'written',
  3.     'instantiate', 'slice', '557827htkZsG', '130CdByor', '343704MpArnB',
  4.     'exports', 'length', 'instantiateStreaming', 'search', '5298265OQixwu',
  5.     '10715728EJQZxF', 'set', '__wbindgen_string_new', '{}.constructor("return this")( )',
  6.     'application/wasm', '`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n',
  7.     'apply', 'TextEncoder not available', 'byteLength', 'info', 'warn',
  8.     'exception', '__wbindgen_malloc', 'utf-8', 'Content-Type', 'toString',
  9.     '5663784CmmXTj', 'console', 'bind', '1778634UvUAql', 'using deprecated parameters for `initSync()`; pass a single object instead',
  10.     'url', 'Instance', 'prototype', '868077ByItEL', 'encodeInto',
  11.     'encode', 'table', 'subarray', 'decode', '(((.+)+)+$',
  12.     '__wbindgen_export_0', '__wbindgen_start', 'function', 'memory', '__wbindgen_wasm_module',
  13.     '__wbindgen_free', 'constructor', 'grow', 'string', 'undefined',
  14.     'trace', 'wbg', 'return (function() ', '4fEwMZg', 'alicesw_bg.wasm', 'getPrototypeOf'
  15. ];
复制代码

2. 替换 _0x19734b 和 _0x4d39
_0x19734b 和 _0x4d39 是同一个函数,作用是返回字符串数组中的某个索引对应的字符串
3. 替换 _0x1747da 和 _0xdb32ba
这两个函数是反调试代码:
  • _0x1747da 检查 Function.toString() 是否被篡改。
  • _0xdb32ba 劫持 console.log 等调试方法。

4. 提取 decrypt_base64 函数
核心函数是:
  1. export function decrypt_base64(_0x57473f) {
  2.     const _0x2a550a = _0x19734b;
  3.     let _0x12a91c, _0x36e60f;
  4.     try {
  5.         const _0x5f489e = passStringToWasm0(_0x57473f, wasm[_0x2a550a(0x213)], wasm['__wbindgen_realloc']),
  6.               _0x44bec9 = WASM_VECTOR_LEN,
  7.               _0x168e89 = wasm[_0x2a550a(0x1fa)](_0x5f489e, _0x44bec9);
  8.         var _0x176f59 = _0x168e89[0x0], _0x13a588 = _0x168e89[0x1];
  9.         if (_0x168e89[0x3]) {
  10.             _0x176f59 = 0x0, _0x13a588 = 0x0;
  11.             throw takeFromExternrefTable0(_0x168e89[0x2]);
  12.         }
  13.         return _0x12a91c = _0x176f59, _0x36e60f = _0x13a588, getStringFromWasm0(_0x176f59, _0x13a588);
  14.     } finally {
  15.         wasm[_0x2a550a(0x22b)](_0x12a91c, _0x36e60f, 0x1);
  16.     }
  17. }
复制代码
替换 _0x2a550a 调用后:
  1. export function decrypt_base64(input) {
  2.     let ptr, len;
  3.     try {
  4.         const wasmInputPtr = passStringToWasm0(input, wasm['__wbindgen_malloc'], wasm['__wbindgen_realloc']);
  5.         const wasmInputLen = WASM_VECTOR_LEN;
  6.         const result = wasm['decrypt_base64'](wasmInputPtr, wasmInputLen); // 调用 Wasm 解密
  7.         const [outputPtr, outputLen] = result;
  8.         if (result[3]) { // 如果有异常
  9.             throw takeFromExternrefTable0(result[2]);
  10.         }
  11.         ptr = outputPtr, len = outputLen;
  12.         return getStringFromWasm0(outputPtr, outputLen); // 返回解密后的字符串
  13.     } finally {
  14.         wasm['__wbindgen_free'](ptr, len, 1); // 释放内存
  15.     }
  16. }
复制代码
所以该代码的核心逻辑在 WebAssembly 中,JS 只是封装调用。decrypt_base64 函数的作用是调用 Wasm 进行解密。
那么我们看看wasm代码,先用wabt转换为dcmp c代码
ok,4700行,一堆混淆,解密时间太长了,我们不如直接调用它的函数
写html:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <title>WASM</title>
  5. </head>
  6. <body>
  7.     <script type="module">
  8.         import init, { decrypt_base64 } from './alicesw.js';

  9.         async function run() {
  10.             try {
  11.                 await init();
  12.                 const encryptedData = "Test";
  13.                 const decrypted = decrypt_base64(encryptedData);
  14.                 alert(decrypted);
  15.             } catch (error) {
  16.                 console.error("解密失败:", error);
  17.             }
  18.         }

  19.         run();
  20.     </script>
  21. </body>
  22. </html>
复制代码
下载alicesw.js、alicesw_bg.wasm
传入encryptedData
测试:
图片.webp
,成功
移植到js中也很简单,这里不做赘述
总结:解混淆不划算,换个算法再混淆就不行了;所以不如分析js,然后调用wasm进行解密。

评分

参与人数 1星币 +5 收起 理由
李七夜 + 5 源社区,有您更精彩!

查看全部评分

凌霜一剑冷,零雁几声秋

评论18

前方 发表于 2025-8-16 13:12:55 来自手机 | 查看全部
虽然看不懂,但还是赞一个👍🏻
沙发 2025-8-16 13:12:55 回复 收起回复
回复

使用道具 举报

好久不酱了 发表于 2025-8-16 21:09:16 来自手机 | 查看全部
完全看不懂的来点一下赞👍🏻
板凳 2025-8-16 21:09:16 回复 收起回复
回复

使用道具 举报

hj1987hb 发表于 2025-8-16 21:19:34 来自手机 | 查看全部
给大佬递茶!
地板 2025-8-16 21:19:34 回复 收起回复
回复

使用道具 举报

我的小狗文学星光赞助(未赞助不可申请) 发表于 2025-8-16 23:12:42 来自手机 | 查看全部
不明觉厉
5# 2025-8-16 23:12:42 回复 收起回复
回复

使用道具 举报

120350029@qq.co 发表于 2025-8-16 23:50:24 来自手机 | 查看全部
不懂,但给大佬点赞
6# 2025-8-16 23:50:24 回复 收起回复
回复

使用道具 举报

三月宝宝八颗牙 发表于 2025-8-17 04:56:42 来自手机 | 查看全部
很厉害的样子!顶起来给懂得人看
7# 2025-8-17 04:56:42 回复 收起回复
回复

使用道具 举报

俞陀 发表于 2025-8-17 10:50:42 来自手机 | 查看全部
8# 2025-8-17 10:50:42 回复 收起回复
回复

使用道具 举报

王大錘 发表于 2025-8-17 11:29:17 | 查看全部
不懂,但给大佬点赞  
9# 2025-8-17 11:29:17 回复 收起回复
回复

使用道具 举报

nanicesky 发表于 2025-8-17 15:13:12 | 查看全部
大佬牛逼,给大佬点个赞,mark学习一下
10# 2025-8-17 15:13:12 回复 收起回复
回复

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

投诉/建议联系

ysqbbs@outlook.com

未经授权禁止转载,复制和建立镜像,
如有违反,追究法律责任
  • 关注公众号
  • 添加QQ群
Copyright © 2001-2025 源社区 版权所有 All Rights Reserved.
关灯 在本版发帖
扫一扫添加QQ群
返回顶部
快速回复 返回顶部 返回列表