難読化された.NETアセンブリのリバースエンジニアリング

エントリー



この記事では、例としてPokeIn COMETライブラリを使用して、難読化された.NETアセンブリを分析および変更した経験を、評判の高い居住コミュニティと共有したいと思います。



リバースエンジニアリング



数日前、私はASP.NETのCOMETソリューションに興味を持ち、いくつかの興味深いライブラリを見つけました。その中には以前は無料のPokeInがありました。 著者がオープンソースのカテゴリから有料に移行したため、明らかに人気がありました。 図書館のWebサイトには、いくつかの制限付きで無料版をダウンロードする機会がありますが、その中でおそらく最も重要なのは、10の同時接続の制限です。 彼と戦う。





逆コンパイル



.NETアセンブリのリバースエンジニアリングと分析のための最初のツールは、有名なReflectorです。 PokeIn Webサイトからライブラリの無料バージョンをダウンロードし、アーカイブで.NET Frameworkのアセンブリを探して、Reflectorを実行します。 ここで最初の失望を待っています。Reflectorはアセンブリを開くことを完全に拒否します。



リフレクターが失敗する



さて、Reflectorを閉じて、.NETアセンブリをMSILコード(Microsoft Intermediate Language)に逆コンパイルするためのWindows SDKのユーティリティであるildasm.exeを呼び出します。 これはもちろん低レベルのコードを提供し、それを使用するのはそれほど便利ではありませんが、実際にはそれほど複雑ではありません。

そのため、ildasmを起動し、アセンブリを開きます...そして再び「保護されたモジュール-分解できません」というファイルを開きます。



ILDasmの失敗



これは、アセンブリがSupressIldasmAttribute属性でコンパイルされることを意味します。 このアセンブリを逆コンパイルするには、この属性を取り除く必要があります。 このためにPE CFF Explorerファイルの編集に無料のユーティリティを使用しました。 アセンブリの.NETメタデータを完全にサポートしています。 ファイルを開き、メタデータを探します:「.NET Directory」/「MetaData Streams」/「#〜」/「Tables」。 型参照のメタデータのテーブル(TypeRef)で、SupressIldasmAttribute型への参照を見つけ、NameフィールドとNamespaceフィールドを0に設定して削除します。



CFF Explorer Win



これで、ildasmでアセンブリを開いて、MSILコードを表示できます。これは既に有効です。 しかし、Reflectorではファイルはまだ開かれていません。 これを行うには、コマンド " ildasm.exe pokein.dll / source /out:pokein.il "を使用してMSILをファイルに保存し、.NET Frameworkに含まれているilasmユーティリティを使用してアセンブリを再構築します: " ilasm.exe pokein.il / dll /out:pokein.dll "。 残念ながら、ほとんどの難読化されたメソッドはまだ利用できず、クラス/フィールド/メソッドのリストはオブジェクトブラウザで表示できるため、これによるメリットはほとんどありません。



コード分​​析



コード分​​析を始めましょう。 乏しいドキュメントとアーカイブの例から、静的クラスPokeIn.Comet.CometWorkerで主な作業が行われることを理解できます。 さらに詳しく調べると、静的プロパティActiveClientCountが見つかります。このプロパティの名前は、クライアント数の制限を確認するために使用できることを示唆しています。また、新しいクライアントが接続されたときに明らかに呼び出されるオーバーロードバインドメソッドもいくつかあります。

il-ファイルを引き続き使用します。 ActiveClientCount文字列を検索すると、次の形式のプロパティ呼び出しがいくつか見つかります。



IL_0007: call int32 PokeIn.Comet.CometWorker::get_ActiveClientCount()

IL_000c: ldc.i4.s 10

IL_000e: ble IL_0027








このコードを行に解析してみましょう:

IL_0007:ActiveClientCountプロパティのゲッターを呼び出し、結果をスタックにプッシュします

IL_000c:スタックの10番をプッシュします

IL_000e:スタックの最初のオペランドが2番目以下の場合、アドレスIL_0027にジャンプします



通常、これらの呼び出しはBindメソッドとDynamicBindメソッドで行われます。これは、正しい軌道に乗っていることを示しています。



MSILデバッグ



次のステップはオプションですが、ライブでどのように機能するかを常に知りたいので、デバッグモードでアセンブリを実行してみましょう。

リフレクターは逆コンパイルにもデバッグ情報にも対処できなかったので、ソースコードはありません。

その通りですが、MSILコードを直接デバッグする方法はいくつかあります。 デバッグにVisual Studioを使用することに最も慣れているので、この方法について正確に説明します。

デバッグ情報を生成するには、/ debugスイッチを使用してライブラリを再構築します: " ilasm.exe pokein.il / dll / debug /out:pokein.dll "。 デバッグpdbも、dllファイルのあるフォルダーに表示されます。 テストプロジェクトでは、元のpokein.dllのリンクを新しいものに置き換え、get_ActiveClientCount()の呼び出しでilファイルに直接ブレークポイントを配置します。 複数のクライアントをエミュレートするには、ブラウザーの複数のタブでテストページを開きます。 新しいタブを開くたびに、Bind()メソッドの1つでブレークポイントがトリガーされます。 タブが10を超えると、同時接続の最大数を超えたという情報を含むJavaScriptアラートページが表示されます。



MSILの変更



次に、10の同時接続の制限を削除する必要があります。 ilファイルを開き、確認コードに移動します。 最初の行(例ではIL_0007)は変更されません。 覚えているとおり、プロパティを呼び出すと結果がスタックに格納されるため、そこから結果を取得する必要があります-置換

IL_000c: ldc.i4.s 10







IL_000c: pop





条件付きジャンプを置き換えます

IL_000e: ble IL_0027





無条件に

IL_000d: br IL_0027







実際、ActiveClientCount呼び出しも削除できます。 これを宿題として残します。

接続を確認するすべての場所でこの操作を繰り返し、ilasmユーティリティを使用してilファイルを収集し、テストプロジェクトのリンクを更新し、制限がないことを確認し、アラートが表示されず、タスクが完了します。



このライブラリの無料版には、同様の方法で取り除くことができるいくつかの制限があります。



この記事は教育目的で書かれており、有料プログラムをハッキングするためのアピールや指示ではありません。

楽しんでいただき、新しいことを学んだことを願っています。



All Articles