2011-01-24 16 views
1

私は2人の友人にVistaの実行ファイルをテストしなければならなかった& Win7オペレーティングシステム。注入されたコードは実行されませんでした(管理者として実行する場合でも)が、コンソールは開いたり閉じたりしませんでした。 WriteProcessMemoryCreateRemoteThreadによるコードインジェクションはVistaまたはWin7でも動作しますか?リモートスレッドが終了した後のWindows XP上のプロセスクラッシュしばらく防ぐためのVisual Studio 2008/RTCuを使用してコンパイルVistaまたはWin7ではコードインジェクションが機能しませんか?

コード

CodeInjector.h

#ifndef CODEINJECTOR_H 
#define CODEINJECTOR_H 

typedef HANDLE(WINAPI *GETPROC)(); 
typedef HMODULE(WINAPI *PLOADLIBRARYA)(const char *dll); 
typedef LPVOID(WINAPI *PGETPROCADDRESS)(HMODULE mod, const char *func); 
typedef int (WINAPI *FNMESSAGEBOX)(HWND, LPCSTR, LPCSTR, UINT); 

typedef struct _IAT { 
    PLOADLIBRARYA pLoadLibraryA; 
    PGETPROCADDRESS pGetProcAddress; 
    FNMESSAGEBOX fnMessageBox; 
} IAT; 

typedef struct _DATA { 
    void *szData[256]; 
} DATA; 

typedef struct _FNARGS { 
    LPVOID pIat; 
    LPVOID pData; 
} FNARGS; 

#endif /* CODEINJECTOR_H */ 

CodeInjector.cpp

#include "stdafx.h" 

#include <iostream> 
#include <string> 
#include <windows.h> 

#include "CodeInjector.h" 

using namespace std; 

HANDLE getHandleByName(const char* nameWnd) 
{ 
    HWND hWnd = FindWindowA(0, nameWnd); 

    if (hWnd == 0) { 
     std::cerr << "Cannot find window" << std::endl; 
    } else { 
     DWORD pId; 
     GetWindowThreadProcessId(hWnd, &pId); 

     HANDLE hToken; 
     TOKEN_PRIVILEGES tkp; 
     if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) { 
      LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid); 
      tkp.PrivilegeCount = 1; 
      tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
      AdjustTokenPrivileges(hToken, 0, &tkp, sizeof (tkp), NULL, NULL); 
     } 

     HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pId); 

     if (!hProc) { 
      std::cerr << "Cannot open process: " << GetLastError() << std::endl; 
     } else { 
      return hProc; 
     }cout << hProc; 
     getchar(); 
    } 

    return false; 
} 

static DWORD WINAPI ThreadFunc(FNARGS *info) 
{ 
    if (info == NULL || info->pIat == NULL || info->pData == NULL) { 
     return 0; 
    } 

    IAT *iat = (IAT *)info->pIat; 
    DATA *data = (DATA *)info->pData; 

    iat->fnMessageBox(NULL, (char*)data->szData[1], (char*)data->szData[0], MB_OK); 

    return 0; 
} 

static void ThreadFuncEnd() {} 

int main(int argc, char** argv) 
{ 
    HANDLE hProc = getHandleByName("Calculator"); 

    DWORD CodeSize = (DWORD) & ThreadFuncEnd - (DWORD) & ThreadFunc; 

    IAT hIAT; 

    DWORD hLibModule; 
    HMODULE hKernel = LoadLibraryA("kernel32.dll"); 
    HMODULE hUser32 = LoadLibraryA("user32.dll"); 

    hIAT.pLoadLibraryA = (PLOADLIBRARYA)GetProcAddress(hKernel, "LoadLibraryA"); 
    hIAT.pGetProcAddress = (PGETPROCADDRESS)GetProcAddress(hKernel, "GetProcAddress"); 
    hIAT.fnMessageBox = (FNMESSAGEBOX)GetProcAddress(hUser32, "MessageBoxA"); 

    LPVOID hIATMemAddr = VirtualAllocEx(hProc, NULL, sizeof (IAT), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); 
    WriteProcessMemory(hProc, hIATMemAddr, (LPVOID) & hIAT, sizeof (IAT), NULL); 

    DATA hData; 
    LPVOID hDataMemAddr = VirtualAllocEx(hProc, NULL, sizeof (DATA), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); 
    hData.szData[0] = VirtualAllocEx(hProc, NULL, 64, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); 
    hData.szData[1] = VirtualAllocEx(hProc, NULL, 64, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); 
    hData.szData[2] = VirtualAllocEx(hProc, NULL, 64, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); 
    hData.szData[3] = VirtualAllocEx(hProc, NULL, 64, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); 

    char tmp[64]; 

    strcpy(tmp, "Caption"); 
    WriteProcessMemory(hProc, hData.szData[0], (LPVOID) & tmp, sizeof (tmp), NULL); 

    strcpy(tmp, "Message"); 
    WriteProcessMemory(hProc, hData.szData[1], (LPVOID) & tmp, sizeof (tmp), NULL); 

    WriteProcessMemory(hProc, hDataMemAddr, (LPVOID) &hData, sizeof (DATA), NULL); 

    FNARGS tInfo; 
    tInfo.pIat = hIATMemAddr; 
    tInfo.pData = hDataMemAddr; 

    LPVOID hInfoMemAddr = VirtualAllocEx(hProc, NULL, sizeof (FNARGS), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); 
    WriteProcessMemory(hProc, hInfoMemAddr, (LPVOID) & tInfo, sizeof (FNARGS), NULL); 

    LPVOID CodeMemAddr = VirtualAllocEx(hProc, NULL, CodeSize, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE); 
    WriteProcessMemory(hProc, CodeMemAddr, (LPVOID) & ThreadFunc, CodeSize, NULL); 

    HANDLE hRemoteThread = CreateRemoteThread(hProc, NULL, 0, (LPTHREAD_START_ROUTINE)CodeMemAddr, hInfoMemAddr, 0, NULL); 

    WaitForSingleObject(hRemoteThread, INFINITE); 
    GetExitCodeThread(hRemoteThread, &hLibModule); 

    CloseHandle(hProc); 

    return 0; 
} 
+0

これをデバッグしてもらいたいですか?あなたが何を望み、何が間違っているのかははっきりしていませんか? –

+0

これはうまくコンパイルできますが、VistaとWin7の他のプロセスにコードを注入することはありません。コードを挿入する方法はいろいろありますので、参考のために実装を投稿しました。コードインジェクションが機能しない理由を確認する方法がわかりません。それは私が知りたいことです。 –

+0

戻り値をチェックしないので、あなたが呼んでいるAPIがたくさんあるので、それを伝えるのは難しいです。問題をもう少し詳しく追跡する必要があります。現在、変数が多すぎます。 –

答えて

1

ない本当に驚き。 VistaとWindows 7ではセキュリティが強化されています。多くのマルウェアは、Windows XPでセキュリティメカニズムをバイパスするための手順の1つとしてコードインジェクションを使用しました。マイクロソフトがこれを修正したことをうれしく思います。

関連する問題