これは、シリーズ "Reversing .Net Applications"の最初の記事です。この記事では、MSILを使用せず、パッカーとプロテクターを削除せず、難読化されたコードに遭遇しません。 これについては今後の記事で扱いますが、今のところはいくつかの基本的なツールに触れ、伝統に従って単純なひび割れを解決します。
.Netプラットフォームは、現在の状態では非常に脆弱です。
1. .Net用に作成されたプログラムは、ネイティブではなく、MSIL(MicroSoft Intermediate Language)と呼ばれる.Netプラットフォームのバイトコードでコンパイルされます。
ILコードは、起動の直前にコンパイルされます。 このテクノロジは、ジャストインタイムコンパイル(JIT、オンザフライコンパイル)と呼ばれます。
2.すべてのプログラムにはメタデータが含まれています。
「メタデータは、他のデータを記述するメタデータです。 コンテキストでは、メソッドのタイプや実装など、.exeファイルのプログラム要素のセットです。
プログラムのソースコードを簡単に取得できるのは、メタデータ、または.Net環境の特別なプロパティのおかげです。
2.1 .Netのメタデータは必須であり、普遍的です。
「.Net環境の各プログラムには、MSIL言語のコードに加えて、全体(マニフェスト)とそれに含まれる各タイプの両方を記述するメタデータが必ず含まれています。」
2.2 .Netのメタデータは公開されています。
「すべてのソフトウェアコンポーネントとプログラミングツールがメタデータにアクセスできます。」
2.3 .Netのメタデータは網羅的です。
「メタデータには、各タイプに関する詳細な情報が含まれています。名前、タイプ、フィールドの名前、すべてのパラメーターと戻り値を持つプロパティとメソッドの説明です。 クラスのすべてのメンバーのアクセシビリティ(可視性)とその属性に関する情報もここに保存されます。 メタデータには、エクスポートされたクラスのインターフェイス情報だけが保存されます。 保護されたフィールドの構造、保護されたメソッドの説明、その他のコンポーネントなどの実装の詳細もメタデータから抽出できます。
.Netのメタデータの構造の詳細については、
こちらをご覧ください 。その間、直接練習を開始します。 仕事には、次のものが必要です。
- .Netリフレクター
- Visual C#Express(または他の便利なIDE)
- Cライクな構文を使用した言語ライブラリの最低限の知識、または「コードの分析と編集のために」「どのように発生するか」の理解
現時点では、.Netリフレクターに加えて、アセンブリとアプリケーションのより一般的な.Netデコンパイラーがいくつかあります。
- DisSharp Decompiler(http://netdecompiler.com)-有料の入手可能な難読化ツールであり、開発者は、対応するものよりも数倍速く動作すると言います。 私はいくつかの実験プログラムを管理していましたが、個人的には好きではありませんでした。
- Salamander .Netデコンパイラ(http://www.remotesoft.com/salamander/)-かつてはリフレクターの競合だったかもしれませんが、今ではアーカイブに送信する予定です。変更ログは2008年の初めに中断されます。 有料。
- Spices.Net Decompiler(http://www.9rays.net/Downloads.aspx)は、リフレクターと競合できるリストにある唯一のものです。 優れた難読化解除機能、コードオプティマイザー、VSとの統合、およびその他の機能の存在下。 マイナス-有料。
- 何らかの理由でリフレクターを使用できない場合、いくつかの同様のプログラムを自由に使用できますが、それぞれの逆コンパイルの結果が異なる可能性があるという事実に備えてください。
「ReWrit's Crackme#9 .Net Noob Challenge」を苦しめます。 これは非常に単純なので、問題はありません。
crackmeからアーカイブをダウンロードします。 内部には、必要なファイルに加えて、readme.txtに「ブリーフィング」が含まれています。 .Net Reflectorを起動し、[ファイル]-> [開く]-> ReWritのCrackme#9 noob challenge.exeを開きます。その後、開いたファイルがプログラムフィールドに表示されます。
次の人民元->逆アセンブル、そして私たちはほとんどそこにいます。
開発者が述べているように、リフレクターは.netアプリケーションをさまざまな言語に等しく逆コンパイルできます。 これを確認するには、任意の方法を選択し、ドロップダウンリストでC#をたとえばDelphiに変更します。 Reflectorは、C#とVB.Netの間でコードを効率的に変換するためにも使用できます。
crackmeに戻りますが、目標を達成するための手順は1つだけです。 ReWrits cm9 Noob Challenge-> ExportでRMB
プロジェクトはエラーなしでエクスポートされましたが、常にそうであるとは限りません。場合によっては、リフレクターに不足しているファイルまたはライブラリが必要になることがあります。 この場合、それらへのパスを手動で指定する必要があります。 IDEを起動します。私の場合はVisual C#Express 2010で、リフレクターからエクスポートされたプロジェクトを開きます。スタジオはプロジェクトを現在の環境に変換することを提案します。 すぐにF5キーを押すと、プログラムが機能します。 「戦闘」状態では、これは常に発生するわけではありません。リフレクターが誤ってエクスポートされるか、プロジェクトが曲がってスタジオに変換されるか、コンポーネントが完全にシステムにありません。 しかし、ソースコードの大部分を取得できれば、これはすべて重要ではありません。
したがって、これで記事の主要部分は終了します。 .Netプラットフォームが非常に脆弱である理由を学び、.Net用に作成されたプログラムのソースコードを取得する多くの方法の1つに精通し、非常に強力な.Net Reflectorユーティリティを使用するスキルも習得しました。 次はオプションの部分です。3つのレベルのcrackmeの解決策があり、残りの2つは自分で解決する必要があります。
これで、スタジオから起動されたクレマを閉じて、プログラムコードに戻ることができます。 Form1.csをダブルクリックすると、予期せずエラーが表示されます。
怖くないので、[コードに移動]をクリックします。 私たちはボタンクリックハンドラーに焦点を合わせており、最も興味深いのはボタンクリックハンドラーです。 ボタンをボタン、テキストボックスをTB、メッセージボックスをそのまま残します。 元のcrackmeを起動します。そこで、取得したソリューションを確認し、それを折りたたんでプログラムコードに戻ります。 最初のボタンクリックハンドラは次のようになります。
private void button1_Click(object sender, EventArgs e)
{
string str = "486752416871754464";
string str2 = "";
while (str.Length > 0)
{
str2 = str2 + Convert.ToChar(Convert.ToUInt32(str.Substring(0, 2), 0x10)).ToString();
str = str.Substring(2, str.Length - 2);
}
if (this.textBox1.Text == str2)
{
this.Nag_Timer1.Start();
this.textBox2.ReadOnly = false;
}
else
{
MessageBox.Show("Wrong Password!", "Error");
}
}
ここでは、変換およびいくつかの操作の後に入力した行が、元々指定された行と比較されますが、これも変換の影響を受けます。 それらが等しい場合、nagaタイマーが開始され、次のTBから読み取り専用属性が削除されます。他のすべての場合、メッセージボックスが表示され、間違ったパスワードに関する通知が表示されます。 MessageBox.Show( "Wrong Password!"、 "Error");を置き換えます。 on MessageBox.Show(str2、“エラー”); F5を押して、最初のTBに何かを入力し、[OK]をクリックして、正しいパスワードのメッセージボックスを取得します。 変更したプログラムのTBに入力し、[OK]をクリックすると、2番目のTBが使用可能になります。 しかし、今のところ、折りたたまれた元のcrackmeにパスワードを入力することは急いではありません。 一方、変更されたプログラムでは、タイマーが起動し、ナグが発生します。
Nag-一定時間(または起動時)後にポップアップして、プログラムの登録を呼び出す迷惑なウィンドウ。 主に試用プログラムと「ズボン」で発生します。
すでにいくつかのナガを飛び出しました。それらを削除する時が来ました。 プログラムを閉じずに、2番目のボタンのハンドラーを調べ、入力したテキストと「0x7fffffff」を含む変数との直接比較を確認します。 変数の数値は16進形式で示されますが、この数値の10進表記が必要です。 標準の計算機を使用できます。 最初に、「プログラマー」モードに切り替えて(Win7ではそれと呼ばれます)、「Hex」を押し、「0x7fffffff」を入力し、「Dec」を突く。 2147483647は、nagを無効にし、3番目のTBへのアクセスを許可するパスワードです。 3番目のタスクは、自分で解決することをお勧めします。
3番目のタスクが既に完了していることを願っていますので、続行できます。 readmeには、第4レベルでファイルにパッチを適用する必要があると書かれています。 4番目のボタンハンドラーを見て、2回考えずに「if(this.textBox6.Text == str2)」をif(this.textBox6.Text ==「crack」)に変更すると、4番目のレベルのパスワードはクラックです。 5番目は、自分で決める必要があります。
この記事は終わりました。ご清聴ありがとうございました。