首页
社区
课程
招聘
[原创]Native层与Java层注入之免ROOT框架TweakMe 3.0
发表于: 2022-7-29 15:25 15456

[原创]Native层与Java层注入之免ROOT框架TweakMe 3.0

2022-7-29 15:25
15456
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
免ROOT框架TweakMe3.0介绍
 
   TweakMe是一个轻量级的逆向开发框架,目前已经升级到3.0版本,它与传统的xposed、frida、magisk等框架相比的最大优势是无需root环境,对手机系统的要求很低,只需要一个正常手机即可对app进行逆向分析。简单的几步操作就可以完成对指定app的进程注入,可以绕过大多数加固(360、梆梆、爱加密等)的签名证书校验。完成注入后通过Java编写hook代码,一键脚本编译为dex插件。目前TweakMe框架在5.012.0的android手机上测试通过。由于篇幅问题,本文档并不介绍TweakMe的实现原理,仅仅介绍如何快速使用它,以及使用过程中的注意事项。
 
TweakMe QQ群:325509091
TweakMe 地址:https://github.com/liaoguobao/TweakMe
 
强烈建议在非ROOT的正常手机上使用本框架
 
一、使用前准备:
1、一台没有ROOT过的正常Android手机,系统版本12及以下都可。
2、开发电脑需要安装AndroidStudio,Java版本最好是1.71.8
3、一个待测试的apk【demo.apk】,假设包名为【com.example.tweakme】。
 
 
二、将TweakMe拉取到本地,目录结构类似如下图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
apktweak目中附带了一个apktweak.exe的命令行工具,后续步骤会经常用到。
 
 
三、重打包apk
重打包的目的是让APP在启动时主动加载我们的TweakMe/libs/armeabi/libsotweak.so。
所以我们要在app中放入我们自己的so,并微调某个so,让它把我们的so加载起来。
重打包命令:apktweak  --apk  xxx.apk  --target  xxx.so
 
--target参数指定app中待微调的so,不同app设置可能会不一样,但总体原则是:
指定为app在启动时第一个加载的应用层so。
 
目前大多数的app都有加壳,所以这里的--target其实就是壳的so。每个第三方加固商都有对应的固定so名称,直接百度搜集即可。对于没有加固的app,大家可以查看/proc/$PID/maps文件,基地址最大的so即是第一个被加载的so。
 
如下图所示(必须要在root过的手机上才可以看maps文件)

1
2
3
4
5
6
7
8
9
10
libpcrash.so的基地址被映射的最大,可以尝试做为目标so
 
对于梆梆加固是libDexHelper.so,对于爱加密是libexec.so,对于360加固是libjiagu.so。
需要注意的是,对于爱加密、360加固等壳的so并不在通常的lib/abi目录下,而在assets目录中,所以--target 参数必须要指定绝对路径,只有在通常的lib/abi目录下时才可以只写so名称。可供参考的命令如下:
apktweak  --apk  xxx.apk  --target  libDexHelper.so
apktweak  --apk  xxx.apk  --target  assets/ijm_lib/armeabi/libexec.so  
apktweak  --apk  xxx.apk  --target  assets/libjiagu.so
 
如果打包成功,则会在apk当前目录中生成一个重签名的新apk包,如下图所示
apk名称带sign的为重签名apk,另一个为原始apk

1
2
四、编译插件
TweakMe/src目录是插件源码目录,大家可自行开发JavaTweak_xxx.java插件类。源码中附带有一个简单的demo插件。

1
2
3
编译dex插件命令:java2dex.bat
如果想编译java插件,必须要安装java环境,建议安装java1.8。如果想编译sodemo,必须要安装NDK。如果想查看运行日志,必须要安装ddms,这个工具在安装了AndroidStudio或EclipseForAndroid之后会自动安装。
编译环境准备好后,直接在控制台中执行上述bat脚本即可自动将java代码打包为dex插件。编译成功后会在脚本目录生成一个javatweak.dex。如下图

1
2
3
4
5
6
7
8
9
五、安装apk和插件
apk的安装不再赘述,直接用adb install 命令即可,只要注意这里安装的是重签名后的apk。
下面着重介绍下插件的安装。
由于没有root权限,我们唯一能读写的目录是/sdcard
1、在/sdcard目录下新建tweak目录(目录名称固定)
2、在tweak目录下新建包名目录(不同的app包名不同,目录名称也不同),我这里就是com.example.tweakme目录。
3、将javatweak.dex、libsotweak.so、原始demo.apk通过adb push到刚创建的
/sdcard/tweak/com.example.tweakme目录下,如下图所示:
注意原始apk名称都必须重命名为base.apk

1
2
六、设置app权限,允许读写/sdcard目录
安装的app默认是没有读写/sdcard目录权限的,我们在运行app之前要为它设置权限。如果没有设置权限就直接运行app会报如下图所示的错误,然后app会闪退。

1
如果读写权限设置OK,会有如下类似日志打印

1
2
3
七、功能扩展:如何在java层调用自己编写的so
如果只开发dex插件的话,上面六步已经足够了。如果还想在java层调用自己编写的so,那么可以通过如下步骤完成(假设你已经写好了一个名为libdemo.so的动态库)。
1、在java层加载so,如下图

1
2、将so放入libsotweak.so所在的目录中,如下图

1
3、我的libdemo.so在JNI_OnLoad中只打印了一条简单的日志

1
日志输出如下

