序言
我正在尝试反汇编和逆向工程一个作者早已不在的程序。该程序提供了一些我在其他地方还没有找到的独特功能......我对程序的逆向工程感到好奇和好奇。如果你只是想帮我找到另一个程序......别费心了。
问题
我正在使用带 Hex-Rays 反编译器的 IDA Pro 来获取一些半途而废的伪代码,以尝试加速逆向工程。我认为有助于加快速度的一件大事是弄清楚字符串的含义。到目前为止,这是我发现的超过 4 个字符的字符串:
dword_131894E = 54264588;
dword_131894A = 51381002;
dword_1318946 = 51380998;
dword_1318942 = 52429571;
dword_131893E = 52298503;
runtimeVersion[0] = 836;
szIndex = 0;
do
{
runtimeVersion[szIndex] = (runtimeVersion[szIndex] - 1) ^ (szIndex + 882) ^ 0x47;
++szIndex;
}
while ( szIndex < 11 );
通过查看三个字符的字符串的类似伪代码,并使用 Hex-Rays 悬停来获取类型信息,以下是我的理解方式:
- runtimeVersion 是一个 const wchar
- 这意味着它有 Unicode 字符 (UTF-16)
- 字符串嵌入到内存中,但在本例中是弱加密(XOR?)
除了常量“882”对于每个字符串不同之外,上面的伪代码对于所有大字符串都是相同的。我假设这是某种编译时加密或宏,可以一个一个地找到字符串并唯一地“加密”它们。但问题是,我似乎无法通过复制伪代码来获得外观正确的字符串。这是我在 C# 中的内容:
ushort[] newCharArray = new ushort[rawCharacters.Length];
// Go through and decode all of the characters.
ushort i = 0;
do {
newCharArray[i] = (ushort)((i + 882) ^ (rawCharacters[i] - 1) ^ 0x47);
++i;
}
while (i < 11);
'rawCharacters' 是一个 ushort 数组。我将每个 dword 条目分成两半,并将每个条目视为一个 ushort。我把它们放在数组中,从底部到顶部...所以分配给 runtimeVersion[0] 的值首先添加到我的数组,然后是 dword_131893E 的值,然后是 dword_1318942,等等。
我不确定我在这里遗漏了什么。这看起来非常简单,反转和恢复字符串应该是小菜一碟,但我对从伪代码到实际代码的转换感到困惑。
想法?
最佳答案
好的,在一张纸上完成这就是我得到的:
54264588 = 0x033c030c
51381002 = 0x0310030a
51380998 = 0x03100306
52429571 = 0x03200303
52298503 = 0x031E0307
836 = 0x0344
882 = 0x0372
v = 0x0076 = 0x47 ^ 0x0372 ^ (0x0344 - 1)
2 = 0x0032 = 0x47 ^ 0x0373 ^ (0x0307 - 1)
. = 0x002E = 0x47 ^ 0x0374 ^ (0x031E - 1)
0 = 0x0030 = 0x47 ^ 0x0375 ^ (0x0303 - 1)
. = 0x0076 = 0x47 ^ 0x0376 ^ (0x0320 - 1)
5 = 0x0035 = 0x47 ^ 0x0377 ^ (0x0306 - 1)
0 = 0x0030 = 0x47 ^ 0x0378 ^ (0x0310 - 1)
7 = 0x0037 = 0x47 ^ 0x0379 ^ (0x030a - 1)
2 = 0x0032 = 0x47 ^ 0x037a ^ (0x0310 - 1)
7 = 0x0037 = 0x47 ^ 0x037b ^ (0x030c - 1)
\0 = 0x0000 = 0x47 ^ 0x037c ^ (0x033c - 1)
因此字符串是“v2.0.50727”我还检查了另一个字节序选项,但这个看起来好多了。所以我知道这并没有指出您的代码哪里有问题,但它应该可以帮助您使用调试器/printf 解决它。
编辑:将最后 7 添加到字符串中。
关于c# - 无法解密这些字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11911032/