无法解密这些字符串

时间:2012-08-11 01:06:00

标签: c# c++ reverse-engineering ida

序言

我正在尝试对作者早已不复存在的程序进行反汇编和反向工程。该程序提供了一些我在其他地方尚未找到的独特功能......我对程序的逆向工程感到好奇和好奇。如果你要尝试帮助我找到另一个程序......不要打扰。

问题

我正在使用带有Hex-Rays Decompiler的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等。

我不确定我在这里缺少什么。这看起来很简单,它应该是反转并恢复字符串的蛋糕,但我对从伪代码到实际代码的转换感到困惑。

思想?

1 个答案:

答案 0 :(得分:6)

好好在一张纸上完成这是我得到的:

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”我还检查了另一个endian选项,但这个看起来好多了。所以我知道这并没有指出你的代码错在哪里,但它应该可以帮助你用调试器/ printf解决它。

编辑:将最后7个添加到字符串。