1
4、为了支持native层符号hook,在JavaTweakBridge类中有如下方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
需要注意的是,此方法并不是用来拦截java层的native方法的,而是用来拦截native层的各种符号函数或者过程的(IDA中以sub_xxxx这种形式显示)。具体使用请看函数说明,以及sodemo中的使用例子。
 
八、重签名apk
    如果想手工调整apk包的内容(比如可以在WINRAR中增删文件),调整完成后,可以用如下命令重签名一下
    Apk重签名命令:apktweak  --apk  xxx.apk  --sign
 
九、添加额外文件到apk
   通过常用的Zip可视化工具添加文件到apk中时,文件都是会被压缩再放入的。如果想不压缩放入文件,可以通过apktweak工具完成
Apk添加文件命令:apktweak  --apk  xxx.apk  --add file1[;file2;file3;...]
下面是常用的添加单个文件的命令例子(--add参数中不能有空格和中文)
1、apktweak --apk xxx.apk --add c:\libdemo1.so
2、apktweak --apk xxx.apk --add c:\libdemo2.so@@STORE
3、apktweak --apk xxx.apk --add c:\libdemo3.so@lib/armeabi
4、apktweak --apk xxx.apk --add c:\libdemo4.so@lib/armeabi@STORE
第一个例子表示将libdemo1.so压缩添加到apk的根目录
第二个例子表示将libdemo2.so不压缩添加到apk的根目录
第三个例子表示将libdemo3.so压缩添加到apk的lib/armeabi目录
第四个例子表示将libdemo4.so不压缩添加到apk的lib/armeabi目录
 
 
如果想要同时添加多个文件,那么文件与文件之间用英文分号隔开。
5、apktweak --apk xxx.apk --add c:\libdemo1.so;c:\libdemo2.so@@STORE;c:\libdemo3.so@lib/armeabi
 
 
 
 
十、开发自己的java插件类
1、必须要放在com.android.guobao.liao.apptweak包中
2、类名必须要以JavaTweak_开头

1
3、loadDexFile、defineJavaClass必须要至少实现其中一个,如下图demo插件

1
4、对于android.jar中实现的系统方法,建议在loadDexFile函数中hook

1
对于具体应用层的java方法,比如数据加解密相关的、请求包相关的方法,应该在defineJavaClass回调中hook,采用如下形式

1
如果需要hook类中的重载方法,一定要写明参数列表,对于混淆的方法,可以指定一个友好的方法名称。如下图

1
如果想要hook的类没有在defineJavaClass中回调,此种情况下,可以在同一个包中兄弟类加载的时候hook目标类。写法如下

1
以上就是对TweakMe3.0框架的简单介绍,如果对TweakMe感兴趣的朋友在使用过程中遇到了问题,可以加入QQ群(325509091)提问,我会及时回复解答各位的问题。如果在使用框架重打包后出现app闪退的现象,可以在群里上传你的app样本,我也会及时修复框架问题。如果对框架有什么使用建议或改进意见,可以在群中@我,我会在下一个版本升级中考虑加入。如果觉得框架解决了你的某些问题,记得在github中为我点赞加星哦。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 8
支持
分享
打赏 + 10.00雪花
打赏次数 1 雪花 + 10.00
 
赞赏  mb_ckfmrnqa   +10.00 2022/07/29
最新回复 (15)
雪    币: 17
活跃值: (891)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
3.0更新了啥啊
2022-7-30 12:42
0
雪    币: 41
活跃值: (1130)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
amwpecel 3.0更新了啥啊
升级增强了易用性,修复了一些已知的bug,支持更多的加固注入。
2022-7-30 17:20
0
雪    币: 17
活跃值: (891)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4

360加固闪退 

2022-7-30 22:56
0
雪    币: 2
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5
修改so的工具和hook框架会开源吗?
2022-8-4 21:50
0
雪    币: 41
活跃值: (1130)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
alwinwd 修改so的工具和hook框架会开源吗?
会的
2022-8-4 22:10
0
雪    币: 41
活跃值: (1130)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
amwpecel 360加固闪退 

可以提交你的样本到QQ群,我确认过问题后会修复。

最后于 2022-8-4 22:39 被liaoguobao编辑 ,原因:
2022-8-4 22:36
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
请问是否有jar包放到自己的APK里面,在插件化开发中,可以对运行在其它进程的插件进行hook吗?
2022-8-9 12:52
0
雪    币: 41
活跃值: (1130)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
wx_blain 请问是否有jar包放到自己的APK里面,在插件化开发中,可以对运行在其它进程的插件进行hook吗?
你可以先用用看
2022-8-13 11:48
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
加群没人通过。。。。。
2022-8-27 21:29
0
雪    币: 160
活跃值: (127)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
麻烦通过一下加群
2022-8-27 22:22
0
雪    币: 2415
活跃值: (1246)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
调用dex插件发一下呗
2022-12-25 21:27
0
雪    币: 243
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
感谢分享,好用!!
2022-12-27 17:58
1
雪    币: 34
活跃值: (256)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
大佬,麻烦您通过下422286056谢谢
2023-4-3 00:04
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
15
         ... 4 more
        [CIRCULAR REFERENCE:java.nio.file.NoSuchFileException: C:\Users\wyj\Desktop\TweakMe\tmp\javatweak.jar]提示缺少这个jar包
,有同学有么?
2023-4-4 10:28
0
雪    币: 17
活跃值: (85)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
怎样进群?
2023-4-14 11:27
0
游客
登录 | 注册 方可回帖
返回
//