Android逆向工程(一)-Apktool使用
来源:互联网 发布:区块链技术 知乎 编辑:程序博客网 时间:2024/05/16 08:38
当我们辛辛苦苦写的代码被别人抄走的时候一定会让我们非常的抓狂。要学会防守,我们也需要知道别人进攻的方式,接下来我们学习下如何破解Apk。Apktool是家喻户晓的逆向工具,我们学习下如何使用它。
安装
http://ibotpeaches.github.io/Apktool/install/http://ibotpeaches.github.io/Apktool/install/
这个是官方的教程链接。目前最新版本是2.1.1,不断地更新到最新的版本是很有用的,旧版本的一些bug,在新版本很多都得到了解决。
选择自己的操作系统对应的教程,我们这里选择的是Mac,步骤已经非常的详细了,我这里就不再赘述了。
安装成功后,我们写一个Demo测试一下效果。
建一个工程随便写点什么,在Android Studio工程的app/build/outputs/apk目录下找到apk然后运行命令,教程地址 http://ibotpeaches.github.io/Apktool/ 。
命令是apktool d 后面跟apk的名字,然后运行。
运行完在apk的文件目录下得到一个新的文件夹打开是这样的。
打开清单文件
<?xml version="1.0" encoding="utf-8" standalone="no"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.caoxiao.forapktooldemo" platformBuildVersionCode="23" platformBuildVersionName="6.0-2704002"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name="com.example.caoxiao.forapktooldemo.MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application></manifest>
xml文件
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin"> <TextView android:id="@id/helloTV" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" /> <Button android:id="@id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" /></RelativeLayout>
MainActivity.smali
.class public Lcom/example/caoxiao/forapktooldemo/MainActivity;.super Landroid/support/v7/app/AppCompatActivity;.source "MainActivity.java"# instance fields.field private btn:Landroid/widget/Button;.field private helloTV:Landroid/widget/TextView;# direct methods.method public constructor <init>()V .locals 0 .prologue .line 10 invoke-direct {p0}, Landroid/support/v7/app/AppCompatActivity;-><init>()V return-void.end method.method static synthetic access$000(Lcom/example/caoxiao/forapktooldemo/MainActivity;)Landroid/widget/TextView; .locals 1 .param p0, "x0" # Lcom/example/caoxiao/forapktooldemo/MainActivity; .prologue .line 10 iget-object v0, p0, Lcom/example/caoxiao/forapktooldemo/MainActivity;->helloTV:Landroid/widget/TextView; return-object v0.end method# virtual methods.method protected onCreate(Landroid/os/Bundle;)V .locals 2 .param p1, "savedInstanceState" # Landroid/os/Bundle; .prologue .line 17 invoke-super {p0, p1}, Landroid/support/v7/app/AppCompatActivity;->onCreate(Landroid/os/Bundle;)V .line 18 const v0, 0x7f040019 invoke-virtual {p0, v0}, Lcom/example/caoxiao/forapktooldemo/MainActivity;->setContentView(I)V .line 20 const v0, 0x7f0c0050 invoke-virtual {p0, v0}, Lcom/example/caoxiao/forapktooldemo/MainActivity;->findViewById(I)Landroid/view/View; move-result-object v0 check-cast v0, Landroid/widget/TextView; iput-object v0, p0, Lcom/example/caoxiao/forapktooldemo/MainActivity;->helloTV:Landroid/widget/TextView; .line 21 const v0, 0x7f0c0051 invoke-virtual {p0, v0}, Lcom/example/caoxiao/forapktooldemo/MainActivity;->findViewById(I)Landroid/view/View; move-result-object v0 check-cast v0, Landroid/widget/Button; iput-object v0, p0, Lcom/example/caoxiao/forapktooldemo/MainActivity;->btn:Landroid/widget/Button; .line 22 iget-object v0, p0, Lcom/example/caoxiao/forapktooldemo/MainActivity;->btn:Landroid/widget/Button; new-instance v1, Lcom/example/caoxiao/forapktooldemo/MainActivity$1; invoke-direct {v1, p0}, Lcom/example/caoxiao/forapktooldemo/MainActivity$1;-><init>(Lcom/example/caoxiao/forapktooldemo/MainActivity;)V invoke-virtual {v0, v1}, Landroid/widget/Button;->setOnClickListener(Landroid/view/View$OnClickListener;)V .line 29 return-void.end method
这个是Dalvik汇编语言,咋一看肯定是不知所云,我们跟源代码对比下。
package com.example.caoxiao.forapktooldemo;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends AppCompatActivity { private TextView helloTV; private Button btn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); helloTV = (TextView) findViewById(R.id.helloTV); btn = (Button) findViewById(R.id.btn); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { helloTV.setText("ApkTool"); Toast.makeText(MainActivity.this, getResources().getString(R.string.app_name), Toast.LENGTH_SHORT).show(); } }); }}
能看到线索了吧。我们甚至可以直接修改MainActivity.smali的代码,然后运行apktool b命令重新打包,这个暂时脱离了逆向工程的主题后续有空再分析。关于Apktool的使用先将到这,后续还会有 dex2jar和jd-gui的使用教程,这两个工具主要可以帮助我们分析代码,也是逆向工程的神器。
- Android逆向工程(一)-Apktool使用
- Android逆向apktool使用
- apktool(android app逆向)
- Android反编译(一):apktool的使用
- android 逆向工程apktool dex2jar jd-gui Jadx Smali2Java
- Android逆向分析之APKTool
- ApkTool Android APK 逆向分析
- powerdesigner15 逆向工程(一)
- Android逆向笔记(1)---工具篇之apktool
- 逆向工程(一):汇编、逆向工程基础篇
- 逆向工程(一):汇编、逆向工程基础篇
- Android 反编译(一,apktool+smail2java)
- Android逆向工具Apktool的安装
- apk 逆向解析 apktool的使用等
- 软件逆向工程学习(一)
- 逆向工程(一)书目列表
- Android使用apktool反编译
- Android逆向工程
- 如何理解计算机视觉
- 范型程序设计——洗牌
- 多线程的实现基础知识总结
- eclipse svn安装
- XSS攻击
- Android逆向工程(一)-Apktool使用
- python生成log文件
- Java类
- Android ROM包文件系统根结构分析
- LeetCode:Validate Binary Search Tree
- APP应用程序图标 及 程序启动画面设置 ios logo设置
- 独立编译单个C文件快速shell脚本
- strnset
- maven自动部署插件配置