2

私はAndroidデバイスで実験していて、アプリケーションコードをいじって、その間にそれを学ぶことができるようにしています. しかし、私はsmaliコードを編集する方法にかなりこだわっています. OOP 言語しか学んでいない人にとっては、それほど簡単なことではありません。

だから、これは私のsmaliコードです:

const-string v0, "get_value_one"
invoke-virtual {p0, v0}, Lorg/json/JSONObject;->getInt(Ljava/lang/String;)I
move-result v0
iput v0, v2, Lcom/breakapp/dd/mymod/Processor;->l:I

これは同等の Java コードです。

Processor MyProcessor = new Processor();
try { 
    MyProcessor.l = paramJSONObject.getInt("get_value_one");
    return MyProcessor;  
} catch (Exception e) { }    
return MyProcessor;

今のところ、私は物事を単純に保ち、Java の IE パラメータ 'MyProcessor.l' に定数を入れたいと思います:

MyProcessor.l = 10;

次のようないくつかの異なるアプローチを試しました。

iput v0, v2, Lcom/breakapp/dd/mymod/Processor;->l:10

しかし、コンパイルエラーが発生していたので、明らかに間違っていました。その上、私は自分が何をなぜしているのかを本当に理解していませんでした。ここで論理的な手順を説明してくれる人はいますか? どうもありがとう。

4

2 に答える 2

3

私はAndroid Reversingも初めてで、Smaliコードの簡単な理解を探すのに時間を費やし、これを見つけました:

クラス構造は L です。

Lcom/breakapp/dd/mymod/Processor;->l:I

元の Java ファイル名

.source "example.java"

これらはクラスのインスタンス変数です

.field private someString:Ljava/lang/String;

これにより、文字列値が v0 に割り当てられます

const-string v0, "get_value_one"


それらへの参照は値自体のプリミティブチートシートに置き換えられるため、最終値は実際には直接使用されません。

V - void、B - バイト、S - short、C - char、I - int

J - long (2 つのレジスタを使用)、F - float、D - double

.field public final someInt:I  # the :I means integer
.field public final someBool:Z # the :Z means boolean

出典:Androidクラッキング

于 2016-11-06T04:14:12.100 に答える
1

smali に関するドキュメントよりも詳細であるため、dalvik バイトコード ドキュメントを読むことをお勧めします。とにかく、私もスマリ語を学んでいる途中なので、おそらく最良の答えを出すことはできませんが、これが役立つかもしれません. iput が何をするかを見てみましょう:

iput vx,vy, field_id vx をインスタンス フィールドに入れます。インスタンスは vy によって参照されます。

ソース: http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html dalvik オペコードから

ここでも同じことが起こります。v0レジスタでv2レジスタに影響を与えています。あなたが行った変更は見当違いだったと言われています。「I」を「10」に変更しましたが、それは値ではありません。この場合、I は整数を意味します。さらに、これはコードを変更したい場所でもありません。どれどれ:

const-string v0, "get_value_one"

reg v0 は現在、文字列「get_value_one」の値を持っています (値は文字列であるため、それを説明するのに最適な言葉ではないかもしれませんが、私の主張は理解できると思います)

invoke-virtual {p0, v0}, Lorg/json/JSONObject;->getInt(Ljava/lang/String;)I
move-result v0

これで、パラメーターを介して受け取った JSONObject でメソッド getInt(String) を呼び出しました。{p0, v0} は、p* 規則に従うため、パラメーターであることがわかっている p0 によって参照されるオブジェクトのメソッドに v0 を渡すことを意味するため、これがわかります。(ここでそれについて読むことができます: https://code.google.com/p/smali/wiki/Registers )。

ここまでで、変数 'l' に cont 値を代入したい場合、このメソッドを呼び出しても役に立たないことを理解し始めているはずです。

iput v0, v2, Lcom/breakapp/dd/mymod/Processor;->l:I

この最後の命令は、v2 レジスターを取得し、v0 の値をそこに入れます。この行が実行される前の v0 には、JSONObject getInt(String) メソッドから出力される値があり、v2 はオブジェクト MyProcessor を参照し、「Lcom/breakapp/dd/mymod/Processor;->l」は変数「l」を参照します。 ' 上記の obj に含まれています。' :I ' は変数の型を教えてくれます。Java は厳密に型指定されているため、ご存知のとおり、変数には常に関連付けられた型があります。もちろん、これはバイトコードで参照する必要があり、これがその方法です。

これにより、必要な変更を行うための情報が得られたことを願っていますが、表示されたコードを次のように変更することを提案することで、もう少し支援を試みます。

const/4 v0, 0xA
iput v0, v2, Lcom/breakapp/dd/mymod/Processor;->l:I

最初の行は、定数 (0xA hex = 10 進数) を v0 に代入し、前に参照したように渡します。

スマリ語の学習で頑張ってください。少なくとも少しは役に立てば幸いです

于 2014-11-20T12:35:05.363 に答える