首页
社区
课程
招聘
[原创]Android Mod 教程(1)初识Mod、Java生成smali环境准备(以不破坏原结构制作app共存为例)
发表于: 2019-12-16 23:17 8948

[原创]Android Mod 教程(1)初识Mod、Java生成smali环境准备(以不破坏原结构制作app共存为例)

2019-12-16 23:17
8948

目前看到制作共存大多是修改包名然后替换所有包名相关的字符串,这种方式很容易出问题,比如说有些遗漏的字符串没有替换,.so中调用了相关的包名(动态绑定情况,静态可以修改IAT替换,但是很容易出错)。所以一种比较好的方法制作共存是,修改包名且修改程序入口(不修改原来的包名),在新的入口处extends原来的入口,或是startActivity。其实这篇教程主要目的还是java生成smali的尝试,以制作共存为例,抛砖引玉,这种Java上生成smali字节码的方法可以推广到mod制作。

1月10日更新:
今天修改了一下标题,因为我成功尝试了修改app为原生层添加ASF外置sd卡写操作支持,这个过程涉及到了elf的修改,ndk jni编译so hoo .got表以及java层注入smali相配合。
感觉是一次挺有意思的尝试,其中也有很多坑(修改so直接闪退,无法调试,也没有报错信息;java内部匿名类序号不同,手动修改特别容易出错),
之后整理完成会陆续发布,可以算是对安卓制作mod的参考。

当然除了apktool其他知识为了用java编写,习惯后直接编写smali也是可以的。

先用apktool反编译源程序
(apktool出错的注意检查java环境,必须是64位,oracle的javapath可能默认是32位)

AndroidManifest.xml开头处package=""即为包名,下例为修改后的包名

<intent-filter>"android.intent.action.MAIN"极为程序入口, 修改后入口class为cn.natdon.onscripterv2yuri.start2
注意修改包名后所有的activity缺省包名都要修改。

通常情况下可以用Android Studio中的java2smali插件,但是我不想安装这么臃肿的软件。介绍一种比较轻便的生成smali方法,结合vscode自动补全功能非常好用。此方法非常小巧,所用工具不到50mb。

原理很简单,javac将.java编译为编译.class,之后用dx.jar将.class整合为classes.dex文件,再用baksmali.jar反编译.dex文件得到需要的smali。这个步骤需要android.jar 库函数还有原来程序的classes.dex转为classes.jar(为了extends继承), 极为javac -cp中的依赖项。

写成的批处理脚本为:

make_smali.bat

先放一张vscode的效果图吧:

Vscode MakeSmali demo

在vscode中 ctrl+shift+p Java: Create Java Project创建java环境,配置.classpath的dependencis(要Java: Refresh才能更新),之后即可类似于Android Studio的自动补全了。配置Build Task可以实现自动化。

.classpath

tasks.json

start.java

start.smali

start2.java

start2.smali

