【システムセキュリティ】3.IDAPro分解ツールとリバースエンジニアリング復号化実戦

私が以前に書いた同様の記事を見たことがあるかもしれませんが、なぜそれを繰り返さなければならないのですか?初心者がウイルスの逆分析とシステムセキュリティをよりよく理解し、前のシリーズを破壊することなくより体系的になりたいと思っています。そのため、このコラムを再開して、システムセキュリティ、逆分析、悪意のあるコードの検出に関する体系的かつ詳細な調査を準備しました。「システムセキュリティ」シリーズの記事は、より焦点を絞った、より体系的で、より詳細なものになります。これは、著者の成長の遅い歴史でもあります。専攻を変えるのは本当に難しいです。逆分析も難しい部分ですが、今後4年間でどれだけ学べるかも考えています。長い道のりが長く、湖山に行く傾向があります。プロセスを楽しんで、一緒に来てください〜

システムセキュリティシリーズの作者は、悪意のあるサンプル分析、逆分析、攻撃的および防御的な戦闘、Windowsの脆弱性の悪用などについて詳細な調査を行い、ブロガーからオンラインノートや実際の操作を通じて学び、進歩を遂げることを望んでいます。前回の記事の著者は、逆分析の基本的な知識を広め、逆分析を学ぶ方法をみんなに教え、LüBuchuanゲームの逆のケースを与えました。この記事では、IDA Pro分解ツールの基本的な使用法について詳しく説明し、EXEリバースエンジニアリング復号化の実際的な方法について簡単に説明します。気に入っていただければ幸いです。

それ以上の苦労なしに、新しい旅を始めましょう!あなたのいいね、コメント、お気に入りは私にとって最大のサポートになります。私は安全な道をずっと進んでいることに感謝しています。悪い書き込みがあれば、私に連絡して修正することができます。基本的な記事、お役に立てば幸いです。作者の目的は、安全担当者と一緒に進歩することです。さあ〜

著者のgithubリソース:

前文分析:


声明:私は犯罪を犯すための教育方法の使用に固く反対します。すべての犯罪行為は厳しく罰せられます。私たちは一緒にグリーンネットワークを維持する必要があります。それらの背後にある原則を理解し、それらをよりよく保護することをお勧めします。(以下の参照を参照してください)


1. IDAProツールの紹介と最初の知り合い

1. IDAProの紹介

IDA Pro(Interactive Disassembler Professional)は、「IDA」と略されます。これは、Hex-Raysによって作成されたインタラクティブな逆アセンブラーツールです。現在、最高の静的逆コンパイルソフトウェアです。これは、0dayワールドの多くのメンバーおよびShellCodeセキュリティアナリストにとって必須です。行方不明の武器。IDA Proは強力な機能を備えていますが、操作がより複雑で多くの知識が必要です。同時に、インタラクティブ、プログラム可能、拡張可能、マルチプロセッサの特性を備えています。Windows、Linux、MacOSプラットフォームを介してプログラムを分析でき、認識されています。これは、最高のリバースエンジニアリングツールの1つです。

IDA Proは敵対的なコードを分析するための標準になり、攻撃研究の分野ですぐに重要なツールになりました。Intel x86、x64、MIPS、PowerPC、ARM、Z80、68000、c8051などを含む数十のCPU命令セットをサポートします。

ここに写真の説明を挿入


2. IDAProの新しいプロジェクト

IDA Proは、[次へ]をクリックすることで確実にインストールできます。インストールが正常に完了すると、32ビットプログラムと64ビットプログラムの分析に対応する2つの実行中のプログラム「IDAPro(32ビット)」と「IDAPro(64ビット)」が表示されます。IDAは、一般的なPE形式、DOS、UNIX、Mac、Java、.NET、およびその他のプラットフォームファイル形式をサポートしています。

以下に、IDAProを初めて開くプロセスについて説明します。

ステップ1:IDAPro32ソフトウェアを開く

次の図に示すように、exeファイルをダブルクリックして[サポートメッセージ]インターフェイスをポップアップし、[OK]ボタンをクリックします。

ここに写真の説明を挿入

ステップ2:新しいファイルを作成する

IDAには、ファイルをロードする3つの方法があります。「新規」は、標準ファイルを開くための新しいダイアログボックスを作成する方法、「GO」は、空白のジョブを実行して開く方法、ユーザーは分析するファイルをドラッグして分析する方法、「前へ」は最新の使用法を選択する方法です。ファイル。

ここに写真の説明を挿入

ステップ3:ロードするexeファイルを選択します。これが分析するプログラムになります

著者はC言語でコードを記述し、ローカルで「test01.exe」ファイルを生成しました。これは次に分析する実行可能ファイルです。

