来 给你代码!Auto.js js转.class具体代码过程

前几天给大家分享了一篇关于Auto.js代码加密的技术文章,链接在《[Auto.js教程]js代码加密终极方案>js脚本解析成.class》不少的Auto.js的开发者,开始有安全意识的对Rhino进行操作了。

有时候觉得一个行业或细分领域的发展快慢,就得看行业内是否有人愿意输出、愿意普及一些别人不愿意拿出来的东西,来普遍提高行业内人士的认知和水平,分享的同时也彰显了自己在涉及该领域的意义

        说起Rhino,我看群中很多是对Rhino.jar进行操作,有直接Java Main的,也有Java -jar Rhino.jar的,当然可以成功的,但我觉得还是不够方便、安全,或者说显得不是那么有技术感。因为这样做,一是不易控制生成的class类;二是不够安全,不能自定义输出的class,就比如上篇文章标出的getEncodedSource()方法泄露代码的情况。

        当然更有人不会操作,就只学了个新的英文单词,抱怨说百度了一大堆,翻了很多页都找不到有效信息。其实我从知道js可以转dex到能做到一键转,全程都是百度(代码都是抄的..),中国好像就一个百度(个人能力有限,上不了Google.....)


  不要兜圈子了,Rhino是开源的啊,Github地址:

https://github.com/mozilla/rhino

建议下载

https://github.com/mozilla/rhino/releases/tag/Rhino1_7_7_2_Release

有人说Auto.js更新好几个版本了,Rhino版本该变了,这个不确定,我在用AutoJs-Docs中的1.7.7.2版本。

下载好之后将代码导入IDEA即可,然后新建一个Main调用类,怎么用源码将js转成.class字节码?

百度即可:

https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=Rhino%20%E6%80%8E%E4%B9%88%E7%94%A8%E6%BA%90%E7%A0%81%E5%B0%86js%E8%BD%AC%E6%88%90.class%E5%AD%97%E8%8A%82%E7%A0%81

第一个便是结果,就是那么精准:

https://www.orcode.com/question/932913_k79569.html
//这里注意传参是 js字符串,不是js路径
    static void toClassFile(String script) {
        //创建编译环境
        CompilerEnvirons compilerEnv = new CompilerEnvirons();
        ClassCompiler compiler = new ClassCompiler(compilerEnv);
        //compileToClassFiles的第3个参数比较重要,它表明了js转成.class的类路径,影响到调用的方法
        Object[] compiled = compiler.compileToClassFiles(script, null, 1, "joy."+jsName/* 这个参数是包路径 */);
        for (int j = 0; j != compiled.length; j += 2) {
            String className = (String) compiled[j];
            byte[] bytes = (byte[]) compiled[(j + 1)];
            File file = new File(classPath);
            file.getParentFile().mkdirs();
            try (FileOutputStream fos = new FileOutputStream(file)) {
                fos.write(bytes);
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                System.out.println("文件未找到!");
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                System.out.println("文件保存失败!");
                e.printStackTrace();
            }
        }
        System.out.println("编译成功!");
    }

这样就可以把一个js文件转成.class文件了。

同时我们也可以对Rhino的源码进行修改,来增强加密效果,比如将getEncodedSource()的返回置为空,删除不必要的的代码泄露,也减少体积,路径在

org.mozilla.javascript.optimizer.Codegen

这里:

              case Do_getEncodedSource:
                methodLocals = 1; // Only this
                cfw.startMethod("getEncodedSource", "()Ljava/lang/String;",
                                ACC_PUBLIC);
                cfw.addPush(""); //置为空

通过多次修改发现,生成.class字节码的操作,包括解析生成函数、生成调用关系都在类

org.mozilla.javascript.optimizer.Codegen

中完成。也可以增加对.class中的字符串、函数名的加密解密操作,如下图:

        当然也可以在生成dex之后,对dex进行操作,我不想再多一个步骤,所以就直接在生成.class的时候就让它完成。


        下面就是将.class转成dex了,普遍的做法可能是将操作路径转向AndroidSDK的build-tools下,使用dx.bat,但是有点大,不适合单单只想加密js并不想下载AndroidSDK的人,所以是否能将dex.bat从AndroidSDK中剥离出来呢?或者有没有直接的Java代码将.class转成dex呢?dx.bat的代码有点长,懒得看,继续百度..我其实在Github里搜的:

