我正在重新编译一个 Java 程序,我有以下方法:
public static native String getMyString(String s);
getMyString
在 mylibrary.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 建议,有问题的字符串是27 68 5D 6D
或“'h]m”,但我有疑问。当我很久以前使用 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
会返回什么样的字符串?