ホームページ Java &#&チュートリアル アンドロイドの逆コンパイル: smali 構文

アンドロイドの逆コンパイル: smali 構文

Nov 26, 2016 am 10:42 AM
android smali

前書き

Android 逆コンパイル ツールとその逆コンパイル方法については以前に説明しました。逆コンパイル後、jar または smali ファイルを取得できます。 Android は開発に Java 言語を使用しますが、Android システムには独自の仮想マシン Dalvik があり、最終的にコードのコンパイルには Java クラスを使用せず、smali を使用します。逆コンパイルしたコードがjarだと正しく解釈されない箇所が多く、smaliを逆コンパイルするとプログラムの意味が正しく理解できます。したがって、smali 構文に精通する必要があります。

型の表現

Javaにはプリミティブ型と参照型(オブジェクトを含む)の2つの型があり、smaliにマッピングされたこれら2つの型もあります。

プリミティブ型

V void (戻り値の型にのみ使用可能)
Z boolean
B byte
S short
C char
I int
J long
F float
D Double

オブジェクト型

Lpackage/ name /ObjectName; java

L の package.name.ObjectName に相当します。これがオブジェクトタイプであることを示します
package/name オブジェクトが配置されているパッケージ
ObjectName オブジェクト名の末尾を識別します

;配列の

