Landroid/os/bundle os type code;是什么意思

安卓逆向工程–修改smali实现软件破解本篇博客重点介绍基于--授权key方式的破解1 简介所谓授权key就是指软件通过安装在手机里的授权apk,实现各种高级功能。
而我们的目的就是不去安装授权apk从而实现使用高级功能。2 开始分析环境是Android Killer 1.3.1,这是我们需要逆向的apk,如果不破解,我们默认只有免费版本,而后两项不显示3分析MainActivity.smali通过Android知识我们知道,在启动的时候会默认执行onCreate方法,于是定位到 .method public onCreate(Landroid/os/B)V2.因为使用高级版必然会更改title和Button,所以我们定位到这里:cond_0:goto_0invoke-virtual {p0, v0}, Lcom/droider/free/MainA-&getString(I)Ljava/lang/Smove-result-object v1.line 36.local v1, "titleString":Ljava/lang/Sinvoke-virtual {p0, v1}, Lcom/droider/free/MainA-&setTitle(Ljava/lang/CharS)V`这里的重点就是v0,我们看到底是谁调用了cond_0我们找到了这里 `
const v2, 0x7f030001invoke-direct {p0, v2}, Lcom/droider/free/MainA-&getAppKey(I)Ljava/lang/Smove-result-object v2invoke-direct {p0, v2}, Lcom/droider/free/MainA-&decryptAppKey(Ljava/lang/S)Imove-result v0.line 32if-nez v0, :cond_0`发现重点就是decryptAppKey这个函数,我们看谁调用了它`invoke-direct {p0, v2}, Lcom/droider/free/MainA-&decryptAppKey(Ljava/lang/S)Imove-result v0.line 32if-nez v0, :cond_0 发现decryptAppKey也跳转到了cond_0,至此我们大概就明白了decryptAppKey`的功能,返回值是int最可能的就是返回资源id,然而他的参数是什么意思呢?我们暂且不去关注他,只要让她返回我么需要的资源id就行`
const v1,0x7f040003return v1.line 114:catch_0move-exception v0.line 115.local v0, "e":Ljava/lang/Einvoke-virtual {v0}, Ljava/lang/E-&printStackTrace()V.line 116const v1, 0x7f040003goto :goto_0`把返回包含异常全部改为0x7f040003即可在onCreat方法里有`invoke-direct {p0}, Lcom/droider/free/MainA-&checkappKey()Zmove-result v2if-nez v2, :cond_2`点进去看这个函数,返回boolean这个类型,作用就是看你手机里是否存在key文件,如果不存在,就使用免费版,我们把他的返回值全部为1即可`:cond_0const/4 v1, 0x1.line 93:goto_0return v1:cond_1const/4 v1, 0x1`总结我们一共只操作了两个函数,checkappKey 和decryptAppKey,前者的逻辑较为简单,后者一开始不理解传入参数是String类型是什么作用,在这里卡主了很长时间,后来发现调用这个函数的,只关注他的返回值,也就是我们的资源id,那我们为何不只修改它的返回值呢?后来看java代码发现 String类型是加密后的字符,去研究也没有作用。源码下载/s/1eRDzykq
最新教程周点击榜
微信扫一扫后使用快捷导航没有帐号?
Android 应用程序破解入门
摘要: Android软件越来越多的走向免费加广告模式了,但在我们日常应用中,还是不乏一些收费应用,一部分通过Market收费下载,另一部分将收费部分放到了软件的实现中,我们今天要讨论的就是后者,就我见到的一部分Android软 ...
Android软件越来越多的走向免费加广告模式了,但在我们日常应用中,还是不乏一些收费应用,一部分通过Market收费下载,另一部分将收费部分放到了软件的实现中,我们今天要讨论的就是后者,就我见到的一部分Android软件中,它们有通过序列号验证的,有通过Linsence绑定的,更有甚者是通过网络激活验证的,那它们的安全措施都有哪些?如何分析并破解它们?这将是这篇文章将要讲到的。破解工具介绍下表列举出了破解Android程序时可能会用到的工具:工具名称用途AXMLPrinter2.jardex-translatorJD-GUI.exeDeDexer用来解密输出APK中加密的XML文件包含dex2jar可以将APK中的classes.dex生成相应的JAR文件查看dex2jar生成的JAR文件(源码级显示,不过不太准确)DEX文件反编译工具,使用Jasmin格式Smali,BakSmali DEX文件编译与反编译工具,使用smali格式EditPlusIDA ProApktool查看及编辑反汇编后的文件DEX反编译查看工具,可用来查找DEX文件补丁位置集成了Smali与BakSmali,编译与反编译DEX更方便Eclipse,ADT插件编译Android补丁或测试程序NetbeansAndBug配合ApkTool单步调试Smali文件APK调试工具(只支持Linux平台)Android SDK这个开发与测试APK都需要,ADB,AAPT,DDMS经常要用到Jarsigner.exe.,对APK进行签名(JDK的Bin目录下)keytool.exeApkTool_GUI这个现在用的人比较多,集成了反编译、编译、签名功能于一体Android设备测试程序用,没有的话模拟器或Android-x86(Android的PC版)也行.这些工具经常配合在一起使用来反编译与编译APK文件,但ApkTool_GUI的出现将这些繁琐的工作化繁为简。EditPlus主要用来高亮显示查看生成的反编译文件,为此我制作了Editplus的高亮语法文件一起打包给大家。DeDexer与BakSmali是目前广泛使用的两款DEX反编译工具,两个工具在语法上有细微的差别,我们在下面会此进行比较。Dalvik VM & OpCodes如同破解Windows程序需要掌握Windows程序特点一样,破解Android平台的程序需要先掌握Android程序开发的一些基本知识,一般的程序破解不需要深入的了解Android程序的开发,不过对于Android程序的运行机制应该有个大致的了解,完全不懂Android程序开发的朋友还是先打打基础吧!在Windows程序的调试时代,破解者将需要分析的程序载入Ollydbg之类的调试器中,在成千上万条汇编指令中寻找突破点,MASM语法的汇编自己也成为解密者需要掌握的基础,而我们要想熟练的分析Android程序,就必须要掌握Dalvik虚拟机的指令,听到虚拟机可能一部分人开始发怵了,其实Dalvik虚拟机与我们常说的Windows平台的VM虚拟机有着很大的区别,下面我们来看看什么是Dalvik虚拟机指令是何方神圣,它在Android程序破解中又有着怎样的地位?Dalvik虚拟机是专门为 Android平台上的程序运行而设计的一种代码运行机制,它主要的作用是对JAVA程序的ByteCode进行优化,以提高代码执行效率。可以说,从Android2.2版本开始,Android系统手机真正的拉开了市场,这背后很大一部分功劳要取决于强大的Dalvik JIT编译器,正是由于它大幅提升Android2.2的各种性能。与传统的Java虚拟机(JVM)基于栈有所不同,Dalvik是基于寄存器的虚拟机,这使得它们在编译的时候只需花费更短的时间。DalvikJIT解释的JAVAByteCode源于JVM而又优于JVM,在JAVA虚拟机中,代码是基于Method方式来运行解释编译的,而在Android2.2版本及以后的DalvikJIT则是基于 Trace解释编译的,Dalvik最多支持256个寄存器,但嵌入式CPU自身并不带那么多的寄存器,Dalvik除了使用ARM本身的几个寄存器外,其它需要用到的寄存器会借用外部存储器来模拟,那Android程序运行时会用到多少个寄存器呢?答案是不确定的,它会在生成代码时进行计算。在这里,我们不去详细的探究 Dalvik的运行机制,但掌握Dalvik指令的语法为以后的逆向工程做基础却是十分有必要的。一份详细的 Dalvik opcodes表可以从Android源码中获得,在 Android4.0的源码中,可以从dalvik/opcode-gen/bytecode.txt查看到完整支持的OpCodes ,在dalvik/docs/dalvik-bytecode.html中可以找到Dalvik OpCodes的详细说明。早期的OpCodes使用一个字节就可以保存,意味着最多可以有256条指令,在最新的一份OpCodes列表中,OpCodes扩展了一字节,并扩充了一些指令。下面我们来看看Dalvik指令的格式,毕竟我们要看的不是这些OpCodes,而是由它们在一起组成的代码。新建一个Android工程命名为HelloAndroid,HelloAndroidActivity.java文件使用默认生成的代码:package cn.feicong.HelloAimport android.app.Aimport android.os.Bpublic class HelloAndroidActivity extends Activity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);}}编译生成APK文件,接下来看看反编译后的结果。首先是DeDexer,进入命令行并定位到HelloAndroid/bin目录下,在命令行下运行java-jar ddx.jar -d outdir classes.dex (可从下载DeDexer)会在outdir目录中生成六个ddx文件,如图1所示:图 1打开HelloAndroidActivity.ddx文件代码如下:.class public cn/feicong/HelloAndroid/HelloAndroidActivity.super android/app/Activity.source HelloAndroidActivity.java.method public &init&()V.limit registers 1; this: v0 (Lcn/feicong/HelloAndroid/HelloAndroidA).line 6invoke-direct {v0},android/app/Activity/&init&return-void; &init&()V.end method.method public onCreate(Landroid/os/B)V.limit registers 3; this: v1 (Lcn/feicong/HelloAndroid/HelloAndroidA); parameter[0] : v2 (Landroid/os/B).line 10invoke-super{v1,v2},android/app/Activity/onConCreate(Landroid/os/B)V.line 11const/high16v0,32515invoke-virtual{v1,v0},cn/feicong/HelloAndroid/HelloAndroidActivity/setContentVsetContentView(I)V.line 12return-void.end method.class是程序的类名,.super为它的父类,.source为源文件。.method表示是一个类的方法,后面的大写'V'表示Void,即无返回值,&init表示是构造函数,.limitregisters1表示用到了一个寄存器,分号后面是注释,.line表示行号,可有可无,invoke-direct与return-void是Dalvik的OpCode,前者调用一个类的方法,后者直接返回。看看 BakSmali的反编译代码,运行 apktool.jar d HelloAndroid.apk outdir2在outdir2目录会生成一个smali目录,同样在相应的目录会生成六个Smali结尾的文件,如图2所示:图 2打开HelloAndroidActivity..smali文件代码如下:.class public Lcn/feicong/HelloAndroid/HelloAndroidA.super Landroid/app/A.source "HelloAndroidActivity.java"# direct methods.method public constructor &init&()V.locals 0.prologue.line 6invoke-direct {p0}, Landroid/app/A-&&init&()Vreturn-void.end method# virtual methods.method public onCreate(Landroid/os/B)V.locals 1.parameter "savedInstanceState".prologue.line 10invoke-super{p0,p1},v0},Landroid/app/A-&onCreate(Landroid/os/B)V.line 11const/high16 v0, 0x7f03invoke-virtual{p0,Lcn/feicong/HelloAndroid/HelloAndroidA-&setContentView(I)V.line 12return-void.end method可以看出Smali文件的内容与ddx文件内容差别不是很大,ddx文件中有一些寄存器跟踪信息,用注释标了出来,而Smali则只对条件判断进行寄存器跟踪,ddx使用十进制表示数值,Smali则使用十六进制(Android资源ID也使用十六进制,我们搜索起来更方便),其它的不做太多比较了,不过目前使用Smali格式来分析DEX文件的人占多数,这一方面因为它代码漂亮,回编成功率高,更重要的是它能与Netbeans配合对Smali进行单步调试!!这不能不说是一个大亮点,详细的内容不是这篇文章的重点,可能以后会跟大家讨论。上面的介绍部分就到这里了,下面正式进行实战破解环节。Let's GO!破解实战先说说APK的一般破解步骤,1.对APK进行反编译。2.对反编译的Smali文件进行分析或调试。3.找到突破口,对 Smali文件进行修改。(还有一种方法,更高效,我正在测试中,成功后与大家分享)4.回编生成破解后的DEX文件。5.重新打包生成APK并签名。6.测试效果,不成功转到第二步操作。试炼品我选择了国内著名公司金山出品的WPS Android4.0.3版,此版本的WPS是一个限制试用版,在安装运行后程序会提示软件过期。而目前最新的WPS已经免费了(可能并不好卖,呵呵)。先安装运行程序,观察它的运行状态,执行这个软件会给出如图3的提示:图 3程序很大方的结出提示说已经过期了,我们点击更新即可以升级到最新版(在这里,我们就不升级了,因为升级后是免费的,对于我们练手就没搞头了),我们点击取消,程序退出。下面我们对这个APK文件进行反编译。使用ApkTool_GUI,运行如图4:将APK拖到第一个编辑框中,点击反编译APK,稍等片刻解压完成后会生成与文件名同名的文件夹,进入里面可以发现多出了一个smali文件夹,这个文件夹里面存放的就是我们需要分析的 Smali文件。我们双击打开,可以发现里面竟然有几个文件夹及几千个smali文件!!我首次打开时也吃了一惊,如此多的文件让人怎么分析啊(大家可以发怵一下),如图5所示:图 5而且每个文件的文件名也很诡异,全是一些a-z的字母组合,打开任意一个smali文件看看,发现里面的方法名也是如此。分析过C#程序的人可能会觉得这里似乎很类似,是的,这些代码如同 C#程序里面的混淆器混淆过一样,在 Android程序开发的 SDK中,提供了一套名叫 Proguard的代码保护机制,它的作用就是通过随机化改变类中的方法及变量名,去除无用的虚方法、注释等手段让代码变得难以阅读,以此来达到保护程序的目的,在这里可能很多人再次发怵,本来就没弄过Android程序,现在一上来就是个混淆过的款,叫人怎么活啊!不要急,其实,被Proguard混淆过的代码还是有办法弄的,如有主要的几个类,如Service、Activity等类名是不能被混淆的,不过这不是我们今天要讲的重点。我们接着分析,回想一下,我们在安装运行程序时,程序弹出了一个Message,想想我们在OD中破解Windows程序时用到的字符串参考,在这里是否可用呢?回答是:可以!我们在编译Android程序时,定义的字符串都保存在一个名收Strings.xml的文件中,编译生成APK后它也被加密打包到程序中了,而程序通过为每个字符串分配一个ID来进行调用,这些 ID被保存在 public.xml文件中。我们在刚才反编译的 XML文件中找找就可以发现在res/values下有这两个文件,我们打开strings.xml并查找之,很快可以发现如下两行:&string name="expired_title"&产品过期&/string&&string name="expired_message"&这是一个有使用期限的版本,从日开始此版本已过期,请确保网络通畅,并立即检查升级。&/string&这两行字符串正是前面运行程序时弹出的 MessageBox的标题与文字。我们在这里记下它们的名字为expired_title与 expired_message。打开 strings.xml文件查找expired_title与expired_message则可以找到下面两行:&public type="string" name="expired_title" id="0x7f060166" /&&public type="string" name="expired_message" id="0x7f060167" /&找到了这两个ID就好办了,我们下面来看看Android程序中是如何构建一个字符串的,修改刚才的HelloAndroid代码如下:public class HelloAndroidActivity extends Activity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);ShowString();}public void ShowString(){String str = getString(R.string.hello);Toast.makeText(getApplicationContext(), str,Toast.LENGTH_SHORT).show();}}重新生成APK后并编译代码如下:# virtual methods.method public ShowString()V.locals 3.prologue.line 16const/high16 v1, 0x7f04invoke-virtual{p0,v1},Lcn/feicong/HelloAndroid/HelloAndroidA-&getString(I)Ljava/lang/Smove-result-object v0.line 17.local v0, str:Ljava/lang/Sinvoke-virtual{p0},Lcn/feicong/HelloAndroid/HelloAndroidA-&getApplicationContext()Landroid/content/Cmove-result-object v1const/4 v2, 0x0invoke-static{v1,v0,v2},Landroid/widget/T-&makeText(Landroid/content/CLjava/lang/CharSequenI)Landroid/widget/Tmove-result-object v1invoke-virtual {v1}, Landroid/widget/T-&show()V.line 18return-void.end method.method publ
声明:本文搜集整理自互联网,版权归原作者所有,文中所述不代表本站观点,若有侵权或转载等不当之处请联系我们处理,请我们一起为维护良好的互联网秩序而努力,谢谢!联系方式见网站首页右下角。
刚表态过的朋友 ()
上一篇:下一篇:

我要回帖

更多关于 bundle.js 是什么意思 的文章

 

随机推荐