我的Android逆向之路(二)

来源:互联网 发布:戴予桐 直播软件 编辑:程序博客网 时间:2024/06/16 02:25

0x00 前言

  装好JDK及Android studio之后,我们还需要安装一款安卓逆向集成工具:Android Killer。关于这个工具的使用及下载详见:http://www.52pojie.cn/thread-319641-1-1.html

  装好Android Killer之后,下面以一个简单的例子来学习下安卓逆向。


0x01 一个简单的android小程序

  在android studio里新建一个项目,在创建活动项目界面处,选择Add No Activity,即我们不使用android studio提供的活动模板,而是手动创建自己的活动。

  下面是helloworld程序的主要文件代码:

FirstActivity.java文件:

package com.example.administrator.helloword;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.Toast;public class FirstActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.first_layout);        Button button1 = (Button) findViewById(R.id.button_1);        button1.setOnClickListener(new View.OnClickListener(){            @Override            public void onClick(View v){                Toast.makeText(FirstActivity.this,"You click the button!",Toast.LENGTH_SHORT).show();            }        });    }}

first_layout.xml文件:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical" android:layout_width="match_parent"    android:layout_height="match_parent">    <Button        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:id="@+id/button_1"        android:text="Button 1"/></LinearLayout>


AndroidManifest.xml文件:

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.administrator.helloword">    <application        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:roundIcon="@mipmap/ic_launcher_round"        android:supportsRtl="true"        android:theme="@style/AppTheme">        <activity android:name=".FirstActivity"            android:label="This is FirstActivity">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>    </application></manifest>

编译后,将app装入到手机中,显示如下:

 

点击中间的button会显示"You click the button!":

 


0x02 对helloworld.app进行反编译

  打开Android Killer,将helloworld.app拖入到程序内,程序将自动进行反编译。反编译之后的smali文件结构如下:



0x03 程序中主要smali文件详解

FirstActivity.smali文件:

.class public Lcom/example/administrator/helloword/FirstActivity;# public com.example.administator.helloword.FirstActivity.super Landroid/support/v7/app/AppCompatActivity;# extend android.support.v7.app.AppCompatActivity.source "FirstActivity.java"# 源文件名称# direct methods ==>直接方法.method public constructor <init>()V  ==>构造方法    .locals 0  ==>局部变量数量为0    .prologue  ==>代码起始位置,本程序代码起始位置是FirstActivity.java中的第9行    .line 9    invoke-direct {p0}, Landroid/support/v7/app/AppCompatActivity;-><init>()V     #调用父类的构造方法,返回void    #对于一个非静态的方法而言,Dalvik虚拟机会隐含的使用p0寄存器当作类的this引用   return-void.end method# virtual methods  ==>虚方法.method protected onCreate(Landroid/os/Bundle;)V  ==>protected void onCreate(android.os.Bundle p1)    .locals 2    .param p1, "savedInstanceState"    # Landroid/os/Bundle; ==> p1=savedInstanceState    .prologue    .line 13    invoke-super {p0, p1}, Landroid/support/v7/app/AppCompatActivity;->onCreate(Landroid/os/Bundle;)V    #调用实例的父类方法,等价于p0(this).super(android.support.v7.app.AppCompatActivity).onCreate(p1)    .line 14    const v1, 0x7f04001b    invoke-virtual {p0, v1}, Lcom/example/administrator/helloword/FirstActivity;->setContentView(I)V    #调用实例的虚方法,等价于this.setContentView(int)    .line 15    const v1, 0x7f0b0056  ==> v1=0x7f0b0056,v1为常量
    invoke-virtual {p0, v1}, Lcom/example/administrator/helloword/FirstActivity;->findViewById(I)Landroid/view/View;    #this.findViewById(I),返回view    move-result-object v0  ==> v0=上个函数调用返回的view    check-cast v0, Landroid/widget/Button;    #将v0寄存器中的对象引用转换为指定的Button类型   .line 16    .local v0, "button1":Landroid/widget/Button;  ==> v0参数的名字为"button1"    new-instance v1, Lcom/example/administrator/helloword/FirstActivity$1;    #构造一个指定类型对象的新实例,即v1=new com.example.administrator.helloworld.FirstActivity$1    invoke-direct {v1, p0}, Lcom/example/administrator/helloword/FirstActivity$1;-><init>(Lcom/example/administrator/helloword/FirstActivity;)V    #v1.construct(this)    invoke-virtual {v0, v1}, Landroid/widget/Button;->setOnClickListener(Landroid/view/View$OnClickListener;)V    .line 22    return-void.end method


FirstActivity$1.smali文件:

.class Lcom/example/administrator/helloword/FirstActivity$1;.super Ljava/lang/Object;.source "FirstActivity.java"# interfaces  ==>接口注释.implements Landroid/view/View$OnClickListener;  ==>接口名# annotations  ==>注释.annotation system Ldalvik/annotation/EnclosingMethod;    value = Lcom/example/administrator/helloword/FirstActivity;->onCreate(Landroid/os/Bundle;)V.end annotation.annotation system Ldalvik/annotation/InnerClass;    accessFlags = 0x0    name = null.end annotation# instance fields  ==>实例字段声明.field final synthetic this$0:Lcom/example/administrator/helloword/FirstActivity;# direct methods.method constructor <init>(Lcom/example/administrator/helloword/FirstActivity;)V    .locals 0    .param p1, "this$0"    # Lcom/example/administrator/helloword/FirstActivity;    .prologue    .line 16    iput-object p1, p0, Lcom/example/administrator/helloword/FirstActivity$1;->this$0:Lcom/example/administrator/helloword/FirstActivity;    #p0=FirstActivity$1.this$0(p1)    invoke-direct {p0}, Ljava/lang/Object;-><init>()V    return-void.end method# virtual methods.method public onClick(Landroid/view/View;)V    .locals 3    .param p1, "v"    # Landroid/view/View;    .prologue    .line 19    iget-object v0, p0, Lcom/example/administrator/helloword/FirstActivity$1;->this$0:Lcom/example/administrator/helloword/FirstActivity;    const-string v1, "You click the button!"    const/4 v2, 0x0    invoke-static {v0, v1, v2}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;    move-result-object v0    #将invoke-static{}方法返回值赋给v0    invoke-virtual {v0}, Landroid/widget/Toast;->show()V    .line 20    return-void.end method
详细的关于smali的语法的总结将在下一篇介绍