[ I は int[] と同等の int 型の 1 次元配列を表します。

次元を追加し、[[I は int[][] を表します

最大数配列の各次元は 255;

オブジェクトの配列表現も同様に、例えば String 配列の表現は [Ljava/lang/String です

Java のレジスタと変数

変数はすべてメモリに格納されます。 Android のパフォーマンスを向上させるために、変数はレジスタに保存されます。レジスタは 32 ビットで、あらゆる型をサポートできます。そのうち、long と double は 64 ビットで、2 つのレジスタに保存する必要があります。

レジスタはvで名前が付けられており、p

vはローカルレジスタ、pはパラメータレジスタを表し、その関係は次のとおりです

メソッドに2つのローカル変数がある場合、パラメータは3つあります

v0 最初のローカルレジスタ

v1 2 番目のローカルレジスタ
v2 p0 (this)
v3 p1 最初のパラメータ
v4 p2 2 番目のパラメータ
v5 p3 3 番目のパラメータ

もちろん、静的メソッドであればレジスタは 5 つしかなく、その必要はありませんこれを保管してください。

.registers この命令を使用して、メソッド内のレジスタの総数を指定します。

.locals この指定を使用して、メソッド内の非パラメータ レジスタの総数を示し、メソッドの最初の行に配置します。

メソッドとフィールドの表現

メソッドシグネチャ

methodName(III)Lpackage/name/ObjectName;

ndk 開発を行ったことがある場合は、メソッドを識別する方法であるこのようなシグネチャに精通しているはずです。

上記の methodName はメソッド名を表し、III は 3 つの整数パラメータを表し、Lpackage/name/ObjectName は戻り値の型を表します。

メソッドの表現

Lpackage/name/ObjectName;——>methodName(III)Z

つまり、package.name.ObjectNameの関数boolean methodondName(int a, int b, int c)はこれに似ています。

field

Lpackage/name/ObjectName;——>FieldName:Ljava/lang/String;

の表現は、パッケージ名、フィールド名、各フィールドの型を意味します

方法的定义

比如我下面的一个方法

private static int sum(int a, int b) {
        return a+b;
}
ログイン後にコピー

使用编译后是这样

.method private static sum(II)I

.locals 4 #表示需要申请4个本地寄存器

.parameter

.parameter #这里表示有两个参数

.prologue

.line 27

move v0, p0

.local v0, a:I

move v1, p1

.local v1, b:I

move v2, v0

move v3, v1

add-int/2addr v2, v3

move v0, v2

.end local v0 #a:I

return v0

.end method

从上面可以看到函数声明使用.method开始 .end method结束,java中的关键词private,static 等都可以使用,同时使用签名来表示唯一的方法,这里是sum(II)I。

声明成员

.field private name:Lpackage/name/ObjectName;
比如:private TextView mTextView;表示就是
.field private mTextView:Landroid/widget/TextView;
private int mCount;
.field private mCount:I

指令执行

smali字节码是类似于汇编的,如果你有汇编基础,理解起来是非常容易的。

比如:
move v0, v3 #把v3寄存器的值移动到寄存器v0上.

const v0, 0×1 #把值0×1赋值到寄存器v0上。

invoke-static {v4, v5}, Lme/isming/myapplication/MainActivity;->sum(II)I #执行方法sum(),v4,v5的值分别作为sum的参数。

其他

通过前面我们可以看到,smali就是类似汇编,其中很多命令,我们可以去查它的手册来一一对应。学习时,我们可以自己写一个比较简单的java文件,然后转成smali文件来对照学习。

下面,我贴一个我写的一个比较简单的java文件以及其对应的smali,其中包含if判断和for循环。

java文件:

package me.isming.myapplication;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
public class MainActivity extends ActionBarActivity {
    private TextView mTextView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView = (TextView) findViewById(R.id.text);
        mTextView.setText("a+b=" + sum(1,2) + "a>b?" + max(1,2) + "5 accumulate:" + accumulate(5));
    }
    private static int sum(int a, int b) {
        return a+b;
    }
    private boolean max(int a, int b) {
        if (a > b) {
            return true;
        } else {
            return false;
        }
    }
 
    private int accumulate(int a) {
        if (a <= 0) {
            return 0;
        }
        int sum = 0;
        for(int i = 0; i <= a; i++) {
            sum += a;
        }
        return sum;
    }
}
ログイン後にコピー

对应的smali:

.class public Lme/isming/myapplication/MainActivity;

.super Landroid/support/v7/app/ActionBarActivity;

.source "MainActivity.java"

# instance fields

.field private mTextView:Landroid/widget/TextView;

# direct methods

.method public constructor <init>()V

    .locals 2

    .prologue

    .line 10

    move-object v0, p0

    .local v0, this:Lme/isming/myapplication/MainActivity;

    move-object v1, v0

    invoke-direct {v1}, Landroid/support/v7/app/ActionBarActivity;-><init>()V

    return-void

.end method

.method private accumulate(I)I

    .locals 6

    .parameter

    .prologue

    .line 39

    move-object v0, p0

    .local v0, this:Lme/isming/myapplication/MainActivity;

    move v1, p1

    .local v1, a:I

    move v4, v1

    if-gtz v4, :cond_0

    .line 40

    const/4 v4, 0x0

    move v0, v4

    .line 46

    .end local v0           #this:Lme/isming/myapplication/MainActivity;

    :goto_0

    return v0

    .line 42

    .restart local v0       #this:Lme/isming/myapplication/MainActivity;

    :cond_0

    const/4 v4, 0x0

    move v2, v4

    .line 43

    .local v2, sum:I

    const/4 v4, 0x0

    move v3, v4

    .local v3, i:I

    :goto_1

    move v4, v3

    move v5, v1

    if-gt v4, v5, :cond_1

    .line 44

    move v4, v2

    move v5, v1

    add-int/2addr v4, v5

    move v2, v4

    .line 43

    add-int/lit8 v3, v3, 0x1

    goto :goto_1

    .line 46

    :cond_1

    move v4, v2

    move v0, v4

    goto :goto_0

.end method

.method private max(II)Z

    .locals 5

    .parameter

    .parameter

    .prologue

    .line 31

    move-object v0, p0

    .local v0, this:Lme/isming/myapplication/MainActivity;

    move v1, p1

    .local v1, a:I

    move v2, p2

    .local v2, b:I

    move v3, v1

    move v4, v2

    if-le v3, v4, :cond_0

    .line 32

    const/4 v3, 0x1

    move v0, v3

    .line 34

    .end local v0           #this:Lme/isming/myapplication/MainActivity;

    :goto_0

    return v0

    .restart local v0       #this:Lme/isming/myapplication/MainActivity;

    :cond_0

    const/4 v3, 0x0

    move v0, v3

    goto :goto_0

.end method

.method private static sum(II)I

    .locals 4

    .parameter

    .parameter

    .prologue

    .line 27

    move v0, p0

    .local v0, a:I

    move v1, p1

    .local v1, b:I

    move v2, v0

    move v3, v1

    add-int/2addr v2, v3

    move v0, v2

    .end local v0           #a:I

    return v0

.end method

# virtual methods

.method protected onCreate(Landroid/os/Bundle;)V

    .locals 8

    .parameter

    .prologue

    .line 16

    move-object v0, p0

    .local v0, this:Lme/isming/myapplication/MainActivity;

    move-object v1, p1

    .local v1, savedInstanceState:Landroid/os/Bundle;

    move-object v2, v0

    move-object v3, v1

    invoke-super {v2, v3}, Landroid/support/v7/app/ActionBarActivity;->onCreate(Landroid/os/Bundle;)V

    .line 17

    move-object v2, v0

    const v3, 0x7f030017

    invoke-virtual {v2, v3}, Lme/isming/myapplication/MainActivity;->setContentView(I)V

    .line 19

    move-object v2, v0

    move-object v3, v0

    const v4, 0x7f08003f

    invoke-virtual {v3, v4}, Lme/isming/myapplication/MainActivity;->findViewById(I)Landroid/view/View;

    move-result-object v3

    check-cast v3, Landroid/widget/TextView;

    iput-object v3, v2, Lme/isming/myapplication/MainActivity;->mTextView:Landroid/widget/TextView;

    .line 21

    move-object v2, v0

    iget-object v2, v2, Lme/isming/myapplication/MainActivity;->mTextView:Landroid/widget/TextView;

    new-instance v3, Ljava/lang/StringBuilder;

    move-object v7, v3

    move-object v3, v7

    move-object v4, v7

    invoke-direct {v4}, Ljava/lang/StringBuilder;-><init>()V

    const-string v4, "a+b="

    invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v3

    const/4 v4, 0x1

    const/4 v5, 0x2

    invoke-static {v4, v5}, Lme/isming/myapplication/MainActivity;->sum(II)I

    move-result v4

    invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;

    move-result-object v3

    const-string v4, "a>b?"

    invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v3

    move-object v4, v0

    const/4 v5, 0x1

    const/4 v6, 0x2

    invoke-direct {v4, v5, v6}, Lme/isming/myapplication/MainActivity;->max(II)Z

    move-result v4

    invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Z)Ljava/lang/StringBuilder;

    move-result-object v3

    const-string v4, "5 accumulate:"

    invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v3

    move-object v4, v0

    const/4 v5, 0x5

    invoke-direct {v4, v5}, Lme/isming/myapplication/MainActivity;->accumulate(I)I

    move-result v4

    invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;

    move-result-object v3

    invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v3

    invoke-virtual {v2, v3}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V

    .line 23

    return-void

.end method

参考资料

最后附上一些参考资料:

http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html

https://code.google.com/p/smali/w/list

http://www.miui.com/thread-409543-1-1.html

   


このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

新しいレポートは、噂のSamsung Galaxy S25、Galaxy S25 Plus、Galaxy S25 Ultraのカメラアップグレードのひどい評価を提供します 新しいレポートは、噂のSamsung Galaxy S25、Galaxy S25 Plus、Galaxy S25 Ultraのカメラアップグレードのひどい評価を提供します Sep 12, 2024 pm 12:23 PM

ここ数日、Ice Universeは、サムスンの次期主力スマートフォンであると広く信じられているGalaxy S25 Ultraの詳細を着実に明らかにしている。とりわけ、リーカーはサムスンがカメラのアップグレードを1つだけ計画していると主張した

Samsung Galaxy S25 Ultraの最初のレンダリング画像がリークされ、噂のデザイン変更が明らかに Samsung Galaxy S25 Ultraの最初のレンダリング画像がリークされ、噂のデザイン変更が明らかに Sep 11, 2024 am 06:37 AM

OnLeaks は、X (旧 Twitter) のフォロワーから 4,000 ドル以上を集めようとして失敗した数日後、Android Headlines と提携して Galaxy S25 Ultra のファーストルックを提供しました。コンテキストとして、h の下に埋め込まれたレンダリング イメージ

IFA 2024 | TCLのNXTPAPER 14は、パフォーマンスではGalaxy Tab S10 Ultraに匹敵しませんが、サイズではほぼ匹敵します IFA 2024 | TCLのNXTPAPER 14は、パフォーマンスではGalaxy Tab S10 Ultraに匹敵しませんが、サイズではほぼ匹敵します Sep 07, 2024 am 06:35 AM

TCLは、2つの新しいスマートフォンの発表に加えて、NXTPAPER 14と呼ばれる新しいAndroidタブレットも発表しました。その巨大な画面サイズはセールスポイントの1つです。 NXTPAPER 14 は、TCL の代表的なブランドであるマット LCD パネルのバージョン 3.0 を搭載しています。

Vivo Y300 Pro は、7.69 mm のスリムなボディに 6,500 mAh のバッテリーを搭載 Vivo Y300 Pro は、7.69 mm のスリムなボディに 6,500 mAh のバッテリーを搭載 Sep 07, 2024 am 06:39 AM

Vivo Y300 Pro は完全に公開されたばかりで、大容量バッテリーを備えた最もスリムなミッドレンジ Android スマートフォンの 1 つです。正確に言うと、このスマートフォンの厚さはわずか 7.69 mm ですが、6,500 mAh のバッテリーを搭載しています。これは最近発売されたものと同じ容量です

Samsung Galaxy S24 FEは、4色と2つのメモリオプションで予想よりも低価格で発売されると請求されています Samsung Galaxy S24 FEは、4色と2つのメモリオプションで予想よりも低価格で発売されると請求されています Sep 12, 2024 pm 09:21 PM

サムスンは、ファンエディション(FE)スマートフォンシリーズをいつアップデートするかについて、まだ何のヒントも提供していない。現時点では、Galaxy S23 FE は 2023 年 10 月初めに発表された同社の最新版のままです。

新しいレポートは、噂のSamsung Galaxy S25、Galaxy S25 Plus、Galaxy S25 Ultraのカメラアップグレードのひどい評価を提供します 新しいレポートは、噂のSamsung Galaxy S25、Galaxy S25 Plus、Galaxy S25 Ultraのカメラアップグレードのひどい評価を提供します Sep 12, 2024 pm 12:22 PM

ここ数日、Ice Universeは、サムスンの次期主力スマートフォンであると広く信じられているGalaxy S25 Ultraの詳細を着実に明らかにしている。とりわけ、リーカーはサムスンがカメラのアップグレードを1つだけ計画していると主張した

Xiaomi Redmi Note 14 Pro Plusは、Light Hunter 800カメラを搭載した初のQualcomm Snapdragon 7s Gen 3スマートフォンとして登場します Xiaomi Redmi Note 14 Pro Plusは、Light Hunter 800カメラを搭載した初のQualcomm Snapdragon 7s Gen 3スマートフォンとして登場します Sep 27, 2024 am 06:23 AM

Redmi Note 14 Pro Plusは、昨年のRedmi Note 13 Pro Plus(Amazonで現在375ドル)の直接の後継者として正式に発表されました。予想通り、Redmi Note 14 Pro Plusは、Redmi Note 14およびRedmi Note 14 Proと並んでRedmi Note 14シリーズをリードします。李

iQOO Z9 Turbo Plus: 強化されたシリーズフラッグシップの予約開始 iQOO Z9 Turbo Plus: 強化されたシリーズフラッグシップの予約開始 Sep 10, 2024 am 06:45 AM

OnePlus の姉妹ブランドである iQOO の製品サイクルは 2023 年から 4 年で、ほぼ終わりに近づいている可能性があります。それにもかかわらず、ブランドはまだZ9シリーズの開発を終えていないと宣言しました。その最終、そしておそらく最高エンドとなる Turbo+ バリアントが、予測どおりに発表されました。 T

See all articles