Flutter JavaScript 解密插件 js_unpack 的使用

发布于 1周前 作者 bupafengyu 来自 Flutter

Flutter JavaScript 解密插件 js_unpack 的使用

js_unpack 是一个用于解密 P.A.C.K.E.R. 打包的 JavaScript 代码的 Flutter 插件。P.A.C.K.E.R. 是一种常见的 JavaScript 代码混淆工具,js_unpack 可以帮助我们轻松地解密这些混淆的代码。

使用方法

下面是一个完整的示例 Demo,展示了如何在 Flutter 项目中使用 js_unpack 插件来解密 P.A.C.K.E.R. 打包的 JavaScript 代码。

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 js_unpack 依赖:

dependencies:
  flutter:
    sdk: flutter
  js_unpack: ^latest_version  # 请确保使用最新版本
2. 创建主文件 main.dart

接下来,在 lib/main.dart 文件中编写代码来演示如何使用 js_unpack 插件。

import 'package:flutter/material.dart';
import 'package:js_unpack/js_unpack.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('js_unpack 示例'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              // 示例混淆的 JavaScript 代码
              var html = r'''
                eval(function(p,a,c,k,e,d){e=function(c){return c.toString(36)};if(!''.replace(/^/,String)){while(c--){d[c.toString(a)]=k[c]||c.toString(a)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('0.m="//1-2.5.6/9/3.a";0.b=" ";0.c="//1-2.5.6/8/3.4?1=f-g&e=d&h=i";0.j="3.4";0.k="1-2";0.l="";0.7="";',23,23,'MDCore|s|delivery31|63033a2720e77506807a4c2d8a22a25e|mp4|mxdcontent|net|referrer|v|thumbs|jpg|furl|wurl|1666988932||qK_h3z_yS3K|oeySpIwUVg|_t|1666969970|vfile|vserver|remotesub|poster'.split('|'),0,{})
              ''';

              // 创建 JsUnpack 实例并解密代码
              var p = JsUnpack(html);

              // 检测是否是 P.A.C.K.E.R. 打包的代码
              bool isPacker = JsUnpack.detect(html);
              print('是否是 P.A.C.K.E.R. 打包的代码: $isPacker');

              // 解密后的代码
              String unpackedCode = p.unpack();
              print('解密后的代码:\n$unpackedCode');
            },
            child: Text('解密 JavaScript 代码'),
          ),
        ),
      ),
    );
  }
}
3. 运行项目

完成上述步骤后,运行 Flutter 项目。点击按钮后,控制台将输出以下内容:

  1. 是否是 P.A.C.K.E.R. 打包的代码。
  2. 解密后的 JavaScript 代码。

代码说明

  • JsUnpack:这是 js_unpack 插件的核心类,用于解密 P.A.C.K.E.R. 打包的 JavaScript 代码。
  • JsUnpack.detect() 方法:用于检测给定的字符串是否是 P.A.C.K.E.R. 打包的 JavaScript 代码。返回 truefalse
  • JsUnpack.unpack() 方法:用于解密 P.A.C.K.E.R. 打包的 JavaScript 代码,并返回解密后的代码。

许可证

js_unpack 插件采用 MIT 许可证,具体条款如下:

MIT License

Copyright (c) 2022 linkkader

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

更多关于Flutter JavaScript 解密插件 js_unpack 的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter JavaScript 解密插件 js_unpack 的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,如果你想通过JavaScript解密插件来处理某些加密的JavaScript代码,你可以使用js_unpack这个插件(假设它存在且适用于你的需求,实际上可能需要自行实现或找到类似的库,因为js_unpack并非一个官方或广泛认知的Flutter插件名称)。不过,由于Flutter本身不支持直接运行JavaScript代码,通常我们会借助平台通道(Platform Channels)在原生代码(如Android的Java/Kotlin或iOS的Swift/Objective-C)中执行JavaScript,然后将结果传回Flutter。

以下是一个概念性的示例,展示了如何在Flutter中通过平台通道调用原生代码执行JavaScript解密操作。注意,这里的JavaScript解密逻辑需要在原生代码中实现,Flutter部分仅负责调用和接收结果。

1. 创建Flutter项目