https://github.com/search?q=jar%E8%BD%ACdex&type=Repositories

就是那么精准,第一个:

https://github.com/Liiking/SwingTest

里面有段代码:

    /**
     * 指定jar包转成dex二进制格式jar包
     */
    private void jar2dex(String src, String target) {
        printLog("------ 将jar包转成二进制的jar包 ------");
        String command = getDxDir() + " --dex --output=" + target + " " + src;
        exec(command);
    }

而tools下面只有dx dx.jar,不就是我们想要的吗?Get it!


至此已经转成dex了,剩下的就是引用了

"ui"; //需要加载UI的,这一句仍然不能少
runtime.loadDex("joy.dex") //加载dex,名字无所谓
new Packages.joy.main()()  //这个很重要,与toClassFile()生成的类名要对应好

至于最后 你怎么对dex进行保护操作,方法大了去了,至此完成,放效果图:

人与人确实是不同的,专注的方面也不一样,但是一定不要懒,懒了费时间

而时间就是价钱

下面是我已经做好的对js一键进行加密的程序运行过程

----------Auto.js增强性加密工具 2020/04/26----------
[*] 主要功能是将js代码转换为dex脚本
[*] 不一定兼容所有的js文件,如果出现问题请关注:
[*] 微信公众号:『掌玩小子』
--------------------
[*] 获取js的路径:D:\main.js
[*] 获取到的js的名称为:main
--------------------
[*] 获取js的内容:
[*] 开始对.js进行编译:
编译成功!
[*] 更新jar包,将class添加到jar包中
[*] 开始将jar包转换成dex:
java -jar C:\Java\IdeaProjects\AutoJsEn/tools/dx.jar --dex --output=D:\\joy.dex C:\Java\IdeaProjects\Main.jar
--------------------
[*] 第六步:开始修改js加载:
[*] 备份js源码:
[*] 开始修改js:
--------------------
[*] 操作完成!
[*] 程序运行时间:2秒40毫秒。

欢迎关注微信公众号:『掌玩小子』讨论更多的加密解密:
在这里插入图片描述

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Auto.js 是一种轻量级的 JavaScript 脚本语言,常用于自动化 Android 和 iOS 设备的操作,比如模拟按键、屏幕操作等。在处理网页或应用中的广告时,通常可以通过模拟用户交互(如点击、滚动)或者利用特定的广告检测 API 来实现自动跳过。 以下是一个基本的思路: 1. **定位广告区域**: 首先,你需要识别广告元素,这可能依赖于广告的常见特征,如特定的类名、ID或CSS选择器。 ```javascript var adElement = document.querySelector('.ad-class-name'); // 用实际的类名替换 ``` 2. **触发广告关闭按钮**: 找到并模拟点击广告的关闭按钮或“跳过”按钮。 ```javascript if (adElement) { adElement.click(); } ``` 3. **延时操作**: 有时候广告会有一定的加载时间或者等待用户确认的环节,这时你可以加入适当的延迟。 ```javascript sleep(2000); // 假设2秒后广告可能会消失 ``` 4. **循环检查广告状态**: 使用 `setInterval` 检查广告是否已经关闭,直到广告完全消失。 ```javascript setInterval(function() { if (!document.querySelector('.ad-class-name')) { console.log('Ad skipped successfully'); clearInterval(intervalId); } }, 1000); ``` **注意事项**: - 不同的应用和网页结构可能会有所不同,上述代码仅作参考,实际操作中可能需要针对具体情况进行调整。 - 有些广告可能使用了防自动化技术,直接点击可能会被检测到,这时可能需要更复杂的策略,如使用机器学习算法识别动态元素。 **相关问题--:** 1. Auto.js 中如何识别页面元素? 2. 如何处理动态加载的广告? 3. 如何防止广告拦截工具影响自动化脚本?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值