一般的に、逆向分析は巨大なプログラムを完全に逆向するのではなく、特定の位置にある 1 つまたは複数の関数を分析することです。
1、プログラムの読み込み詳細#
メニューの VIEW-OPEN SUBVIEW-SEGMENTS を開くと、自動的に読み込まれたプログラムブロックが表示されます。
セクションの名称(NAME)
列の後ろには、区段起始(START)
と終点(END)
のアドレスがあります。
RWX の列は、初期状態でこのセクションが読み取りREAD(R)
、書き込みWRITE(W)
、および実行EXECUTION(X)
の権限を持っているかどうかを示します。
後ろのD
とL
の列はそれぞれDEBUGGER(デバッガ)
とLOADER(ローダ)
に対応しています。
最初の列 (D) は空で、プログラムがデバッグモードのときにのみ読み込まれたセクションが埋められ、L の列はローダーが作成したセクションを表示し、他の列の内容はそれほど重要ではありません。
2、重要な文字列の確認#
exe プログラムを開いてみます。
help-register のところに name と serial を入力できます。
適当に文字を入力すると、No luck there, mate! と表示されます。
文字列を確認するには、ショートカットキー shift + F12 を押します。
プログラムと同じメッセージが表示されます。
上の画像の文字をダブルクリックすると、次の位置にジャンプします。
0x00402169 のアドレスにこの文字列が保存されており、そのアドレスでDキー
を押すと具体的なバイトを確認できます。
再度 A キーを押すと文字列が表示され、X キーを押すと右側の参照がより良く表示されます。
3、重要な関数の検索#
上の画像には、2 つの異なる関数がこの文字列を参照しています。一つはsub_401362
、もう一つはsub_40137E
です。
異なる 2 つの関数である理由は、IDA が参照を functions + XXXX という形式で表示するためです。もし彼らが同じ関数に属しているなら、XXXX の値だけが変わり、前の部分は変わらないはずですが、sub_の後のアドレスは異なります。
sub_401362
sub_40137E
現在、登録不成功のメッセージが表示されるすべての位置を見つけました。
sub_401362関数に戻ると、ここで messagebox API 関数を呼び出して NO LUCK THERE MATE というメッセージを表示しています。この API 関数は NO LUCK 文字列をウィンドウのタイトルとして、NO LUCK THERE MATE 文字列を表示するテキストとして受け取ります。
sub_40137Eも同様で、2 つの場所で登録不成功のメッセージがトリガーされることを意味します。異なる情報を処理している可能性があります。登録成功のメッセージを表示するには、これら 2 つの場所を回避する必要があります。
次に X キーを押してsub_401362関数の参照を確認すると、以下のように 1 つの参照しかありません。
この参照に移る前に、sub_401362関数の名前を CARTEL_ERROR に変更します。関数のアドレスでNキー
を押して、新しい名前を入力します。
CARTEL_ERROR 関数を参照している場所に来ました。
CARTEL_ERROR 関数を呼び出す前に、もう 1 つの jz ジャンプがあります。成功 / 失敗のコードブロックを区別するために、これらのコードブロックに色を付けることができます。コードブロックの右上隅の色選択器をクリックします。
0x40124c で Enter キーを押して、呼び出される関数 0x40134d に入ります。
0x40134D 関数
0x40134D 関数の名前を CARTEL_BUENO に変更します。
それらを参照しているコードブロックを緑色にします。
4、命令位置のマーク#
0x401243 コードの jz 命令に進み、メニュー JUMP-MARK POSITION(ショートカットキー alt + m)を開き、DECISION_FINAL と名付けます。これでこの位置に簡単に戻れるようになります。
メニュー Jump-Jump to marked position を開きます。
これで対応する位置に簡単にジャンプできます。
5、命令の変更#
以前の分析に従い、0x401243 の JZ を JNZ に変更すると、不正なパスワードを入力したときに、プログラムは登録成功のパスを実行します。
注:keypatch
7.6 バージョンには keypatch プラグインがないため、インストールを試みましたが、うまくいかなかったので、ida 7.7 のグリーン版を使用しました。
現在の命令の位置で右クリックし、keypatch-patch
(ショートカットキー:ctrl + alt + k)を選択します。
以下のウィンドウが開きます。
変更内容は以下の通りです。
変更後、patch をクリックすると、以下の内容が返され、後の注釈が変更された内容を示します。
再度右クリックしてpatching-apply patch to...
を選択し、変更後の内容を保存します。
exe ファイルとして保存します。
crackme.exe プログラムを実行し、適当な内容を入力すると、成功メッセージと失敗メッセージの 2 つのウィンドウが表示されます。
以上のように、登録を回避するためには 2 箇所の内容を変更する必要があります。
上の画像に示されているように、ここには別の登録失敗メッセージが表示されており、赤いコードブロックの上に cmp 命令があり、ユーザーが入力したユーザー名の文字が 0x41 より小さいかどうかを比較しています。つまり、文字 A より小さい場合、登録失敗を示します。
以前、crackme.exe を実行して登録したとき、入力したのは 111(0=30、1=31)で、明らかに 0x41 より小さいため、プログラムが数字を含むことを検出すると、登録失敗を表示します。ここでは jb を jnb に変更することはできません。そうでなければ、文字を入力すると再びエラーが表示されます。
上の画像の破線は、プログラムがここにジャンプするとエラーが表示されることを示しています。したがって、ジャンプ命令を nop に変更すると、プログラムはジャンプせず、次の命令を実行し、ここでのエラーを実行しません。
グラフィカル表示に戻ります。
変更後、全体のインターフェースが混乱しています。
上の画像では、変更された nop バイトが表示され、エラーメッセージも孤立しています。
変更後のファイルを再保存します。
テストが完了した後、任意の文字の入力がサポートされました。