Невозможно расшифровать эти строки

Преамбула

Я пытаюсь дизассемблировать и реконструировать -программу, автора которой давно нет. Программа предоставляет некоторые уникальные функции, которые мне еще предстоит найти где-либо еще, и... Мне любопытно и заинтриговано обратное -проектирование программы. Если вы просто попытаетесь помочь мне найти другую программу... не беспокойтесь.

Проблема

Я использую IDA Pro с Hex -Rays Decompiler, чтобы получить наполовину -достойный псевдокод, чтобы попытаться ускорить обратную -разработку. Одна важная вещь, которая, я думаю, поможет ускорить работу, — это выяснить, что означают строки. До сих пор это то, что я нахожу для строк, которые длиннее 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 Hover для информации о типе, вот как я это понимаю:

  • runtimeVersion является константой 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. Я помещаю их в массив, начиная снизу вверх... Таким образом, значение, присвоенное runtimeVersion[0], сначала добавляется в мой массив, а затем значение из dword _131893E,затем двойное слово _1318942 и т. д.

Я не уверен, что мне здесь не хватает. Кажется, что это настолько просто, что это должно быть тортом, чтобы отменить и восстановить строки, но я запутался в преобразовании из псевдокода в реальный код.

Мысли?

9
задан dda 11 August 2012 в 01:10
поделиться