JS逆向加密——Python执行JS代码的常用2种方式

JS逆向加密:Python执行JS代码的常用2种方式

个人觉得 node的方式最后用,写到第一种了,可以解决很多依赖问题和环境问题,使用以下同一份JS文件

// js 文件代码
//计算两个数的和
function add(num1, num2) {
    // 只要打印出来 才能获取到 
    console.log(num1 + num2)
    return num1 + num2;
}

add(1,2)

1.   Node.js 

  • 实际上是使用 Python 的os.popen执行 node 命令,执行 JS 脚本时,只能打印出来,读取打印的结果
  • 首先,确保本地已经安装了 Node.js 环境 
  • 修改 JS 脚本,新增一个导出函数 init ,方便内部函数被调用 
# Python 代码
import os

# 打开 命令行 执行 node 
pipeline = os.popen('node ./11.js')

# 必须打印,然后读取打印的结果,不然是没有输出的
print(pipeline.read())
# 使用绝对 路径引用包
var RootPath = 'D:\\NodeJS\\node_modules\\node_modules\\';
var express = require(RootPath+'express');
var bodyParser = require(RootPath+'body-parser');
// var sign = require('./JS加密.js');



2.  PyExecJS

  • PyExecJS 是使用最多的一种方式,底层 实现方式是: 在本地 JS 环境下运行 JS 代码,使用这种方法必须执行的方法有返回值
    result = js.call('get_token')
  • 支持的 JS 环境包含:Node.js、PyV8、PhantomJS、Nashorn 等
  • 首先,我们需要安装依赖包 PyExecJS (pip intall PyExecJS)
# Python代码,读取同一份JS文件
import execjs
import os

# 读取 js 文件
with open('./11.js') as f:
    Str_code = f.read()
# 加载 JS 代码
js = execjs.compile(Str_code)

# 第一种 执行 JS 方式 
# 直接 JS 的方法 ,使用这种方法必须执行的方法 有返回值
result = js.call('add')
print(result )

# 第二种 执行 JS的方式
# 调用上下文对象的 call()  方法执行 JS 方法
# js.eval('add("{0}", "{1}")').format("1","2")) 参数的方式
result1 = js.eval('add("{0}", "{1}")').format("1","2"))

print(result1)

欧力给  !!!

### 如何在Python中调用JavaScript执行加密操作 为了实现这一目标,可以采用几种不同的方法。每种方法都有其特点和适用范围。 #### 方法一:使用 `js2py` 库 对于较为复杂且可能经过混淆处理的 JavaScript 代码来说,`js2py` 是一个不错的选择。该库允许直接在 Python 环境下解释并运行 JavaScript 代码片段,而无需依赖外部浏览器或 Node.js 运行时环境[^2]。 ```python import js2py context = js2py.EvalJs() with open('encryption.js', 'r') as f: context.execute(f.read()) result = context.encryptFunction(json.dumps(data)) print(result) ``` 这种方法适合于那些需要频繁交互以及希望减少对外部服务依赖的应用场景;但是需要注意的是,在面对特别庞大或者高度优化过的脚本时可能会遇到性能瓶颈或者是兼容性问题。 #### 方法二:利用 Selenium WebDriver 执行 JS 加密函数 如果待解析页面中的 JavaScript 需要访问 DOM 或者其他仅能在真实浏览器环境中可用的功能,则可以选择借助 Selenium 来加载网页并通过注入自定义脚本来完成任务[^3]。 ```python from selenium import webdriver driver = webdriver.Chrome() driver.get(url) def execute_js_encryption(js_code, param): script = f""" ({js_code})({param}); """ return driver.execute_script(script) encrypted_result = execute_js_encryption("function encrypt(param){/*...*/}", data) print(encrypted_result) ``` 此方式虽然灵活性较高,但由于涉及到启动整个浏览器实例的过程,因此效率相对较低,并不适合大规模并发请求的情况。 #### 方法三:基于 ExecJS 的解决方案 当只需要简单地编译并调用特定的 JavaScript 函数而不必关心其余部分的工作机制时,ExecJS 提供了一条便捷途径。它可以自动检测系统上已安装的最佳 JavaScript 解释器(如 Node.js),从而简化跨平台开发流程[^4]。 ```python import execjs with open('encryptor.js', encoding='utf-8') as file: js_content = file.read() ctx = execjs.compile(js_content) output = ctx.call('mainEncryptionFunc', input_data) print(output) ``` 这种方式兼顾了易用性和一定的通用性,尤其适用于已经具备相应基础设施的前提下快速集成现有资源的情形。 综上所述,针对不同需求背景下的具体应用场景,上述三种技术手段各有千秋。考虑到题目提到的任务特性——即涉及到了解码/逆向分析层面的操作,推荐优先考虑 **`js2py`** 方案,因为其内置了解析能力并且能够在纯 Python 环境内独立运作,有助于降低整体架构复杂度的同时提高可移植性。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.含笑.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值