質問:
dllのメモリダンプを修正する方法-だから私はolly \ idaを使用して動的にそれを逆にします
0xAK
2015-12-08 13:53:59 UTC
view on stackexchange narkive permalink

マルウェアモジュールのメモリダンプを分析する必要があります。残念ながら、サンプルは元のdllではなく、メモリからのdllのダンプです。

セクションヘッダーを修正しましたはかなり簡単です-仮想アドレス\サイズ生アドレス\サイズに一致させる必要があります。これは、PEがメモリにロードされると取得されるものだからです(これはダンプの場合です)

しかし、別の問題があります。たとえば、IDA-PROでファイルを開くと、メモリが正しく配置されていないため、分析が正しくなく、すべての相対アドレスを使用した呼び出し関数は正しく機能します(正しい場所、またはPEサイズの観点から意味のある場所を指していません)

リベースの解決策のように感じますidaのPEは不完全であり、必要に応じてすべてを修正するわけではありません。また、後でollydbgを使用して動的にロードできるようにPEを修正したいと思います(元のPEがあるかのように)

だから私の質問は:どのように正確にPEヘッダーを修正し、プログラムをリベースして、正常にロードできるようにすることをお勧めしますか?

VirusTotal-Intelligenceユーザーの場合、サンプルMD5は次のとおりです。 : https://www.hybrid-analysis.com/search?query=vxfamily%3AGen:Variant.Terkcop

2015_12_08_ExtraInfo :@ ubnix、あなたが送ってくれた資料の内容をまだ読んでいませんが、IATの重要性をよく知っています-ちなみに、これはIDAにファイルをロードするときの問題です。

dllはアドレス0x10000000にロードされます(したがって、すべてのセクションは0x10001000にロードされます-サイズなどに応じて、それぞれ0x10000000以降です。)

マルウェアのコードは、IATが0x05320000にあることを想定しています。明らかにそうではありません。 IDA-PROを試してIATセグメントの場所を変更しようとすると(思い出すとCtrl + SまたはALT + S)、IDAクライアントがクラッシュします。

明らかに、アドレスの変更は、IDA proでマルウェアを静的に確認するための一時的な解決策としてのみ機能し、ollydbgを使用してマルウェアを実行するための解決策としては機能しません。 ollyでマルウェアを実行したい場合は、どういうわけかdllを0x5320000の正しいアドレスで実行する必要があります

PEのBaseAddressを0x10000000から目的のアドレスに変更する場合(CFF Explorerを使用) )、それはまだollydbgで0x10000000でロードされています。理由はわかりません

Edit22015_12_15 :サンプルの例私は彼のヘッダーを「修正」しましたが、それでも正しく機能していません(すべてのCRT機能の問題)

元のサンプル: https://www.hybrid-analysis.com/sample/53dd790b1bd0588e542d33bde49dbf33c6fb7828e91a8d13c416c831108d642c?environmentId=1

サンプルを修正した後: https://www.dropbox.com/s/6dz7athzdja94p4/53_fixed_rebase.dll?dl=0

これらのファイルは両方ともマルウェアのサンプルであり、アンチウイルスが警告を発する可能性があります。

修正したサンプルは間違いなくより適切に機能しており、idaはすべての機能を即座に認識できますが、CRTの機能または機能しかないため、何かを見逃したと思います。といった 「初期化操作」(c ++クラスの初期化など)が失敗しています。

二 答え:
ubnix
2015-12-08 21:30:35 UTC
view on stackexchange narkive permalink

これはコメントになりますが、コメントに対する評判がまだ十分ではないため、回答として残しておきます。

ダンプが正しく機能するためには、さらにいくつかのことがあります。セクションヘッダーを修正する以外に、次のことを行う必要があります。

  • データディレクトリを移動し、すべてが適切なテーブルを指していることを確認します。
  • データディレクトリが指していることを確認したら適切な場所で、インポートとエクスポートが修正されていることを確認してください(他のすべての使用済みテーブルの中で!)。正確には、インポートアドレステーブル(IAT)とエクスポートアドレステーブル(EAT)が正しいことを確認する必要があります。 IATやEATのような概念があなたにとって異質なものである場合は、公式の PEファイル形式仕様の「.idataセクション」および「.edataセクション」でこれらのテーブルについて読むことをお勧めします。
  • また、この質問はPEファイル形式と密接に関連しているため、次のドキュメントを読むことをお勧めします。 Win32 Portable Executable FileFormatパート1の詳細および Win32 Portable Executable FileFormatパート2の詳細

読むべき資料をたくさん投稿したことは知っていますが、信じてください。私の個人的な経験であり、PEファイル形式とPEファイルを正しくダンプする手順を理解したい場合は、これらのリソースが必須です。他にご不明な点がございましたら、お気軽にお問い合わせください。できるだけ早く回答いたします。

