大家对反编译以及smali有盲点可以先看看
小实践–破解一个小程序
如何破解
破解Android程序通常的方法是将apk文件利用ApkTool反编译,生成Smali格式的反汇编代码.然后阅读Smali文件的代码来理解程序的运行机制,找到程序的突破口进行修改,最后使用ApkTool重新编译生成Apk文件并签名,最后运行测试,如此循环,直到程序被成功破解.
需要工具
签名工具: SignApk : 链接:http://pan.baidu.com/s/1miwl6lU 密码:ze44
下载完之后 解压目录到path环境变量 你懂得
准备
我们先建立一个自己的App,长得像这样(PS:不愿意自己建有源码下载)
功能就是根据输入的用户名生成注册码,判断输入的注册码和系统算法生成的注册码是否一致,一致则注册成功,软件可用,否则则不可用;
软件核心代码
findViewById(R.id.act_main_btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String userName = etUser.getText().toString().trim();
String sn = etSN.getText().toString().trim();
if (checkSN(userName, sn)) {
Toast.makeText(MainActivity.this, R.string.string_register, Toast.LENGTH_SHORT).show();
tvTitle.setText(R.string.string_success_register);
} else {
Toast.makeText(MainActivity.this, R.string.string_unregister, Toast.LENGTH_SHORT).show();
}
}
});
开始破解
首先我们需要用apktool d appname.apk 进行反编译 如图
然后生成了一个appName的文件夹 里面就是 那些smali等文件了
之后我们的目的 是找到突破口,什么是突破口?
点击Button之后的提示文字就是突破口
我们进入values中的string.xml找找看
开发Android程序时,String.xml文件中的所有字符串资源都在”gen//R.java”文件的String类中被标识,每个字符串都有唯一的int类型索引值,使用ApkTool反编译Apk文件后,所有的索引值保存在string.xml文件同目录下的public.xml中
搜索string_unregister在public.xml中
我们发现string_unregister所对应的id为 0x7f060027
书上说需要全局搜索smali文件夹中包含0x7f060027文件的位置,我们知道是在MainActivity中声明的,直接进入即可(PS:惭愧,我不知道如何全局搜索文件内的内容)
我们进入MainActivity$1.smali搜索0x7f060027 如图
解析如下
按图修改之后,我们进入app文件夹,再次编译打包会在dist中生成一个app,我们现在签名(不签名是无法运行测试的) 如图
然后我们进行签名,用我们下载的signapk工具,生成->已签名的App 如图
生成之后 我们可以通过adb install signed.apk 安装到手机测试 也可以复制到手机上直接安装,哦,可能会报错
把手机上的相同App卸载了即可
安装之后,就这样了
参考书籍: Android软件安全与逆向分析