CreateRemoteThread - работает на Висте,но глухо на XP без SP
От: frankinshtein Россия  
Дата: 29.12.07 14:21
Оценка:
вот код для инъекции дллки
работает отлично на Висте, и выполняется без ошибок на XP без SP
но инъекции никакой не происходит, в чем может быть дело?

BOOL WINAPI InjectLib(DWORD dwProcessId, const char *pszLibFile) {

    BOOL fOk = FALSE; // Assume that the function fails
    HANDLE hProcess = NULL, hThread = NULL;
    char* pszLibFileRemote = NULL;
 
    __try {
        // Get a handle for the target process.        
        Message("5");
        hProcess = TryOpenProcess(dwProcessId);
        if (!hProcess)
        {
            ::MessageBox(0, "you have not admin permissions, please try to open program in Admin mode", "error", MB_OK|MB_ICONERROR);
            return false;
        }
        Message("6");

        // Calculate the number of bytes needed for the DLL's pathname
        int cch = 1 + strlen(pszLibFile);
        int cb  = cch * sizeof(char);

        // Allocate space in the remote process for the pathname
        pszLibFileRemote = (char*) 
            VirtualAllocEx(hProcess, NULL, cb, MEM_COMMIT, PAGE_READWRITE);
        if (pszLibFileRemote == NULL) __leave;

        //MessageBox(0, "3", 0, 0);
        // Copy the DLL's pathname to the remote process's address space
        if (!WriteProcessMemory(hProcess, pszLibFileRemote, 
            (PVOID) pszLibFile, cb, NULL)) __leave;

        //MessageBox(0, "4", 0, 0);
 
        // Get the real address of LoadLibraryW in Kernel32.dll
        PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)
            GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryA");
        if (pfnThreadRtn == NULL) __leave;

        //MessageBox(0, "5", 0, 0);

        // Create a remote thread that calls LoadLibraryW(DLLPathname)
        hThread = CreateRemoteThread(hProcess, NULL, 0, 
            pfnThreadRtn, pszLibFileRemote, 0, NULL);
        if (hThread == NULL) __leave;

        //MessageBox(0, "6", 0, 0);

        // Wait for the remote thread to terminate
        WaitForSingleObject(hThread, INFINITE);

        fOk = TRUE; // Everything executed successfully
        Message("ok");
    }
    __finally { // Now, we can clean everthing up
        if (fOk == FALSE)
        MessageBox(0,"Inject Failed", 0, 0);
        
        //MessageBox(0, "failed", 0, 0);
        // Free the remote memory that contained the DLL's pathname
        if (pszLibFileRemote != NULL) 
            VirtualFreeEx(hProcess, pszLibFileRemote, 0, MEM_RELEASE);

        if (hThread  != NULL) 
            CloseHandle(hThread);

        if (hProcess != NULL) 
            CloseHandle(hProcess);
    }

    return(fOk);
}


HANDLE TryOpenProcess(DWORD dwProcessId)
{
    HANDLE hProcess = NULL;
    hProcess = OpenProcess(
        PROCESS_QUERY_INFORMATION |   // Required by Alpha
        PROCESS_CREATE_THREAD     |   // For CreateRemoteThread
        PROCESS_VM_OPERATION      |   // For VirtualAllocEx/VirtualFreeEx
        PROCESS_VM_WRITE,             // For WriteProcessMemory
        FALSE, dwProcessId);

    if (hProcess == NULL)
    { 
        if (GetLastError() == ERROR_ACCESS_DENIED)
        { 
            OSVERSIONINFO osvi;

            // определяем версию операционной системы
            osvi.dwOSVersionInfoSize = sizeof(osvi);
            GetVersionEx(&osvi);

            // мы больше ничего не можем сделать, если это не Windows NT
            if (osvi.dwPlatformId != VER_PLATFORM_WIN32_NT)
                return SetLastError(ERROR_ACCESS_DENIED), FALSE;

            // включим привилегию SE_DEBUG_NAME и попробуем еще раз

            TOKEN_PRIVILEGES Priv, PrivOld;
            DWORD cbPriv = sizeof(PrivOld);
            HANDLE hToken;

            // получаем токен текущего потока
            if (!OpenThreadToken(GetCurrentThread(),
                TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES,
                FALSE, &hToken))
            {
                if (GetLastError() != ERROR_NO_TOKEN)
                    return 0;

                // используем токен процесса, если потоку не назначено
                // никакого токена
                if (!OpenProcessToken(GetCurrentProcess(),
                    TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES,
                    &hToken))
                    return 0;
            }

            _ASSERTE(ANYSIZE_ARRAY > 0);

            Priv.PrivilegeCount = 1;
            Priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
            LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &Priv.Privileges[0].Luid);

            // попробуем включить привилегию
            if (!AdjustTokenPrivileges(hToken, FALSE, &Priv, sizeof(Priv),
                &PrivOld, &cbPriv))
            {
                DWORD dwError = GetLastError();
                CloseHandle(hToken);
                return SetLastError(dwError), FALSE;
            }

            if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
            {
                // привилегия SE_DEBUG_NAME отсутствует в токене
                // вызывающего
                CloseHandle(hToken);
                return SetLastError(ERROR_ACCESS_DENIED), FALSE;
            }

            hProcess = OpenProcess(
                PROCESS_QUERY_INFORMATION |   // Required by Alpha
                PROCESS_CREATE_THREAD     |   // For CreateRemoteThread
                PROCESS_VM_OPERATION      |   // For VirtualAllocEx/VirtualFreeEx
                PROCESS_VM_WRITE,             // For WriteProcessMemory
                FALSE, dwProcessId);


        }
    }
    return hProcess;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.