首先,创建一个新的Flutter项目。

flutter create flutter_js_unpack_example
cd flutter_js_unpack_example

2. 在原生代码中实现JavaScript解密

Android (Java/Kotlin)

android/app/src/main/java/com/example/flutter_js_unpack_example/目录下创建一个新的Java/Kotlin类,比如JsUnpackPlugin.java(或.kt)。

Java示例

package com.example.flutter_js_unpack_example;

import android.content.Context;
import android.webkit.JavascriptInterface;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import io.flutter.embedding.engine.plugins.FlutterPlugin;
import io.flutter.embedding.engine.plugins.activity.ActivityAware;
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;

public class JsUnpackPlugin implements FlutterPlugin, MethodCallHandler, ActivityAware {
    private MethodChannel channel;
    private Context applicationContext;
    private WebView webView;

    @Override
    public void onAttachedToEngine(FlutterPluginBinding flutterPluginBinding) {
        channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "js_unpack");
        channel.setMethodCallHandler(this);
        applicationContext = flutterPluginBinding.getApplicationContext();
    }

    @Override
    public void onMethodCall(MethodCall call, Result result) {
        if (call.method.equals("unpackJs")) {
            String encryptedJs = call.argument("encryptedJs");
            unpackJs(encryptedJs, result);
        } else {
            result.notImplemented();
        }
    }

    private void unpackJs(String encryptedJs, Result result) {
        webView = new WebView(applicationContext);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.addJavascriptInterface(new WebAppInterface(), "AndroidInterface");
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                // Assuming unpackJsFunction is a JavaScript function defined in the HTML/JS code
                view.evaluateJavascript("(function() { return unpackJsFunction('" + encryptedJs + "'); })();", resultWrapper -> {
                    result.success(resultWrapper);
                });
                webView.destroy(); // Clean up
            }
        });
        webView.loadDataWithBaseURL(null, "<html><body><script src='path/to/your/unpacker.js'></script></body></html>", "text/html", "UTF-8", null);
    }

    private class WebAppInterface {
        @JavascriptInterface
        public void postMessage(String message) {
            // Handle messages from JavaScript if needed
        }
    }

    // Other required methods for FlutterPlugin and ActivityAware interfaces...
}

注意: 你需要在HTML中加载一个包含unpackJsFunction的JavaScript文件,这个文件应该包含实际的解密逻辑。

iOS (Swift/Objective-C)

类似地,在iOS中,你需要创建一个新的Swift/Objective-C类来处理JavaScript执行。由于篇幅限制,这里仅提供一个概念性的方向:

  • 使用WKWebView来加载和执行JavaScript。
  • 使用WKScriptMessageHandler来接收从JavaScript返回的结果。
  • 实现Flutter的MethodCallHandler来接收来自Dart的代码调用。

3. 在Dart代码中调用原生插件

lib/目录下修改main.dart来调用这个插件。

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  static const platform = MethodChannel('js_unpack');

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter JS Unpack Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: _unpackJs,
            child: Text('Unpack JS'),
          ),
        ),
      ),
    );
  }

  Future<void> _unpackJs() async {
    String encryptedJs = "your_encrypted_js_code_here";
    try {
      final String decryptedJs = await platform.invokeMethod('unpackJs', {'encryptedJs': encryptedJs});
      print('Decrypted JS: $decryptedJs');
    } on PlatformException catch (e) {
      print("Failed to invoke: '${e.message}'.");
    }
  }
}

4. 注册插件

android/app/src/main/kotlin/com/example/flutter_js_unpack_example/MainActivity.kt(或Java对应的文件)和iOS的AppDelegate.swift(或.m)中注册插件。

由于篇幅和复杂性,这里不详细展开注册步骤,但基本上你需要确保插件在Flutter引擎启动时被正确注册。

总结

上述代码提供了一个大致的框架,展示了如何在Flutter中通过平台通道调用原生代码执行JavaScript解密操作。实际的解密逻辑需要在原生代码中的JavaScript部分实现,并且你需要根据具体的解密需求调整JavaScript代码和原生代码的逻辑。此外,由于js_unpack并非一个广泛认知的插件名,你可能需要自行实现解密逻辑或寻找合适的第三方库。

回到顶部