【问题标题】:How to detect Java string inside a .so file?如何检测 .so 文件中的 Java 字符串?
【发布时间】: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


【解决方案1】:

getMyString 会返回什么样的字符串?

它会返回一个java.lang.String,你可以从声明中得到它。

实际的字符数据将(可能)是一个重定向远离那个。 (String 可能是指向char 数组和大小的指针)。请记住,在 Java 中,char 是 16 位。

你到底想做什么?在getMyString 返回后立即设置断点并在调试器中查看返回值要容易得多。

【讨论】:

  • 那么我应该期待什么样的字符串格式?我的意思是,逐字节。我无法运行该软件。
  • 另一方面,我想,我可以。谢谢!
猜你喜欢
  • 2010-12-13
  • 2021-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 2012-04-13
  • 1970-01-01
相关资源
最近更新 更多