2012-03-22 13 views
4

プロジェクトのようなプロテクター/パッカー/バインダーを開始しています。仮想ファイルシステムの設計

あなたは

  • /画像/
  • /音楽/
  • ベース* .iniファイル
  • のdll
  • EXEファイル
との完全なアプリケーションのディレクトリを持っていたときに目標があります

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

結果として得られるexeは、ファイルが見つからない場合に "真の"ファイルシステムに戻る透過的な仮想ファイルシステムを作成します。

(C++で書かれた)debbugerを取り付けるProofOfConceptイムとして、今のところ..

を私は出回っなど、(ない非常に正確に)メモリからロードするDLLを扱うことができますが、私はうーんフックに問題がある

へやや

======= 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など イムた問題のようなもののためのデバッガでブレークポイントを処理しています。それが見えますtarget.exe

私は偽のハンドルを作成し、それをキャッチして処理する必要がありますか?またはそのアプローチで非常に間違っている可能性のあるものがあまりにも多いですか?ここ

が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; 
} 

用のサンプルコールバック関数である私は、プロセスにcodecaveを行う必要がありますし、シェルコードを押して、[編集:申し訳ありませんが、私は別のものを記述するために、これらの単語の多くを使用しますが、私はあなたを考えます私は何をキャッチします:)]私の偽のコードを実行するには?

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

最終バージョンでは、デバッガを完全に削除したいと考えています。それは問題を引き起こし、プロジェクトのプロテクター部分を真剣に妥協させます。

+0

ProofOfConcept(メモリからmodファイルを再生しているベースdll).o0 – n00b

答えて

1

プリコンパイルされたバイナリで透過的に動作させ、すべてが結果の単一バイナリに収まるようにするには、パッカーがフックコードをバイナリに追加する必要があります。その後、制御をバイナリの元のエントリポイントに渡します。確かに実行可能ですが、これはあまり自明ではありません。

ただし、ここに別の問題があります。このフックコードには、暗号解読コードとおそらく鍵が含まれています。このすべてのことは、デバッガやその他のツールを備えた優れたプログラマが解読することができます。

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

+0

共有モードは素晴らしいアイデアです。私のバグのハンドルスプーフィングコードを取り除くことができます:) – n00b

関連する問題