【发布时间】:2012-07-31 16:22:41
【问题描述】:
我正在重新编译一个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 会返回什么样的字符串?
【问题讨论】:
-
库的制作者已经竭尽全力让逆向工程变得困难。这是你真的应该做的事情吗?也就是说,它甚至合法吗?
-
这个库的制作者要求我检查它的安全性。我认为它根本不安全,但我想通过向他展示字符串来说明这一点
-
公平点。您可以使用文件上的
strings mylib.so | sort -u快速提取所有字符串。字符串应为 UTF-8 格式,开头为两个字节长度。
标签: java reverse-engineering nasm disassembly