#include<stdio.h>
int main()
{
    
    
	printf("Hello World!!!\n");
	return 0;
} 

インポートするファイルを選択します。

ここに写真の説明を挿入

ステップ4:PEファイルのロード
[新しいファイルのロード]ウィンドウで、テキスト(コードブロック)、データ(データブロック)、rsrc(リソースブロック)、idata(入力テーブル)、およびedata(出力テーブル)を含むPEファイルロードする場合に選択します。)など、バイナリファイルもロードできます。

ここに写真の説明を挿入

IDAの分解には、2つの段階があります。まず、プログラムのコードとデータを分離し、関数を個別にマークし、パラメーター呼び出し、ジャンプ、命令の関係などを分析します。次に、IDAがファイルのコンパイルタイプを認識できる場合は、対応するコンパイラー機能ファイルをロードします。 、各関数に名前を割り当てます。同時に、IDAはデータベースを作成し、そのコンポーネントは「.id0」、「。id1」、「。nam」、および「.til」ファイルに保存されます。

次に、確認ウィンドウがポップアップし、[このメッセージを再度表示しない]オプションを選択できます。

ここに写真の説明を挿入

手順5:[Hex-Rays製品の更新を確認する
]で[OK]をクリックします。ポップアップするHex-Raysメッセージボックスの後に[OK]をクリックすると、更新オプションを設定するように求められます。ここで[OK]をクリックすると、デフォルトは[OK]になります。

ここに写真の説明を挿入

ステップ6:実行結果を表示する
この時点で、実行結果を次の図に示します。これで、逆解析を開始できます。

ここに写真の説明を挿入

IDAビューは次のように表示されます。

ここに写真の説明を挿入

六角形ビューの16進表示は、次の図のようになります。

ここに写真の説明を挿入

以下のコードで「helloworld !!! \ n」を確認できます。

ここに写真の説明を挿入

手順7:ソースコード
を表示するF5キーを押して、対応するソースコードを表示します。

ここに写真の説明を挿入

手順8:IDA Proを閉じて、データベースファイルを保存します
。IDBデータベースファイルをローカルに保存します。分解分析、セクションスキャン、ユーザー定義の構造、ユーザー定義など、IDAProを使用したプログラム分析の作業ステータスを記録します。名前、コメント、その他の情報。右上隅の閉じるボタンをクリックして、IDA Proの[データベースの保存]ウィンドウ([データベースの保存])をポップアップし、デフォルトオプションを使用して、[OK]を直接クリックして、生成されたデータベース(.idb)ファイルを保存します。

ここに写真の説明を挿入

次回ロードするときに、データベースファイルを直接ロードして、前の分析のステータスを取得できます。

ここに写真の説明を挿入


2. IDAProツールの基本的な使用法

IDAProによって開かれたメインインターフェイスを次の図に示します。

ここに写真の説明を挿入

IDAビューウィンドウ

次の図に示すように、ウィンドウが表示されます。

ここに写真の説明を挿入

「ビュー」の「サブビューを開く」→「分解」をクリックすると呼び出されます。

ここに写真の説明を挿入

IDAビューには2つのブラウジングモードがあり、1つはテキストビュー、もう1つはグラフビューです。右クリックすると相互にジャンプできます。

ここに写真の説明を挿入

ここに写真の説明を挿入

次の図に示すように、別のモードに切り替えます。

IDAビューには、主に次の3つの領域が含まれます。

  • アドレス領域: PEファイルがメモリにロードされた後の仮想アドレスが優先され、ミラーアドレス+オフセットアドレス(0x00401000など)
  • OpCode操作領域:この部分はデフォルトです。したがって、表示するには、[オプション]-> [一般]-> [opcodeバイト数を8に設定]が必要です。これは16進数です。
  • 逆コンパイルされたコード領域: IDAメイン関数領域。強調表示できます。関数名または変数名をダブルクリックして、対応するアドレスにジャンプします。

ここに写真の説明を挿入

ここに写真の説明を挿入


六角表示ウィンドウ

16進法を表示します。デフォルトは読み取り専用状態です。ショートカットキーF2を使用して、データ領域(緑色の文字領域)を読み取り専用状態と編集状態の間で切り替えることができます。

ここに写真の説明を挿入

文字列ウィンドウ

次の図に示すように、IDAのビューには、コードの配置に重要ないくつかのボタンがあります。

ここに写真の説明を挿入

  • エクスポートウィンドウを開くエクスポートウィンドウを開く
  • インポートウィンドウを開くインポートウィンドウを開く
  • 名前ウィンドウを開く関数とパラメーターの名前付きリスト
  • 関数ウィンドウを開くプログラムによって呼び出されるすべての関数ウィンドウ
  • 文字列ウィンドウを開く文字列表示ウィンドウを開く

