Dll実行可能ファイルの解放

3650 ワード

Dllリリース実行可能ファイルは広く使用されています.木馬注入を実現する方法の1つは、dllをあるプロセスのアドレス空間にロードした後に木馬を解放することである.次の
以下の詳細な手順を紹介し、後者に参考を提供します.
解放する必要があるファイルは、まずdllにリソースとして格納する必要があります.そして、ファイルの読み取り、書き込み等が行われる.dllを作成する手順は説明しません.いいえ
私のブログ「windowsコアプログラミングシリーズ」を参考にdllについて話してください.http://blog.csdn.net/ithzhang/article/details/7021274または
は、vcを使用してdllを作成するWeb上の投稿を参照します.
Dllプロジェクトが完成したら、リソースを追加する必要があります.アセットビューの右クリックでアセットの追加--』をインポートします.次に、追加するファイルを選択します.例えばcalc.exe.を選択します.
リソースはEXEなどのタイプを指定します.リソースが追加されました.EXEリソースを展開します.次に、そのリソースのID、例えばID_EXE1.これは後で使います.
着きます.
まずDllMain関数に注目します.この関数は、dllがアプリケーションアドレス空間にロードされた後、プロセスアドレス空間からアンインストールされたときに呼び出されます.さらに
この関数も呼び出される場合があります.ul_reason_for_callは、この関数が呼び出された理由を識別します.私たちが注目しているのは
DLL_PROCESS_ATTACH.dllがプロセスアドレス空間にロードされるとDllMainが呼び出され、ul_reason_for_callが割り当てられています
DLL_PROCESS_ATTACH.ここではすべての動作を実行します.私の博文《windowsコアプログラミングシリーズ》はdllの高級技術について話します
http://blog.csdn.net/ithzhang/article/details/7051558
HINSTANCEhIns=GetModuleHandle("AudioEngine.dll");このdllのインスタンスハンドルは、この文で取得されます.
FindResourceは指定したアドレス空間内で検索します.解放するファイルをdllに格納するため、そのハンドルはhInsであるべきです.
exeの場合、最初のパラメータはデフォルトの現在のプロセスアドレス空間を省略できます.詳細は、「http://blog.csdn.net/ithzhang/article/details/7995102」を参照してください.


コードを見てください:
case DLL_PROCESS_ATTACH:
		{
			HINSTANCE hIns=GetModuleHandle("AudioEngine.dll");
			HRSRC hRsrc =::FindResource(hIns, MAKEINTRESOURCE(IDR_EXE1), "exe");//IDR_XXXXXX        a.exe b.dll ID 
			if (NULL == hRsrc)
			{
				MessageBox(NULL,TEXT("      !!!"),TEXT("  !!"),MB_OK);

				return FALSE;
			}
				
			DWORD dwSize = SizeofResource(hIns, hRsrc);
            if (0 == dwSize)
			{
				MessageBox(NULL,TEXT("      !!!"),TEXT("  !!"),MB_OK);
				return FALSE;
			}
			//    
			HGLOBAL gl = LoadResource(hIns, hRsrc);
			if (NULL == gl)
			{
				MessageBox(NULL,TEXT("      !!!"),TEXT("  !!"),MB_OK);
				return FALSE;
			}
			//    
			LPVOID lp = LockResource(gl);
			if (NULL == lp)
			{
				MessageBox(NULL,TEXT("      !!!"),TEXT("  !!"),MB_OK);

				return FALSE;
			}
			TCHAR filename[256]=TEXT("calc1111.exe");//        
			// CREATE_ALWAYS               。
			STARTUPINFO si={0};
			PROCESS_INFORMATION pi;
			DWORD a;
			HANDLE fp= CreateFile(filename ,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL);
			if((fp==INVALID_HANDLE_VALUE))
			{
				MessageBox(NULL,TEXT("      !!!"),TEXT("  !!"),MB_OK);

				return 0;
			}
			if (!WriteFile (fp,lp,dwSize,&a,NULL))
			{
				MessageBox(NULL,TEXT("      !!!"),TEXT("  !!"),MB_OK);

				return false;
			}
			FreeResource (gl);//     
			CloseHandle (fp);//    
			bool ret=CreateProcess(NULL,filename,NULL,NULL,false,0,NULL,NULL,&si,&pi);
			if(!ret)
			{
				int r=GetLastError();
				char buff[256];
				sprintf(buff,"      !!    :%d",r);
				MessageBox(NULL,buff,TEXT("  !!"),MB_OK);
				return 0;

			}
			CloseHandle(pi.hThread);
			CloseHandle(pi.hProcess);
		}

この例の最後のステップでは、CreateProcessを呼び出して実行可能ファイルを実行します.
dllにリソースを追加するのはよくあります.ダイアログボックス、ビットマップなどです.これはdllがexeファイルを解放する原理と似ています.