Преамбула
Я пытаюсь дизассемблировать и реконструировать программу, автора которой давно нет. Программа предоставляет некоторые уникальные функции, которые мне еще предстоит найти где-либо еще, и... Мне любопытно и заинтриговано обратное проектирование программы. Если вы просто попытаетесь помочь мне найти другую программу... не беспокойтесь.
Эта проблема
Я использую IDA Pro с декомпилятором Hex-Rays, чтобы получить приличный псевдокод, чтобы попытаться ускорить обратное проектирование. Одна важная вещь, которая, я думаю, поможет ускорить работу, — это выяснить, что означают строки. Пока что это то, что я нахожу для строк, длина которых превышает 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 является константой wchar
- это означает, что он имеет символы Unicode (UTF-16)
- строка встроена в память, но в данном случае слабо зашифрована (XOR?)
Приведенный выше псевдокод одинаков для всех больших строк, за исключением того, что константа «882» отличается для каждой строки. Я предполагаю, что это какое-то шифрование во время компиляции или макрос, который находит строки одну за другой и «шифрует» их уникальным образом. Проблема, однако, в том, что я не могу получить правильно выглядящую строку, реплицируя псевдокод. Вот что у меня есть на С#:
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, затем dword_1318942 и т. д.
Я не уверен, что мне здесь не хватает. Кажется, что это настолько просто, что это должно быть тортом, чтобы отменить и восстановить строки, но я запутался в преобразовании из псевдокода в реальный код.
Мысли?
rawCharacters
неправильно. Можете ли вы включить источник, который показывает загрузку данных в ваш C# и вывод Hex-Rays объявленияRuntimeVersion
? - person Scott Chamberlain   schedule 11.08.2012dword_131894E
и другие подобные переменные связаны с проблемой? Инициализируется лиruntimeVersion
из них? - person Ankush   schedule 11.08.2012