ここで、作成者は[文字列]をクリックして、プログラム内のすべての文字列を表示します。このウィンドウは、下の図の文字列や対応するアドレスなど、プログラムの実行中の出力から対応するコードスニペットを見つけるのに役立ちます。

ここに写真の説明を挿入

[文字列]をダブルクリックして[IADビュー]ページ(下図に示すアドレス)にジャンプし、クリックして強調表示します。

ここに写真の説明を挿入

その他のウィンドウ:

  • エクスポート/インポートウィンドウ:エクスポートウィンドウにはファイルのエントリポイントが一覧表示され、インポートウィンドウには分析されたバイナリファイルからインポートされたすべての関数が一覧表示されます。
  • 関数ウィンドウ:関数名、領域、開始位置、長さ、関数を説明するマーク
  • 構造ウィンドウ:データ構造を分析し、データ構造名をダブルクリックして展開し、詳細なレイアウトを表示します
  • 列挙ウィンドウ:列挙型を定義して、列挙を列挙できます
  • セグメンテーションウィンドウセグメンテーション:セグメントの単純なリスト

ファイルタイプ

IDAは、4つのファイルで構成されるIDBファイルと呼ばれるデータベースを作成します。

  • id0:バイナリツリー形式のデータベース
  • id1:プログラムバイトの識別
  • nam:名前付きウィンドウのインデックス情報
  • til:特定のデータベースのローカルタイプ定義に関する情報

ここに写真の説明を挿入


3. IDAProリバースエンジニアリングの実際の戦闘

1.コードの暗号化

音楽ファイルを説明する最初のブログの前で、通常はXOR暗号化に続いて、C言語の作成者が次のように暗号化されたコードの簡単な部分を記述します。

#include<stdio.h>
#include<string.h>

int main()
{
    
    
	int i;
	int len;
	char key[20];
	char res[20];
	char *num = "eastmount";     //密钥 
	char *right = "123456789";   //正确值 
	
	//请输入正确的密码
	printf("please input the key:");
	scanf("%s", &key);
	
	//判断
	len = strlen(key);
	if(len<6 || len>10) {
    
    
		printf("Error, The length of the key is 6~10\n");
	} 
	else {
    
    
		//加密
		for(i=0; i<len; i++) {
    
    
			res[i] = (key[i]^num[i]); //异或加密 
		}	 
		//printf("%s\n", res);
		if(strcmp(res, right)==0) {
    
    
			printf("You are right, Success.\n");
		} else {
    
    
			printf("Error, please input the right key.\n");
		}
	}
	
	return 0;
}

入力長が6〜10でない場合、「エラー、キーの長さは6〜10です」というエラーがフィードバックされ、「エラー、正しいキーを入力してください。」というエラーが表示されます。正しいキーを押すと、「あなたは正しいです。成功。"。

ここに写真の説明を挿入

ここに写真の説明を挿入

次に、IDA Proを使用してEXEファイルを復号化し、キー値を取得しようとします。


2.逆復号化

手順1:最初の部分の手順に従って、ファイルをIDAProにインポートします。
表示される呼び出しプログラムを次の図に示します。
ここに写真の説明を挿入

ここに写真の説明を挿入

ツリー図は条件付きブランチを明確に示しており、左下隅にIDAビューのサムネイルがあります。それをクリックすると、ビューの指定された位置をすばやく見つけることができます。各パーツには、定義された2つの変数やオフセット位置など、詳細なコード情報があります。

ここに写真の説明を挿入

ステップ2:文字列表示ウィンドウを表示します
。次の図に示すように、IDA Proツールのメニューバーの[表示]には、コードを見つけるために重要ないくつかのボタンがあります

  • エクスポートウィンドウを開くエクスポートウィンドウを開く
  • インポートウィンドウを開くインポートウィンドウを開く
  • 名前ウィンドウを開く関数とパラメーターの名前付きリスト
  • 関数ウィンドウを開くプログラムによって呼び出されるすべての関数ウィンドウ
  • 文字列ウィンドウを開く文字列表示ウィンドウを開く

ここに写真の説明を挿入

ここで、作成者は[文字列]をクリックして、プログラム内のすべての文字列を表示します。このウィンドウは、下の図の文字列や対応するアドレスなど、プログラムの実行中の出力から対応するコードスニペットを見つけるのに役立ちます。

ここに写真の説明を挿入

[文字列]をダブルクリックして下の図に示すアドレスにジャンプし、クリックして強調表示します。

ここに写真の説明を挿入

手順3:ソースコード
を表示する以下に示すように、インターフェイスでF5キーを押して、ソースコードを表示します。

ここに写真の説明を挿入

表示されているソースコードは次のとおりです。

