├── bin └── TweakJar.apk ├── Jar包微调框架TweakJar介绍.docx ├── libs ├── arm64-v8a │ └── libtweakjar.so └── armeabi │ └── libtweakjar.so ├── res ├── drawable-hdpi │ └── ic_launcher.png ├── drawable-mdpi │ └── ic_launcher.png ├── drawable-xhdpi │ └── ic_launcher.png ├── values │ ├── strings.xml │ └── styles.xml ├── values-v11 │ └── styles.xml ├── values-v14 │ └── styles.xml └── layout │ └── activity_main.xml ├── src └── com │ ├── android │ └── guobao │ │ └── liao │ │ └── apptweak │ │ ├── JavaTweakCallback.java │ │ ├── JavaTweakReplace.java │ │ ├── JavaTweakHook.java │ │ ├── JavaTweakStub.java │ │ ├── util │ │ ├── StringUtil.java │ │ └── ReflectUtil.java │ │ └── JavaTweakBridge.java │ └── demo │ └── tweakjar │ ├── BlockingDialog.java │ └── MainActivity.java ├── .classpath ├── project.properties ├── proguard-project.txt ├── .project ├── AndroidManifest.xml ├── README.md └── LICENSE /bin/TweakJar.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liaoguobao/TweakJar/HEAD/bin/TweakJar.apk -------------------------------------------------------------------------------- /Jar包微调框架TweakJar介绍.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liaoguobao/TweakJar/HEAD/Jar包微调框架TweakJar介绍.docx -------------------------------------------------------------------------------- /libs/arm64-v8a/libtweakjar.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liaoguobao/TweakJar/HEAD/libs/arm64-v8a/libtweakjar.so -------------------------------------------------------------------------------- /libs/armeabi/libtweakjar.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liaoguobao/TweakJar/HEAD/libs/armeabi/libtweakjar.so -------------------------------------------------------------------------------- /res/drawable-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liaoguobao/TweakJar/HEAD/res/drawable-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /res/drawable-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liaoguobao/TweakJar/HEAD/res/drawable-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /res/drawable-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liaoguobao/TweakJar/HEAD/res/drawable-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | TweakJar 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/com/android/guobao/liao/apptweak/JavaTweakCallback.java: -------------------------------------------------------------------------------- 1 | package com.android.guobao.liao.apptweak; 2 | 3 | @SuppressWarnings("unused") 4 | public class JavaTweakCallback { 5 | static private Object handleHookedMethod(Object thiz, Object[] args, Object data) throws Throwable { 6 | return ((JavaTweakHook) data).handleHookedMethod(thiz, args); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /res/values-v11/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /res/values-v14/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.classpath: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /project.properties: -------------------------------------------------------------------------------- 1 | # This file is automatically generated by Android Tools. 2 | # Do not modify this file -- YOUR CHANGES WILL BE ERASED! 3 | # 4 | # This file must be checked in Version Control Systems. 5 | # 6 | # To customize properties used by the Ant build system edit 7 | # "ant.properties", and override values to adapt the script to your 8 | # project structure. 9 | # 10 | # To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): 11 | #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt 12 | 13 | # Project target. 14 | target=android-22 15 | -------------------------------------------------------------------------------- /res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 14 | 15 | 16 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /proguard-project.txt: -------------------------------------------------------------------------------- 1 | # To enable ProGuard in your project, edit project.properties 2 | # to define the proguard.config property as described in that file. 3 | # 4 | # Add project specific ProGuard rules here. 5 | # By default, the flags in this file are appended to flags specified 6 | # in ${sdk.dir}/tools/proguard/proguard-android.txt 7 | # You can edit the include path and order by changing the ProGuard 8 | # include property in project.properties. 9 | # 10 | # For more details, see 11 | # http://developer.android.com/guide/developing/tools/proguard.html 12 | 13 | # Add any project specific keep options here: 14 | 15 | # If your project uses WebView with JS, uncomment the following 16 | # and specify the fully qualified class name to the JavaScript interface 17 | # class: 18 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 19 | # public *; 20 | #} 21 | -------------------------------------------------------------------------------- /.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | TweakJar 4 | 5 | 6 | 7 | 8 | 9 | org.eclipse.andmore.ResourceManagerBuilder 10 | 11 | 12 | 13 | 14 | org.eclipse.andmore.PreCompilerBuilder 15 | 16 | 17 | 18 | 19 | org.eclipse.jdt.core.javabuilder 20 | 21 | 22 | 23 | 24 | org.eclipse.andmore.ApkBuilder 25 | 26 | 27 | 28 | 29 | 30 | org.eclipse.andmore.AndroidNature 31 | org.eclipse.jdt.core.javanature 32 | 33 | 34 | -------------------------------------------------------------------------------- /AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 10 | 11 | 16 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## TweakJar 2 | TweakJar是一个轻量级的运行时Jar包修改框架,它主要面向Android正向开发者(当然,逆向开发者也同样适用)。
3 | 他的主要功能是:在运行时hook任意的java方法,动态调整其方法逻辑。
4 | 框架专为希望微调或增强jar包中某些方法的功能又没有jar包源码的场景而设计。
5 | 你可以认为他是一个微缩版本的xposed,又没有它的笨重、需要root权限等限制,主打一个极简与方便集成。
6 | 此框架从我的另一个开源逆向框架**TweakMe**裁剪而来,剥离出其中的java拦截部分功能。
7 | 因为TweakMe是一个相对较重的逆向框架,而java拦截部分实际上可以单独提取以让其正逆两用,极大的方便使用者在自己的项目中集成开发。
8 | 目前TweakJar框架在5.0到14.0的android手机上测试通过。
9 |
10 | ## 使用前准备 11 | 需要eclipse for android 环境
12 | 如果只有android studio 环境,则需自己将工程转化AS工程。
13 |
14 | ## 框架使用 15 | 详细使用请浏览MainActivity.java中的测试代码。
16 | 如果你没有eclipse for android环境,可以直接安装**TweakJar.apk**查看运行效果。
17 | logcat中的日志过滤tag标签为 **TweakJar**
18 |
19 | ## 框架集成 20 | 如果你想要将TweakJar框架集成到你自己的项目中,你只需要做如下两步操作:
21 | 1、将下面的两个包中的所有java代码拷贝到你自己项目的src源码目录中。
22 | **package com.android.guobao.liao.apptweak.util;**
23 | **package com.android.guobao.liao.apptweak;**
24 |
25 | 2、将**libtweakjar.so**拷贝到你自己项目的lib库目录中。
26 |
27 |
28 |
29 | **如果本框架对你有帮助,记得github上为我点赞加星哦!!!**
30 |
31 | ## 免责声明 32 | **本框架为个人作品,任何人的复制、拷贝、使用等,只可用于正常的技术交流与学习,不可用于灰黑产业,不可从事违法犯罪行为。否则,后果自负!!!** 33 |
34 | -------------------------------------------------------------------------------- /src/com/android/guobao/liao/apptweak/JavaTweakReplace.java: -------------------------------------------------------------------------------- 1 | package com.android.guobao.liao.apptweak; 2 | 3 | import android.util.Log; 4 | 5 | public abstract class JavaTweakReplace extends JavaTweakHook { 6 | public JavaTweakReplace() { 7 | super(); 8 | } 9 | 10 | public JavaTweakReplace(int flags) { 11 | super(flags); 12 | } 13 | 14 | public JavaTweakReplace(String name) { 15 | super(name); 16 | } 17 | 18 | public JavaTweakReplace(int flags, String name) { 19 | super(flags, name); 20 | } 21 | 22 | @Override 23 | protected final void beforeHookedMethod(Object thiz, Object[] args) { 24 | try { 25 | setResult(replaceHookedMethod(thiz, args)); 26 | } catch (Throwable e) { 27 | JavaTweakBridge.writeToLogcat(Log.ERROR, "replaceHookedMethod: %s: %s", getBackup(), e); 28 | } 29 | } 30 | 31 | @Override 32 | protected final void afterHookedMethod(Object thiz, Object[] args) { 33 | } 34 | 35 | protected abstract Object replaceHookedMethod(Object thiz, Object[] args); 36 | 37 | public static JavaTweakReplace constReturnReplace(final Object result) { 38 | return new JavaTweakReplace() { 39 | @Override 40 | protected Object replaceHookedMethod(Object thiz, Object[] args) { 41 | return result; 42 | } 43 | }; 44 | } 45 | 46 | public static JavaTweakReplace nullReturnReplace() { 47 | return constReturnReplace(null); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/com/demo/tweakjar/BlockingDialog.java: -------------------------------------------------------------------------------- 1 | package com.demo.tweakjar; 2 | 3 | import android.app.Activity; 4 | import android.app.AlertDialog; 5 | import android.content.Context; 6 | import android.content.DialogInterface; 7 | import android.content.DialogInterface.OnClickListener; 8 | import android.os.Handler; 9 | import android.os.Looper; 10 | import android.os.Message; 11 | 12 | public class BlockingDialog { 13 | private int mWhich; 14 | static private Handler mHandler; 15 | 16 | static public int showBlockingDialog(Activity context, String title, String msg) { 17 | mHandler = new Handler(new Handler.Callback() { 18 | public boolean handleMessage(Message msg) { 19 | throw new RuntimeException(); 20 | } 21 | }); 22 | return new BlockingDialog(context, title, msg).mWhich; 23 | } 24 | 25 | private BlockingDialog(Context context, String title, String msg) { 26 | AlertDialog.Builder builder = new AlertDialog.Builder(context); 27 | builder.setPositiveButton("确定", new OnClickListener() { 28 | public void onClick(DialogInterface dialog, int which) { 29 | mWhich = which; 30 | mHandler.sendMessage(mHandler.obtainMessage()); 31 | } 32 | }); 33 | builder.setNegativeButton("取消", new OnClickListener() { 34 | public void onClick(DialogInterface dialog, int which) { 35 | mWhich = which; 36 | mHandler.sendMessage(mHandler.obtainMessage()); 37 | } 38 | }); 39 | builder.setTitle(title).setMessage(msg).create().show(); 40 | try { 41 | Looper.loop(); 42 | } catch (Exception e) { 43 | } 44 | } 45 | } -------------------------------------------------------------------------------- /res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 |