本帖最后由 择城终老 于 2016-11-7 20:22 编辑
前面我们已经介绍了破解的思路,这里我们就开始实战,也会主动去解析一篇Dalvik汇编代码。
1.IDA pro的初体验
我们有一款强大的反汇编工具,那就是 IDA pro。
下载爱奇艺apk文件,用解压缩软件打开拷贝出classes.dex,将此文件直接移动到IDA pro中,如下图所示,你会得到该apk的所有反汇编代码:
ALT+T负责定位搜索关键代码段。比如爱奇艺看会员剧的时候,如果你不是会员会提示如下图所示的字符串:
如果该字符串是直接写在Android程序的代码中的,比如:
Log.e(this.getclass().getname(),"错了");
那么你直接复制字符串定位,如果是写在资源文件res/value/string中的,就是上图这样,你就需要找到该字符串的ID,ALT+T进行定位。
2.apktool的初体验
下载工具,这个不用多说,将爱奇艺apk与apktool工具放在一个文件夹中,cmd定位到该文件,输入如下图所示的命令,如图:
这样爱奇艺就反编译成功,在该目录的文件夹aiqiyi中,中间是apk,最后是保存反编译文件夹。
3.初步讲解Dalvik汇编指令
我们通过apktool反编译后,查看清单文件发现。com.iqiyi.paopao.common.ui.activity.PaopaoTransferActivity该类为启动界面。那我们就分析该类的代码,当然启动界面不一定是主界面,有可能是启动动画,后续会跳转。(这里只做汇编语法分析)
.class public Lcom/iqiyi/paopao/common/ui/activity/PaopaoTransferActivity;
这很一目了然,该类的名字
.super Landroid/app/Activity;
他的父类是Activity。
# annotations
.annotation build Lcom/qiyi/qyapm/agent/android/instrumentation/Instrumented;
.end annotation
注解类Instrumented
# static fields
.field private static b:Z
.field private static c:Z
.field private static d:I
.field private static e:Landroid/content/Intent;
.field private static f:Lcom/iqiyi/paopao/common/h/com6;
.field private static g:Z
.field private static h:Z
静态字段,翻译成java:
private static Z b,,c,d,g,h;
private static Intent e;
private static com6 f;
你是不是会问哪里来的Z类与com6类?,该类文件夹下就有该类不信你看:
# direct methods
.method static constructor <clinit>()V
.locals 2
const/4 v1, 0x1
const/4 v0, 0x0
sput-boolean v0, Lcom/iqiyi/paopao/common/ui/activity/PaopaoTransferActivity;->b:Z
sput-boolean v1, Lcom/iqiyi/paopao/common/ui/activity/PaopaoTransferActivity;->c:Z
sput-boolean v1, Lcom/iqiyi/paopao/common/ui/activity/PaopaoTransferActivity;->g:Z
sput-boolean v0, Lcom/iqiyi/paopao/common/ui/activity/PaopaoTransferActivity;->h:Z
return-void
.end method
方法,有methods一目了然,且为构造函数constructor,locals 2局部变量为2,这里可以看到,方法没有多少行的说明,也就是.line num。显然这里的代码是经过混淆的。
const/4 v1,0x1 将数值符号扩展为32位后赋值给寄存器v1。
sput的意思是将静态字段(s)。(put)写。还原成java:
this.b=false;而v0存储的就是b。后面同样道理
return -void:表示函数从一个void返回。
今天暂时写这么多,时间有限,还请见谅。
|