int __cdecl main(int argc, const char **argv, const char **envp)
{
    
    
  char Str1[32]; // [esp+38h] [ebp-50h]
  char Str[40]; // [esp+58h] [ebp-30h]
  int v6; // [esp+80h] [ebp-8h]
  int i; // [esp+84h] [ebp-4h]

  __main();
  printf("please input the key:");
  scanf("%s", Str);
  v6 = strlen(Str);
  if ( v6 > 5 && v6 <= 10 )
  {
    
    
    for ( i = 0; i < v6; ++i )
      Str1[i] = gcc2_compiled_[i] ^ Str[i];
    if ( !strcmp(Str1, "123456789") )
      printf("You are right, Success.\n");
    else
      printf("Error, please input the right key.\n");
  }
  else
  {
    
    
    printf("Error, The length of the key is 6~10\n");
  }
  return 0;
}

コードのこの部分は、以前に記述されたC言語コードとわずかに異なることに注意してください。たとえば、前の判断の長さif(len <6 || len> 10)がエラーを促し、(v6> 5 && v6 <= 10)が正しく実行された場合、Elseはエラーを示します。

ここに写真の説明を挿入

このコードの基本的なロジックは、文字列Strを入力し、gcc2_compiled_変数を使用して周期的にXOR暗号化し、Str1変数として出力することです。暗号化されたStr1変数の値が「123456789」の場合、復号化は成功します。それ以外の場合は失敗します。
では、gcc2_compiled_変数の値は何ですか?

ステップ4:コアコードを
見つける次に、gcc2_compiled_変数を選択します。強調表示されたら、ダブルクリックすると、対応するページにジャンプします。

ここに写真の説明を挿入

そのキーは「eastmount」であり、暗号化の結果は「123456789」であることがわかります。

ここに写真の説明を挿入

手順5:逆復号化
最後に、逆復号化を実現するための復号化コードを記述します。「eastmount」XORのコードStrを入力すると、値が123456789になり、正常に表示されます。

#include<stdio.h>
#include<string.h>

int main()
{
    
    
	int i;
	int len;
	char res[9];
	char *num = "eastmount";     //密钥 
	char *right = "123456789";   //正确值 
	
	
	//判断 TS@@XYBVM
	len = strlen(num);
	for(i=0; i<len; i++) {
    
    
		res[i] = (right[i]^num[i]); //异或加密
	}
	res[i] = 0;
	printf("The right key is: %s\n", res);
	return 0;
}

復号化の結果を次の図に示します。

ここに写真の説明を挿入

IDAProによってローカルに作成されたファイルが次の図に示されていることに注意してください。

ここに写真の説明を挿入


4.まとめ

この時点で、この基本的な記事は終了です。アセンブリ、ネットワーク、オペレーティングシステム、暗号化と復号化、C / C ++、Pythonなど、幅広い範囲をカバーするセキュリティについて学ぶための知識は本当にたくさんあります。私はゆっくりと進歩し、研究と実践に等しく注意を払うことができることを願っています。また、読者がこの一連の要約ノートを気に入ってくれることを願っています。気に入らない場合は、スプレーしないで、一緒に歩いてください〜

3年前、Dunhuangで日の出前に「Zhangna」を書いていましたが、今日はプレゼントとしてラブレターを書きました。3枚の薄い紙では数え切れないほどの愛を表現することはできません。ウーハンは美しく、ウーハン大学はもっと美しいですが、この旅行の目的は知識と再充電を求めることであることを私は知っています。私の家族には若い女の子がいて、私は早期の学習と再会に属しています。今日のIDAプロの学習体験を記録するために深夜にブログを書きました。一緒に応援しましょう。

今日は10万人のCSDNファンを突破しました。何年にもわたってあなたの会社とサポートに心から感謝します。あなたのことを知って感謝しています。今後も、より質の高い記事を共有し、より多くの人々が問題を解決し始め、楽しませ、励ましてくれることを願っています。 !

ここに写真の説明を挿入

2020年8月18日に新しくオープンした「NazhangAISecurity Home」は、主にPythonビッグデータ分析、サイバースペースセキュリティ、人工知能、Web侵入、攻撃および防御技術に焦点を当て、論文のアルゴリズム実装を共有しています。Nazhang’s Houseはより体系的になり、すべての著者の記事を再構築し、Pythonとセキュリティをゼロから説明し、10年近く記事を書いてきました。私が学んだことと感じたことを共有したいと思います。また、アドバイスをお願いし、心から招待します。あなたの注意!ありがとうございました。

ここに写真の説明を挿入

(作成者:Eastmount 2020-12-17 Wuhan https://blog.csdn.net/Eastmounで木曜日の午後10時に作成


おすすめ

転載: blog.csdn.net/Eastmount/article/details/108881705