プロジェクトのようなプロテクター/パッカー/バインダーを開始しています。仮想ファイルシステムの設計
あなたは
- /画像/
- /音楽/
- ベース* .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は、仮想ファイルシステムにする必要があります!他の初期設定が行われる前に手動でロードする必要があります。
最終バージョンでは、デバッガを完全に削除したいと考えています。それは問題を引き起こし、プロジェクトのプロテクター部分を真剣に妥協させます。
ProofOfConcept(メモリからmodファイルを再生しているベースdll).o0 – n00b