2

Javaプログラムを再コンパイルしていますが、次の方法があります。

public static native String getMyString(String s);

getMyStringmylibrary.so内に実装されており、次のようになります。

; Scrambler::getMyString(char  const*)
EXPORT _ZN9Scrambler18getMyStringEPKc
_ZN9Scrambler18getMyStringEPKc
LDR             R1, =(mystring - 0x14FC8)
PUSH            {R4-R6,LR}
ADD             R1, PC  ; "mystring"
MOV             R4, R0
BLX             strcasecmp
CMP             R0, #0
BNE.W           loc_150FC

で終わるより

LDR             R5, =(unk_6AE24 - 0x14FD8)
ADD             R5, PC

ここR5では戻り値のようです。

unk_6AE24外観は次のようになります。

                                              27
68 5D 6D 06 3F 10 6D 26  32 10 56 12 06 3F 32 5D
12 27 26 4B 0D 5D 27 4B  6E 0D 2B 06 32 5D 68 24
3F 32 06 24 70 56 00 63  69 4C 1D 06 5A 7F 0C 34
1E 67 3B 63 32 5F 16 1D  34 5F 1E 32 42 69 18 49
3F 51 49 0C 1F 0C 0E 77  2F 44 69 7F 5A 0C 0B 34
0C 34 1C 24 32 5F 7F 00  00 00 00 1D 30 3B 5F 30

IDAは、問題の文字列は「'h] m」であると示唆していますが27 68 5D 6D、私には疑問があります。私が何年も前にc++を使用していたとき、文字列は0で終わっていました。これは、の戻り値になり27 68 5D 6D 06 3F 10 6D 26 32 10 56 12 06 3F 32 5D 12 27 26 4B 0D 5D 27 4B 6E 0D 2B 06 32 5D 68 24 3F 32 06 24 70 56ます。または、独自の形式を持つJava文字列について話している可能性があります。

どのような文字列がgetMyString返されますか?

4

1 に答える 1

1

getMyStringはどのような文字列を返しますか?

それはを返しjava.lang.Stringます、あなたは宣言からそれを得ることができます。

実際の文字データは、(おそらく)それから1つのリダイレクトになります。(aはおそらく配列とサイズStringへのポインタです)。charJavaでは、acharは16ビットであることに注意してください。

とにかく、あなたは何をしようとしていますか?戻り値の直後にブレークポイントを設定getMyStringし、デバッガーで戻り値を確認する方がはるかに簡単です。

于 2012-08-02T16:40:38.100 に答える