質問を変更し、問題に関する情報を追加しました
@RE-Beginner: DLLは通常、ASLRを有効にしてコンパイルされます。 IMAGE_FILE_HEADERの[特性]フィールドをチェックして、IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASEフラグが含まれているかどうかを確認します。これが意味するのは、DLLがメモリ内のランダムなアドレスにロードされ、それが正しく機能するためには、再配置テーブルが指定され、正しい必要があるということです。では、マルウェアサンプルで再配置テーブルが指定されていますか?
いいえ、そうではありません。また、私の反転環境はWindows XPに設定されているので、影響はありません。
@RE-Beginner:サンプルをアップロードできますか?
はい、メッセージにサンプルをダウンロードする方法を追加しましたhttps://www.hybrid-analysis.com/search?query=vxfamily%3AGen:Variant.Terkcop
@RE-Beginner:わかりました、私は問題が何であるかを理解していると思います。インポートに関連するすべてのアドレスはRAW形式で表され、DLLのメモリレイアウトがディスク上とメモリ内で同じである場合は正しいですが、そうではありません。ファイルをメモリにロードすると、ファイルのメモリレイアウトが変更されます。解決策は、インポートテーブルを解析し、すべてのアドレスを変更して、正しい相対仮想アドレスを持つようにすることです。あなたがそれをする方法を知らないならば、私はあなたのためにそれをすることができます、しかしあなたは数日待たなければならないでしょう。私が分析した:MD5:3bb85abe51b0f96f501d2bb32ec4edef
PE全体を最初から再構築することを提案していますか?それとも、どういうわけかImportTableを再作成することを提案していますか?提案する内容に関係なく、将来の参照のために自分でそれを行う方法を知りたいです
@RE-Beginner:インポートテーブルの生のアドレスを相対仮想アドレス(RVA)に変換する必要があります。たとえば、分析したサンプルのインポートテーブルは0x17B9Cです。これは有効なRVAではありません。これは生のアドレスです。セクションヘッダーを見ると、このアドレスはRVA 0x14000のセクションに属し、生データへのポインターは0x13400です。したがって、インポートテーブルの生のオフセットは0x17b9c-0x13400 = 0x479cです。これをセクションRVAに追加して、0x1879cを取得します。これはインポートテーブルの正しい値であり、データディレクトリに書き込む必要があります。インポートテーブルのすべてのアドレスに対してこの変換を行います。
わあわあちょっと待って..私はあなたの計算を理解していませんでした!詳細に説明していただけますか? (あなたの答えの本文では、より良い読書のために本当に良いでしょう)
私はこれを実際に理解したと思います..アドレスを新しい値に変更し、プログラム `BaseAddress`も変更しました。これは実際には非常に重要なステップです..これですべての相対関数とメモリは正常に見えますが、問題が発生しましたOllyの `DLLLOADER.EXE`にあるようです-修正されたサンプルが関数` __CRT_INIT@12`でクラッシュするようになりました。忘れたものはありますか?それともこれは完全な問題ですか? (IDAは今問題なくdllを分析します)
@RE-Beginner固定サンプルをアップロードして、Ollyでローカルに分析できるようにしてください。計算の説明は、今日は仕事帰りになります。
ちょっと@ubnix,私はメインの質問を変更し、新しいサンプルと私の「修正された」サンプルで追加情報を追加しました。ヘッダーを変更しました。しかし、最初のサンプルとは異なるサンプルです。
blabb
2015-12-11 01:48:19 UTC
view on stackexchange narkive permalink

ダンプされたファイルを16進エディタで開き、hxd
オフセット 0x400から0xfff までのバイトを選択し、それらを削除します
すべてのバイトは0x00になります
インポートしたファイルを保存すると、
生データへのポインタは通常0x400
になりますが、これはメモリであるため、peヘッダーは0x1000バイトになり、余分なバイトを削除すると、テキストセグメントと正しい場所へのエントリポイント

他のセクションでさらに下にずれがある場合は、生データのサイズ+生データへのポインタに基づいて余分な00000バイトをトリミングする必要がある場合がありますこれは通常、生データへの次のセクションポインタと一致する必要があります

`zero-bytes`を削除する代わりに、私が通常行うことは、その余分なオフセットに一致するようにPEヘッダーに変更することでした-したがって、生のサイズを0x400にする代わりに、0x1000に変更すると、問題が修正されます(これまでのところ)私はあなたが提案したことをまだ試していませんが、私はそれが違うとは思いません!結果とともに後で戻ってきます
なぜcrt関数だけがollydbgで正しく機能しないのか考えてみてください。
特定のファイルに対してこれを自動的に行うサンプルアプリを作成できませんでしたか?


このQ&Aは英語から自動的に翻訳されました。オリジナルのコンテンツはstackexchangeで入手できます。これは、配布されているcc by-sa 3.0ライセンスに感謝します。
Loading...