2012-05-12 11 views
0

私はGoogleや他の情報源から検索していたので、トピックの説明/タイトルがそれを示しているので、これは可能ですか?質問をするためにここに来ました...VC++ 2008のリソースとしてDLLを埋め込み/ロードしますか?

可能なすべてDLLを最終的な実行ファイルにリソースとして埋め込み、それを現在のディレクトリおよび/またはシステムディレクトリの外部ファイルであるかのように呼び出しますか?

私は運がなければ多くのことを試しましたが、その解決策の多くはうまくいきませんでした。私はDLL.rcファイルに埋め込んでしまったようですが、ディスク上の物理ファイルに保存する必要があるかもしれませんが、わかりません。

[EDIT]以下

は現在、私はまだ任意の成功なしに、実装したコードです。私はまだ、以下The program can't start because soandso.dll is missing from your computer.

コードに直面しています -

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) 
{ 
    HRSRC hRes = FindResource(hInstance, MAKEINTRESOURCE("#101"), "IDR_DLLRESOURCE_101"); 
    HGLOBAL hData = LoadResource(hInstance, hRes); 
    LPVOID lpFile = LockResource(hData); 
    DWORD dwSize = SizeofResource(hInstance, hRes); 

    HANDLE hFile = CreateFile("soandso.dll", GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); 
    HANDLE hFilemap = CreateFileMapping(hFile, 0, PAGE_READWRITE, 0, dwSize, 0); 
    LPVOID lpBaseAddr = MapViewOfFile(hFilemap, FILE_MAP_WRITE, 0, 0, 0); 

    CopyMemory(lpBaseAddr, lpFile, dwSize); 
    UnmapViewOfFile(lpBaseAddr); 
    CloseHandle(hFilemap); 
    CloseHandle(hFile); 
    return 0; 
} 

/は任意のため、事前にありがとうとすべてが提供できます。

+0

「Reflective DLL Injection」のGoogleでは、質問に対する回答が見つかります。 –

答えて

1

DLLをロードする唯一のサポートされている方法は、ファイルからのものです。したがって、このDLLをロードする必要がある場合は、リソースを抽出してファイル(一時ディレクトリなど)に保存し、ライブラリにリンクするにはLoadLibraryGetProcAddressを呼び出します。

+0

「公式にサポートされている」唯一の方法は、あなたの発言です。しかし、それを行うための他の方法があります。例:リフレクティブDLLインジェクション。 –

2

Windowsが実行可能コードをPE32ファイル形式で処理する方法とは基本的に互換性がありません。ファイルにする必要があります。Windowsは、メモリマップされたファイルを作成してメモリにマップします。リソースからメモリにロードするようなことを試すには、Windowsローダーのすべての任務を引き継ぐ必要があります。予想されるベースアドレスに配置できない場合にコードを再配置し、すべての従属DLLを見つけてロードし、DllMain()メソッドを呼び出す。

特に、DLL_THREAD_ATTACHおよびDETACH通知は、作成されるすべてのスレッドを制御することができないため、自分自身を実装することは不可能です。右のことを行うのは非常に困難で、これを行うのに役立つ単一のwinapiはありません。それは価値がありません。 DLLのコードをEXEイメージにリンクするだけで競争力を失うことはほとんどありません。

関連する問題