4

プロテクター/パッカー/バインダーのようなプロジェクトを開始しています。

目標は、完全なアプリディレクトリがあるときです

  • /画像/
  • /音楽/
  • ベース *.ini ファイル
  • dll
  • exe

その上で packer.exe を使用するだけで、これらすべてのファイルがパックされ、暗号化され、結果の exe に保存されます。

結果として得られるexeは、ファイルが見つからない場合に「実際の」ファイルシステムにフォールバックする透過的な仮想ファイルシステムを作成します。

私はすでに(あまり正確ではありませんが)メモリからdllをロードすることなどを処理できますが、うーんフックに問題があります..

今のところ、Debbuger (c++ で記述) を target.exe にアタッチする ProofOfConcept im として

やや似ている

======= Started [target.exe] =======
> Placing breakpoint on EP : 0x401130
Process started
Loaded module : [target.exe]
Loaded module : [ntdll.dll]
Loaded module : [kernel32.dll]
[...]
Break point at [0x401130]
 > Restored EP byte.
 Loaded module : [bass.dll]
Break point at [0x760fcc4e]
Found set bp : kernel32!CreateFileW
[!] CreateFileW Callback Function :
       FileName : C:\Users\user\Desktop\cppve\loader\bin\Debug\target.exe
       Access   : 0x80000000
       Return Addr: 0x741b91e6
 > Re-setting bp at [0x760fcc4e]
Break point at [0x760fcc4e]
Found set bp : kernel32!CreateFileW
[!] CreateFileW Callback Function :
       FileName : .\beyond_v.mod
       Access   : 0x80000000
       Return Addr: 0x760fcfa0

CreateFileW ReadFile などのデバッガーでブレークポイントを処理しています。使用可能なデータをターゲットに提供する際に問題があります。

偽のハンドルを作成し、それをキャッチして処理する必要がありますか? または、そのアプローチで非常にうまくいかないことが多すぎますか?

CreateFileW のサンプル コールバック関数を次に示します。

void callback_createfilew(CONTEXT* ct){
//stub
cout<<"[!] CreateFileW Callback Function :"<<endl;

void* returnaddr=MemReadDwordPtr(hProcess,(void*)ct->Esp);
string fn=MemReadCString(hProcess,MemReadDwordPtr(hProcess,(void*)ct->Esp+4),true);
void* access=MemReadDwordPtr(hProcess,(void*)ct->Esp+8);
void* sharemode=MemReadDwordPtr(hProcess,(void*)ct->Esp+12);
void* dwCreationDisposition=MemReadDwordPtr(hProcess,(void*)ct->Esp+20);
void* dwFlagsAndAttributes=MemReadDwordPtr(hProcess,(void*)ct->Esp+24);

cout<<"       FileName : "<<fn<<endl;
cout<<"       Access   : "<<(void*)access<<endl;
cout<<"       Return Addr: "<<(void*)returnaddr<<endl;

if(fn.compare(".\\beyond_v.mod")==0){
    // this is wrong, we need to call it from the target process...
    HANDLE ret=CreateFileA(".\\_beyond_v.mod",(DWORD)access,(DWORD)sharemode,NULL,(DWORD)dwCreationDisposition,(DWORD)dwFlagsAndAttributes,NULL);
    ct->Esp+=0x20;
    ct->Eax=(DWORD)ret;
    ct->Eip=(DWORD)returnaddr;
}

プロセスでコードケーブを作成し、シェルコードをプッシュする必要があります[編集: 申し訳ありませんが、これらの単語の多くをさまざまなことを説明するために使用していますが、私のメンションをキャッチできると思います :) ]そこで偽のコードを実行しますか?

または、int3s を処理する dll を挿入し、ローダーによって設定された例外ハンドラーを介して制御を渡しますか? ただし、それは難しいことがわかります...そのdllは仮想ファイルシステムにある必要があります! そのため、他の初期化が行われる前に手動でロードする必要があります。

最終バージョンでは、デバッガーを完全に削除したいと思います。それは問題を引き起こし、プロジェクトのプロテクター部分を深刻に損なうだけです。

4

1 に答える 1

1

「パッカー」がプリコンパイルされたバイナリで透過的に動作し、すべてが結果の単一バイナリ内にあるようにする場合、パッカーはフックコードをバイナリに追加する必要があります。おそらく、最初に実行してから、制御を渡します。バイナリの元のエントリポイントに移動します。確かに実行可能ですが、これはそれほど簡単ではありません。

しかし、ここには別の問題があります。このフックコードには、復号化コードとおそらくキーも含まれます。これはすべて、デバッガーやその他のツールを使用する優れたプログラマーによって解読可能です。

偽のハンドルについては、ファイルを複数回開いて別のハンドルを取得できるかどうかを確認します。そうである場合は、共有モードで読み取るために既存のファイルを開き、ハンドルを覚えて、メモリ内ファイルに使用します。別のハンドルが必要ですか?ファイルをもう一度開いて取得します。これにより、他の実際のハンドルとの衝突がないことが保証されます。

于 2012-04-03T09:03:11.277 に答える