吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 619|回复: 10
收起左侧

[讨论] 初学js逆向,有点想不通js.call为啥老师执行成功,我就执行不成功

  [复制链接]
lisongmei 发表于 2025-4-17 18:14
本帖最后由 lisongmei 于 2025-4-17 18:18 编辑

疑问就是:视频教程里,老师的myjs.call("decrypt_data",encrypted_data)能跑通,为啥自己一模一样的代码就跑不通呢,难道是python版本和node版本不一样?我是3.9,老师3.11,node我是20,老师好像是18
[Python] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
初学js逆向,遇到个问题,这是js解密部分的代码
const i=require('crypto')
// 解密
function T(e) {
    return i.createHash("md5").update(e).digest()
}
 
function decrypt_data(e){
        let t='xxxx'
        let a='xxxx'
        if(!e) return null
        const o =T(t)
          , n = T(a)
          , r = i.createDecipheriv("aes-128-cbc", o, n);
        let s = r.update(e, "base64", "utf-8");
        s += r.final("utf-8")
        // return s += r.final("utf-8"),
        // s
        console.log(s);
}
#本身是没有这一句的,gpt答案用subprocess让加的,上面decrypt_data本身也是要返回s的,由于用subprocess,所以没返回
decrypt_data(process.argv[2]);
 
我通过python去调用decrypt_data函数进行解密,代码如下
import execjs
with open('yd.js',mode='r',encoding='utf8') as f:
        jscode=f.read()
myjs=execjs.compile(jscode)
myjs.call("decrypt_data",encrypted_data)
 
死活都报错
Exception in thread Thread-1:
IndexError: list index out of range
 
询问gpt得知
JS 中的 Buffer 和加密处理(比如 Node.js 的 crypto 模块)不能被直接在 Python 的 execjs 中正确模拟运行。
execjs 是通过 JS 引擎(比如 Node.js、JScript、QuickJS 等)运行 JS 代码的桥梁,但它:
无法完整模拟 Node.js 原生模块(如 crypto)
所以你那段依赖 require('crypto') 的 Node.js 加密解密逻辑在 execjs 中根本跑不通
 
最终 给出了用
import subprocess
result = subprocess.check_output(['node', 'yd.js', encrypted_data], encoding='utf-8')
print(result)
在这里,终于得到了正确的输出

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

star0angel 发表于 2025-4-17 22:29
没看懂这是啥加密 又是MD5有是aes
KaliHt 发表于 2025-4-17 22:49
js.call(arg1,arg2,arg3...),arg1为调用函数的名字,arg2,arg3,argn是参数,返回值就是arg1中return的,arg1中必须有return
laos 发表于 2025-4-17 22:58
你这描述一大堆太乱了~都不知道你执行哪段命令又报错什么了~

我这执行是没问题的

js代码

[JavaScript] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
const i=require('crypto')
// 解密
function T(e) {
    return i.createHash("md5").update(e).digest()
}
  
function decrypt_data(e){
        let t='0123456789abcdef';
        let a='abcdef0123456789';
        if(!e) return null
        const o =T(t)
          , n = T(a)
          , r = i.createDecipheriv("aes-128-cbc", o, n);
        let s = r.update(e, "base64", "utf-8");
        s += r.final("utf-8")
        // return s += r.final("utf-8"),
        // s
        console.log(s);
        return s;
}


python代码
[Python] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
import execjs
 
with open("run.js",mode="r", encoding="utf-8") as f:
    js_code = f.read()
myjs = execjs.compile(js_code)
result = myjs.call("decrypt_data","kC+aVKwOeGAF49uf3c32Z4cFCth3Ybf8/iAyJDKljFc=")
print(result)
print(execjs.get().name)


 楼主| lisongmei 发表于 2025-4-17 22:58
KaliHt 发表于 2025-4-17 22:49
js.call(arg1,arg2,arg3...),arg1为调用函数的名字,arg2,arg3,argn是参数,返回值就是arg1中return的,ar ...

对呀,你看我描述,开始是有return的,通过node.js直接执行也能成功。但是去python里调用call始终报错,但教程里同样是call方法不报错。。用gpt问后,才注释了用的subprocess执行成功。
 楼主| lisongmei 发表于 2025-4-17 23:00
star0angel 发表于 2025-4-17 22:29
没看懂这是啥加密 又是MD5有是aes

就是aes加密啦,md5只是把aes要用的key,iv又加了下密
 楼主| lisongmei 发表于 2025-4-17 23:02
laos 发表于 2025-4-17 22:58
你这描述一大堆太乱了~都不知道你执行哪段命令又报错什么了~

我这执行是没问题的

大致是python调用通过call,调用decrypt_data(),然后就报错这个
Exception in thread Thread-1:
。。。中间省略了无用的信息
IndexError: list index out of range

会不会是版本不一样导致的,因为教程里也没报错
star0angel 发表于 2025-4-18 00:06
lisongmei 发表于 2025-4-17 23:02
大致是python调用通过call,调用decrypt_data(),然后就报错这个
Exception in thread Thread-1:
。。。 ...

不知道  你可以发网址试试这里大神多
 楼主| lisongmei 发表于 2025-4-18 09:35
star0angel 发表于 2025-4-18 00:06
不知道  你可以发网址试试这里大神多

哈哈,就 有道翻译 ,逆向他的sign值,以及回来的加密数据。
steven026 发表于 2025-5-3 00:40
这段js代码return被注释掉了根本没返回内容
而是向控制台输出内容

所以gpt让你通过读控制台获取内容
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-5-28 16:08

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表