9

前文

私は、作者がずっといなくなったプログラムを逆アセンブルしてリバースエンジニアリングしようとしています。このプログラムは、私が他の場所ではまだ見つけていないいくつかのユニークな機能を提供します...私はプログラムをリバースエンジニアリングすることに興味があり、興味をそそられます。別のプログラムを探すのを手伝ってくれるだけなら...気にしないでください。

問題

IDA Pro w / Hex-Rays Decompilerを使用して、リバースエンジニアリングを高速化するために、中途半端な疑似コードを取得しています。私が物事をスピードアップするのに役立つと思う1つの大きなことは、文字列が何を意味するかを理解することです。これまでのところ、これは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 );

3文字の文字列の同様の擬似コードを調べ、型情報にHex-Raysホバーオーバーを使用することから、これを理解する方法は次のとおりです。

  • runtimeVersionはconstwcharです
  • これは、Unicode文字(UTF-16)を持っていることを意味します
  • 文字列はメモリに埋め込まれていますが、この場合、弱く暗号化されています(XOR?)

上記の擬似コードは、定数「882」が文字列ごとに異なることを除いて、すべての大きな文字列で同じです。これは、文字列を1つずつ検索し、それらを一意に「暗号化」する、ある種のコンパイル時の暗号化またはマクロであると想定しています。ただし、問題は、擬似コードを複製しても適切な文字列を取得できないように見えることです。これが私が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などに追加されます。

ここで何が欠けているのかわかりません。これは非常に単純なため、文字列を逆にして回復するのは簡単なようですが、擬似コードから実際のコードへの変換に困惑しています。

考え?

4

1 に答える 1

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」です。他のエンディアンオプションもチェックしましたが、これははるかに見栄えがします。だから私はこれがあなたのコードが間違っている場所を指摘していないことを知っていますが、それはあなたがデバッガー/printfでそれを解決するのに役立つはずです。

編集:文字列に最後の7を追加しました。

于 2012-08-11T09:21:05.547 に答える