1.目的
使用jeb对apk文件进行反编译, 观察代码逻辑,判断找出要修改的位置
通过apktool解析apk,修改smali文件中的部分内容达到以下效果:
1) 改变if条件跳转的方向
2) 给某个关键变量赋予新的值
2.平台及工具:
win10
android studio, apktool, jeb
apktool的下载地址
https://ibotpeaches.github.io/Apktool/
3.实验步骤
(1)打开android studio新建一个项目,主要代码如下:
public class MainActivity extends AppCompatActivity {
TextView textView;
private int k;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.text);
k = 1;
if(mTest(k) == 100){
textView.setText("k is "+k);
}else{
textView.setText("k is not 100");
}
}
private int mTest(int num){
return num+1;
}
}
为了方便,使用as在debug下的默认签名来签名生成的apk
(2) 将apk用模拟器和jeb打开查看如下:
以上为MainActivity对应的smali文件中的内容,按Tab键可切换为熟悉的java源代码,且光标停在的位置与smali对应,方便查找要修改的位置
将光标停在if后,按tab键,返回到smali文件中对应的位置。
If-ne表明v0 (mTest函数的返回结果)和v1 (100)不相等时,将要跳转到 :74的位置,
即textView中显示”k is not 100”这块代码的位置。
显然 k+1 = 2 != 100, 显示的内容正如模拟器中看到的 ”k is not 100”
通过修改smali文件的部分内容后,再重新打包签名apk,可使跳转进入另一个分支。
修改方式
- 将if-ne修改为if-eq
- 在判断前将v0的值修改为100(或者将v1的值修改为2)
(3) 用apktool解析apk
命令行下输入apktool d app-debug.apk -o output
之后在产生的output文件夹中找到MainActivity.smali, 以下是通过Notepad++打开并修改
将if-ne改为if-eq:
或者在if-ne判断之前修改v0的值为100
以上两种方法都可以实现分支的跳转
保存后再次来到apktool.bat所在目录对output文件夹进行编译:
apktool b output -o changed.apk
生成名为changed.apk,此时还无法安装,需要进行签名:
Note:签名是对要发布的apk文件作标记,确保你的apk文件有唯一的身份归属认证,只有相同签名和相同包名的文件才可以覆盖安装并保留用户信息,显然这方便了app的升级操作。
对于反编译修改过的apk,由于我们使用的签名一般不可能和原作者的签名相同,好比我们写不出别人的字迹一样,盗版与正版一目了然。
使用指令生成key store:
keytool -genkey -alias demo.keystore -keyalg RSA -validity 10000 -keystore demo.keystore
之后按要求可随意输入内容,完成后生成一个demo.keystore文件
参数解释:
-genkey 产生证书文件
-alias 产生别名,名称随意
-keystore 指定密钥库的.keystore文件中
-keyalg 指定密钥的算法,这里指定为RSA(非对称密钥算法),默认使用DSA加密
-validity 为证书有效天数,这里我们写的是10000天
这一步实际上是android studio的Generate Signed Bundle or APK中create new key store这个功能,所以完全可以用as产生一个key store:
签名APK:
输入:
jarsigner -verbose -keystore demo.keystore changed.apk demo.keystore
回车后会要求输入生成demo.keystore时设置的密码。
参数解释:
-verbose 指定生成详细输出
-keystore 指定数字证书存储路径
最后记得将原来安装的卸载,因为签名已经更换,否则会安装失败
模拟器运行截图: