破解Android程序 破解android程序的流程: 1、分析APP中的错误提示 2、反编译APK文件,生成smali格式的反汇编代码 3、阅读smali文件的代码理解程序运行机制,找到如破口,并对代码进行修改 4、重打包并签名 5、运行测试
1、反编译apk
使用android killer反编译apk smali目录存放了程序的所有反汇编代码; res目录中存放的则是程序中的所有资源文件;
2、分析APP中的错误提示寻找突破口是分析android程序的关键。一般的做法是按程序中的错误提示信息来找到关键代码,因为错误提示代码附近通常就是程序的核心验证代码,可以通过阅读这些代码来理解程序的流程。
一般错误提示属于android程序中的字符串资源,在开发android程序时,这些字符串会被硬编码到源码中,一般引用自res\values下的strings.xms文件。 通过反编译可成功搜索到该错误提示。 反编译APK之后,所有的索引值都保存在了public.xml文件中,“无效用户名或注册码”的字符串名称为"unsuccessed"
R.java文件介绍:gen目录下的R.java文件是编译器自动生成的,它无需开发人员对其进行维护。R.java会自动收录当前应用中所有的资源,并根据这些资源建立对应的ID,包括:布局资源、控件资源、String资源、Drawable资源等。我们可以简单的把R.java理解成是当前Android应用的资源字典。
public.xml和R$string.smali为程序的资源文件, MainActivity$1.smali文件进行了调用: 发现line34处调用了checkcode()方法进行注册码合法性检测 checkecode()方法返回布尔类型的值。
move-result v0 //将返回的结果保存到v0寄存器const/4 v1, 0x0 //4字节常量 v1=0if-nez v0, :cond_0 //对v0寄存器进行判断,如果其值不为0(条件为真)就跳转到cond_0标号出,反之继续往下执行
如果代码不跳转,会执行如下代码: const v2, 0x7f0b002c //将v2寄存器传入 unsuccessed字符串的id值"0x7f0b002c"invoke-static {v0, v2, v1}, Landroid/widget/Toast;->makeText(Landroid/content/Context;II)Landroid/widget/Toast; //调用Toast;->makeText()方法创建字符串,.line 37 invoke-virtual {v0}, Landroid/widget/Toast;->show()V
如果代码跳转,会执行如下代码 会弹出注册成功的提示,这里的跳转成功意味着程序注册成功。
3、修改smali文件代码
通过分析得知,if-nez v0, :cond_0是程序破解的关键点。
if-nez是Dalvik指令集中的一个条件跳转指令,与之类似的指令有if-eqz、if-gez、if-lez等。 与if-nez指令功能相反的指令为if-eqz 表示比较结果为0或者相等时跳转。
打开MainActivity$1.smali文件,修改if-nez v0, :cond_0为if-eqz v0, :cond_0 然后保存后退出即可修改成功。 4、重编译APK并签名
使用Android killer可一键进行文件重打包,并自动为该APK文件签名
三、安装测试
将打包好的apk文件,安装在手机或模拟器中,输入任意用户名和注册码,查看程序弹出的提示信息,发现会提示“程序已注册”,意味着破解成功。
总结破解Android程序的大致流程为: 分析发现程序错误提示-反编译—定位程序关键代码-修改代码-重打包签名-测试 本次只是对Android程序分析的基础过程进行了总结,但实际测试过程中,很多APP都进行加壳保护并对代码进行了混淆,使得分析起来相当困难复杂,需要使用动态调式与其它方法进行分析。
|