java调用js文件的两种方法(支持V8引擎)

这篇具有很好参考价值的文章主要介绍了java调用js文件的两种方法(支持V8引擎)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

对java逆向感兴趣的盆友可以关注我以前的文章,有图片验证码识别、AES、SHA256等各种加密的java实现,不定时更新常用算法和加密,欢迎一起交流讨论!

在日常逆向中,一些前端的加密代码用java复现出来比较难,所以经常需要调用js文件来实现加密操作,接下来将介绍两种常用调用js的思路,第一种适用于普通js文件,第二种则适用于比较新的V8引擎。在实现的过程中,也会展示可能遇到的问题以及解决办法,废话不多话,正文开始!

方法一

本方法用的是jdk自带的ScriptEngine来实现,大概流程是:加载引擎->绑定环境->预编译js文件->调用文件内方法,具体实现代码:


import javax.script.*;
import java.io.InputStreamReader;

    //因为js文件读取一次就行,因此用静态代码块来读取
    private static ScriptEngine engine;

    static {
        try {
            ScriptEngineManager manager = new ScriptEngineManager();
            engine = manager.getEngineByName("javascript");
            Bindings engineScope = engine.getBindings(ScriptContext.ENGINE_SCOPE);
            engineScope.put("window", engineScope);
            engineScope.put("navigator", engineScope);
            InputStreamReader jsencryptFileReader = new InputStreamReader(EncJs.class.getClassLoader().getResourceAsStream("enc.js"));
            engine.eval(jsencryptFileReader);
            jsencryptFileReader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }	

读取完js后,就可以使用js引擎来直接用invokeFunction方法来调用文件内函数,代码如下

    public static String enc(String data, String key) {
        Invocable invoke = (Invocable) engine;
        try {
            String result = (String) invoke.invokeFunction("Enc", data, key);
            return result.toUpperCase();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

在上边代码invoke.invokeFunction("Enc", data, key)中,Enc为js文件内的函数名,datakey是需要方法需要传递的参数,如果方法只有一个参数,则传入一个,如果是多个参数,则按顺序排列在后边即可。

上边代码在执行普通js时比较方便使用,但是如果是比较新的开发版本,有些语法会不支持,像lambda表达式等,如下图:
java调用js文件的两种方法(支持V8引擎),java,java,javascript,python,爬虫,web安全

此处再介绍一种方法,使用的是V8引擎,可以支持最新语法

方法二

使用到的maven依赖,以下依赖根据自己环境任选其一即可。

		<!-- linux系统 -->
		 <dependency>
            <groupId>com.eclipsesource.j2v8</groupId>
            <artifactId>j2v8_linux_x86_64</artifactId>
            <version>3.1.6</version>
        </dependency>
        <!-- mac系统 -->
        <dependency>
            <groupId>com.eclipsesource.j2v8</groupId>
            <artifactId>j2v8_macosx_x86_64</artifactId>
            <version>4.6.0</version>
        </dependency>
        <!-- windows系统 -->
        <dependency>
            <groupId>com.eclipsesource.j2v8</groupId>
            <artifactId>j2v8_win32_x86_64</artifactId>
            <version>4.6.0</version>
        </dependency>


这个的实现流程和上边稍微有些不同,也是:预读取js文件>加载引擎->编译js文件->调用文件内方法,具体实现代码如下:

import com.eclipsesource.v8.V8;
import org.apache.commons.io.IOUtils;

import java.io.IOException;
import java.nio.charset.StandardCharsets;


public class V8JSUtils {

    private static String fileStr;

    static {
        try {
            fileStr = IOUtils.toString(V8JSUtils.class.getClassLoader().getResourceAsStream("enc.js"), StandardCharsets.UTF_8);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static String dec(String data, String key) {
        V8 runtime = V8.createV8Runtime();

        try {
            runtime.executeVoidScript(fileStr);
            return (String) runtime.executeJSFunction("Dec", data, key);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            runtime.release();
        }
        return null;
    }


}

代码写完了,调用一下结果还是遇到了错误
java调用js文件的两种方法(支持V8引擎),java,java,javascript,python,爬虫,web安全

这个错误的大概意思就是:严格模式外不能使用let,const之类的es6的命令,也就是说版本太低了,怎么办,更新版本?no no no,找到JS文件出错的代码位置,在方法前加上一句:'use strict';
注意!引号不能省略,必须全部复制,如图
java调用js文件的两种方法(支持V8引擎),java,java,javascript,python,爬虫,web安全

现在再运行就正常了。文章来源地址https://www.toymoban.com/news/detail-695907.html

到了这里,关于java调用js文件的两种方法(支持V8引擎)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • js - 图片base64转file文件的两种方式

    最近项目中需要实现把图片的base64编码转成file文件的功能,然后再上传至服务器。 1.通过new File()将base64转换成file文件,此方式需考虑浏览器兼容问题 2.先将base64转换成blob,再将blob转换成file文件,此方法不存在浏览器不兼容问题 vue中配合vant的uploader上传组件使用案例: 打

    2024年02月14日
    浏览(37)
  • js将文本复制(写入)剪贴板的两种常用方法

    首先引入 navigator.clipboard 写入: 读取:(读取权限需要用户同意) 如果想要换行可以使用ASCLL码代替/n 将第三方库引入页面 初始化 使用: clipboard.js更多使用方法可以看这个https://clipboardjs.bootcss.com/

    2024年02月16日
    浏览(29)
  • ipynb文件转为py文件的两种方法

    许多GitHub上的项目拉下来是.ipynb格式,如果不用jupyter notebook打开,用pycharm打开,看到的是一个个cells,看代码逻辑不太方便;或者通过jupyter notebook打开,但运行、修改、保存中间过程有不方便的地方,想转为.py文件,下面提供两种方法来实现ipynb文件转为py文件。 方法一:通

    2024年02月11日
    浏览(40)
  • 设置ZIP文件打开密码的两种方法

    使用WinRAR缩包ZIP文件时,有两种方式来设置打开密码,我们可以根据不同需要选择不同的方法。 方法一: 在压缩文件的时候同时设置打开密码,只设置当下压缩的ZIP文件。 首先,鼠标选择需要压缩的文件,然后点击鼠标右键,选择【添加到压缩文件】。  弹出对话框后,选

    2024年02月05日
    浏览(32)
  • Mac 修改Hosts文件的两种方法

    一 修改终端命令 打开终端,输入命令行: 输入本机密码后,会自动打开hosts文件 。 键盘输入i(插入),修改完成后,按 esc 键退出插入页面 保存退出:按住shift+:键,输入wq,再enter键 不保存退出:输入q!键,再enter键 二 修改终端命令 2、修改hosts文件 1. 打开Finder,快捷键

    2024年02月12日
    浏览(47)
  • C#中复制文件夹及文件的两种方法

    现将文件复制的问题整理的知识做了一下总结,以方便自己和大家学习!本节要说的是C#中复制文件夹及文件的两种方法,闲话不说,直接附代码如下: 方法一: 方法二:       方法一 和 方法二 都可以实现文件夹及文件的复制,两者的区别是:方法一的复制并没有包括原文件的根目录

    2024年02月16日
    浏览(27)
  • java关闭流的两种方法

    当使用完流后,关闭所有打开的流仍然是一个好习惯。一个被打开的流有可能会用尽系统的资源,这取决于平台和实现。如果没有将流关闭,另一个程序试图打开另一个流时,可能会得到不需要的资源。 有两种关闭方式: ​ 如下: jdk1.7之前 方法一:手动关闭,即为使用c

    2024年02月13日
    浏览(28)
  • 撤销Excel文件工作表保护的两种方法

    Excel的工作表保护,是保护excel文件的数据不被轻易修改,也就是说我们编辑excel文件受到了限制。设置了工作表保护还体现在不能粘贴复制excel内容、不能打印excel文件等。 平时我们除了自己给excel文件设置工作表保护,有时候在网上下载来的excel文件也有可能设置了工作表保

    2024年02月12日
    浏览(35)
  • java 数组新增元素的两种方法

    数组在使用前,长度就已固定,所以原数组长度是不能再改变了,基于此,提供如下两种方式,添加元素数据 1创建一个新数组,长度为原数组加1,然后将原数组数据添加到新数组,最后再添加需要的新数据         String[] s1 = {\\\"a\\\",\\\"b\\\",\\\"c\\\"};         String[] s2 = new String[s1.l

    2024年02月16日
    浏览(28)
  • java 数组添加元素的两种方法

    说在前面 数组在使用前,长度就已固定,所以原数组长度是不能再改变了,基于此,提供如下两种方式,给数组添加数据。具体代码如下 方式一: 创建一个新数组,长度为原数组加1,然后将原数组数据添加到新数组,最后再添加需要的新数据 运行结果 方式二: 先把数组转

    2024年02月11日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包