通过上一篇 android逆向分析之反编译,在dex2jar的前提下,我们获取到了源码,在apktool的前提下,我们可以获取到资源和smali文件,本篇主要讲述smali几个最基本的知识和smali转java。
本片通过ServerListActivity.smali(来源于上篇apktool反编译出来的)来讲述,首先打开此文件,片段如下:
.class public Lcom/cpic/jst/ui/activity/ServerListActivity;
.super Lcom/cpic/jst/ui/activity/BaseActivity;
.source "ServerListActivity.java"
.class <访问权限> [关键修饰字] <类名>;
.super <父类名>;
.source <源文件名>
相当于public class ServerListActivity extends BaseActivity。
.class指令表示当前的类名,类的访问权限是public,类名为Lcom/cpic/jst/ui/activity/ServerListActivity,类开头的L是遵循Dalvik字节码的规范,表示后面是一个类。
.super指定了当前类所继承的父类,后面指的就是这个父类的类名。
.source指定了当前类的源文件名。
# interfaces
.implements Landroid/text/TextWatcher;
# interfaces是注释,表示后面是一个interface。
.implements是接口关键字。
# static fields
.field public static final REQUEST_CODE_TO_SERVERLISTDETAILSACTIVITY:I = 0x7d8
# instance fields
.field public adapter:Lcom/cpic/jst/ui/adapter/HadVisitedListAdapter;
.field private address:Ljava/lang/String;
经过上述叙述,应该明白此处# static fields为注释,一个静态字段,# instance fields注释为一个非静态字段,address为一个private的字段,现在拉取完整的smali和java代码作对比,如下:
public class ServerListActivity extends BaseActivity
implements TextWatcher
{
public static final int REQUEST_CODE_TO_SERVERLISTDETAILSACTIVITY = 2008;
public HadVisitedListAdapter adapter;
private String address;
}
.class public Lcom/cpic/jst/ui/activity/ServerListActivity;
.super Lcom/cpic/jst/ui/activity/BaseActivity;
.source "ServerListActivity.java"
# interfaces
.implements Landroid/text/TextWatcher;
# static fields
.field public static final REQUEST_CODE_TO_SERVERLISTDETAILSACTIVITY:I = 0x7d8
# instance fields
.field public adapter:Lcom/cpic/jst/ui/adapter/HadVisitedListAdapter;
.field private address:Ljava/lang/String;
smali2java
对于没有加壳加密处理过的apk,我们还可以直接通过smali2java来实现反编译,如果去深挖smali2java会发现,其实smali2java就是apktool的界面化操作,通过apktool反编译,再去把smali读取出来,smali2java不仅仅可以把整个apk读取出来,还能打开单独的smali文件然后转成java文件。
但是打开源码后,会有一些资源文件已经成了一些十六进制的代码呈现在我们眼前,这就蛋疼了,天知道这是啥呢?
少年别急,这些都是小问题。
通过刚刚的十六进制便可以在public中找到对应的名称。
对于单独一个smali文件转java文件,点击 文件–>处理单个smali文件,找到需要转换的smali文件后确定,弹窗显示smali反编译为java成功。
工具链接(apktool、dex2jar、jdgui、Smali2Java)