编译好的apk即可安装,只要原app没有校验基本上重编译的都能运行。

 
 
 
 
 

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2020-1-10 22:35 被devseed编辑 ,原因: 添加内容
收藏
免费 2
支持
分享
最新回复 (26)
雪    币: 144
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
,以前做过,都是改名称
2019-12-16 23:27
0
雪    币: 6296
活跃值: (4962)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
3
zylyy [em_13],以前做过,都是改名称
是的,基本上除了虚拟化共存都要改包名,但是这种方法好处是不用修改原来的包名,只是改入口。
2019-12-16 23:35
0
雪    币: 12502
活跃值: (3053)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
很强,只是能否帮顺便做个集成工具,哪怕是bat这种调用也行
2019-12-17 01:36
0
雪    币: 1385
活跃值: (5609)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
5
好东西,只是这个不是新版本的吧,,还在用.register么。。
2019-12-17 08:56
0
雪    币: 1867
活跃值: (3973)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
不太懂啊,不修改包名,怎么实现共存的,我理解你说的共存,就是同一个手机安装两个功能一样的apk,类似多开分身?
2019-12-17 09:35
0
雪    币: 1144
活跃值: (1274)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
表示没太看懂
2019-12-17 09:42
0
雪    币: 1380
活跃值: (1626)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
全是游戏重打包的技巧啊
2019-12-17 10:06
0
雪    币: 6296
活跃值: (4962)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
9
virjar 不太懂啊,不修改包名,怎么实现共存的,我理解你说的共存,就是同一个手机安装两个功能一样的apk,类似多开分身?
修改的是manifest里面的包名,程序的包名与manifest相同,原来的包名与结构并没有任何修改。其实就是修改入口然后再把主动权交给原来的包
2019-12-17 11:49
0
雪    币: 6296
活跃值: (4962)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
10
supperlitt 好东西,只是这个不是新版本的吧,,还在用.register么。。
用的是java 1.8,apktool也是最新版本,最新的smaili不是用register吗?
2019-12-17 11:50
0
雪    币: 1759
活跃值: (2334)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
11
正常共存大部分不都是这样做的吗
2019-12-17 13:04
0
雪    币: 6296
活跃值: (4962)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
12
又见飞刀z 正常共存大部分不都是这样做的吗
我搜索的共存资料大多是原有的路径,还有smali里面包名字符串都要修改,这样破话了原来的结构。jni调用可能出现找不到包名的情况(尤其是动态调用的时候)
2019-12-17 14:29
0
雪    币: 3279
活跃值: (3331)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
13
这种方式没办法全自动化
2019-12-17 14:59
0
雪    币: 342
活跃值: (779)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
Android Studio 修改applicationId 完成的多个包名,我看也没有修改代码结构。但是清单文件和生成的R文件路径有变化
2019-12-17 15:13
0
雪    币: 6296
活跃值: (4962)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
15
逆向小学生 Android Studio 修改applicationId 完成的多个包名,我看也没有修改代码结构。但是清单文件和生成的R文件路径有变化
android studi生成多个包名是在有源码的前提下才可以
2019-12-17 15:39
0
雪    币: 6296
活跃值: (4962)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
16
小调调 这种方式没办法全自动化
其实用python写脚本正则替换smaili注入可以完全自动化。但是这篇的目的是java生成smali的尝试,以制作共存为例,抛砖引玉,这种Java上生成smali字节码的方法可以推广到mod制作。
2019-12-17 15:41
0
雪    币: 6266
活跃值: (1276)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
17
思路很赞
2019-12-17 16:15
0
雪    币: 3279
活跃值: (3331)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
18
devseed 其实用python写脚本正则替换smaili注入可以完全自动化。但是这篇的目的是java生成smali的尝试,以制作共存为例,抛砖引玉,这种Java上生成smali字节码的方法可以推广到mod制作。
挺难通用的,不知道你有没有遇到,没有onCreate的入口,规则反而边得很复杂
2019-12-17 17:47
0
雪    币: 397
活跃值: (1411)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
话说这不是某管理器新版共存方案
2019-12-17 19:27
0
雪    币: 221
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
20
必须赞一个,能交流请教吗,扣:724818436
2020-5-5 11:35
0
雪    币: 2
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
这样并不能行吧?两个包的AndroidManifest.xml里都注册了同样包名的activity啊。。还有如果涉及到一些file provider/ 自定义permission/ 的话,在安装的时候就会报错吧?
2020-5-5 17:20
0
雪    币: 1867
活跃值: (3973)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
22
https://github.com/virjar/zelda    here
2020-5-5 20:54
0
雪    币: 14865
活跃值: (6088)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
说了一大堆,不就是只修改AndroidManifest.xml文件其它文件不做任何修改?
这样做共存的app应该是有限的。如果检查包名亦或文件路径写死包名的app就会出错。
2020-5-6 11:19
0
雪    币: 6296
活跃值: (4962)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
24
tDasm 说了一大堆,不就是只修改AndroidManifest.xml文件其它文件不做任何修改? 这样做共存的app应该是有限的。如果检查包名亦或文件路径写死包名的app就会出错。
是的,so里面如果指定包名就会出错。我说这么一大堆主要目的是来谈谈怎么去改安卓smali,以及怎么来通过java生成smali字节码,共存只是一个例子。我打算把这个mod做成一个系列,后续还有elf的编辑,so的修改等。只不过一直没有时间去更新。
2020-5-13 21:46
0
雪    币: 6296
活跃值: (4962)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
25
wx_Matrix-Neo 这样并不能行吧?两个包的AndroidManifest.xml里都注册了同样包名的activity啊。。还有如果涉及到一些file provider/ 自定义permission/ 的话,在安装的时候 ...
不知道,可能会报错吧。这只是个例子,我写这篇的主要目的是为安卓mod教程做铺垫。
2020-5-13 21:47
0
游客
登录 | 注册 方可回帖
返回
//