我的Android逆向之路(二)
来源:互联网 发布:戴予桐 直播软件 编辑:程序博客网 时间:2024/06/16 10:23
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的语法的总结将在下一篇介绍
阅读全文
0 0
- 我的Android逆向之路(二)
- 我的Android逆向之路(一)
- 【android逆向笔记】(二)滚动的天空逆向
- Android Unity3D 逆向截取交互事件(二) 之逆向修改dll并加入Java的接口
- 我的Kotlin For Android之路开篇(二)
- 逆向之堆排序 ,逆向之二路归并排序
- Android学习之路(二)之 我的第一个Android应用程序
- Sun的逆向之路(二)——FiF口语训练的刷分剖析
- OS逆向之二--逆向技术基本操作(未完成)
- 我的ARM之路(二)
- 我的项目之路(二)
- 我的软件工程之路(二)
- 我的程序员之路(二)
- 我的咨询之路(二)
- 我的电子商务之路(二)
- 我的JAVA之路(二)
- 我的jquery之路(二)
- 我的前端之路(二)
- Java基础总结-流
- [Windows 10]「ビルトイン Administrator アカウントを使って、Microsoft Edgeを開けません」への対処法
- 前端面试问题
- 小例子来理解MapReduce
- 关注民生民情
- 我的Android逆向之路(二)
- 主从DB与cache一致性
- 浅析Python3中的bytes和str类型
- 3.Actitity的生命周期
- [cv] optical flow
- java常用类:List接口常用方法
- [jzoj]1262. 为奶牛熄灯(迭代加深搜索+一堆优化vs记忆化vs状压DP)
- Redis脚本
- sdut-1117 C语言实验——求绝对值(选择结构)