欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++封裝遠(yuǎn)程注入類(lèi)CreateRemoteThreadEx實(shí)例

 更新時(shí)間:2014年10月17日 14:48:12   投稿:shichen2014  
這篇文章主要介紹了C++封裝遠(yuǎn)程注入類(lèi)CreateRemoteThreadEx實(shí)例,詳細(xì)講述了注入DLL到指定的地址空間以及從指定的地址空間卸載DLL的方法,需要的朋友可以參考下

本文實(shí)例講述了C++封裝遠(yuǎn)程注入類(lèi)CreateRemoteThreadEx的方法,分享給大家供大家參考。具體方法如下:

首先,類(lèi)初始化時(shí)傳入要注入的DLL文件名

只使用兩個(gè)函數(shù)

復(fù)制代碼 代碼如下:
// 注入DLL到指定的地址空間
BOOL InjectModuleInto(DWORD dwProcessId);
// 從指定的地址空間卸載DLL
BOOL EjectModuleFrom(DWORD dwProcessId);

.h頭文件如下:

復(fù)制代碼 代碼如下:
#pragma once 
#include <windows.h>  //在頭文件中包含 
 
class CRemThreadInject 

public: 
    CRemThreadInject(LPSTR lpDllName); 
    ~CRemThreadInject(void); 
 
protected: 
    char m_szDllName[MAX_PATH]; 
    static BOOL EnableDebugPrivilege(BOOL bEnable); 
public: 
    // 注入DLL到指定的地址空間 
    BOOL InjectModuleInto(DWORD dwProcessId); 
    // 從指定的地址空間卸載DLL 
    BOOL EjectModuleFrom(DWORD dwProcessId); 
};

.cpp源文件如下:

復(fù)制代碼 代碼如下:
#include "RemThreadInject.h" 
#include <tlhelp32.h>  
 
CRemThreadInject::CRemThreadInject(LPSTR lpDllName) 

    memcpy(m_szDllName, lpDllName, MAX_PATH); 
    EnableDebugPrivilege(TRUE); 

 
CRemThreadInject::~CRemThreadInject(void) 

    EnableDebugPrivilege(FALSE); 

 
BOOL CRemThreadInject::EnableDebugPrivilege(BOOL bEnable) 

    HANDLE hToken = INVALID_HANDLE_VALUE; 
    //OpenProcessToken 
    if (0 == ::OpenProcessToken(::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) 
    { 
        return FALSE; 
    } 
    LUID luid; 
     
    // 
    ::LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid); 
    TOKEN_PRIVILEGES tp; 
    tp.PrivilegeCount = 1; 
    tp.Privileges[0].Luid = luid; 
    if (bEnable) 
        tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
    else 
        tp.Privileges[0].Attributes = 0; 
    if ( !AdjustTokenPrivileges( 
        hToken,  
        FALSE,  
        &tp,  
        sizeof(TOKEN_PRIVILEGES),  
        (PTOKEN_PRIVILEGES) NULL,  
        (PDWORD) NULL) ) 
    {  
        return FALSE;  
    }  
    if (GetLastError() == ERROR_NOT_ALL_ASSIGNED) 
    { 
        return FALSE; 
    }  
    ::CloseHandle(hToken); 
    return TRUE; 

 
// 注入DLL到指定的地址空間 
BOOL CRemThreadInject::InjectModuleInto(DWORD dwProcessId) 

    // 
    if (::GetCurrentProcessId() == dwProcessId) 
    { 
        return FALSE;  
    } 
    BOOL bFound; 
    /************************************************************************/ 
    /* 遍歷模塊                                                              */ 
    /************************************************************************/ 
    HANDLE hModuleSnap = INVALID_HANDLE_VALUE;  
    MODULEENTRY32 me32;  
 
    //  Take a snapshot of all modules in the specified process.  
    hModuleSnap = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, dwProcessId );  
    if( hModuleSnap == INVALID_HANDLE_VALUE )  
    {  
        return( FALSE );  
    }  
    me32.dwSize = sizeof( MODULEENTRY32 );  
    if( !Module32First( hModuleSnap, &me32 ) )  
    {  
        CloseHandle( hModuleSnap );     // Must clean up the snapshot object!  
        return( FALSE );  
    }  
    do  
    {  
        if (stricmp(me32.szModule, m_szDllName) == 0) 
        { 
            bFound = TRUE; 
            break; 
        } 
    } while( Module32Next( hModuleSnap, &me32 ) );  
 
    //  Do not forget to clean up the snapshot object.  
    CloseHandle( hModuleSnap );  
 
    if (bFound) //如果已經(jīng)加載了模塊,就不再加載 
    { 
        return FALSE; 
    } 
 
    //如果沒(méi)加載,打開(kāi)進(jìn)程,遠(yuǎn)程注入 
     
    HANDLE hProcess = ::OpenProcess(PROCESS_CREATE_THREAD |PROCESS_VM_OPERATION |PROCESS_VM_WRITE, FALSE, dwProcessId); 
    if (hProcess == NULL) 
    { 
        return FALSE; 
    } 
    HMODULE  hKernerl32 = GetModuleHandle("kernel32.dll"); 
    LPTHREAD_START_ROUTINE pfnLoadLibraryA = (LPTHREAD_START_ROUTINE)::GetProcAddress(hKernerl32, "LoadLibraryA");  
 
    int cbSize = strlen(m_szDllName)+1; 
    LPVOID lpRemoteDllName = ::VirtualAllocEx(hProcess, 0, cbSize, MEM_COMMIT, PAGE_READWRITE); 
    ::WriteProcessMemory(hProcess, lpRemoteDllName, m_szDllName, cbSize, NULL); 
    HANDLE hRemoteThread = ::CreateRemoteThreadEx(hProcess, NULL, 0, pfnLoadLibraryA, lpRemoteDllName, 0, NULL, NULL); 
    if (NULL == hRemoteThread) 
    { 
        ::CloseHandle(hProcess); 
        return FALSE; 
    } 
    //等待目標(biāo)線程運(yùn)行結(jié)束,即LoadLibraryA函數(shù)返回 
    ::WaitForSingleObject(hRemoteThread, INFINITE); 
    ::CloseHandle(hRemoteThread); 
    ::CloseHandle(hProcess); 
    return TRUE; 

 
// 從指定的地址空間卸載DLL 
BOOL CRemThreadInject::EjectModuleFrom(DWORD dwProcessId) 

    // 
    if (::GetCurrentProcessId() == dwProcessId) 
    { 
        return FALSE;  
    } 
    BOOL bFound; 
    /************************************************************************/ 
    /* 遍歷模塊                                                              */ 
    /************************************************************************/ 
    HANDLE hModuleSnap = INVALID_HANDLE_VALUE;  
    MODULEENTRY32 me32;  
 
    //  Take a snapshot of all modules in the specified process.  
    hModuleSnap = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, dwProcessId );  
    if( hModuleSnap == INVALID_HANDLE_VALUE )  
    {  
        return( FALSE );  
    }  
    me32.dwSize = sizeof( MODULEENTRY32 );  
    if( !Module32First( hModuleSnap, &me32 ) )  
    {  
        CloseHandle( hModuleSnap );     // Must clean up the snapshot object!  
        return( FALSE );  
    }  
    do  
    {  
        if (stricmp(me32.szModule, m_szDllName) == 0) 
        { 
            bFound = TRUE; 
            break; 
        } 
    } while( Module32Next( hModuleSnap, &me32 ) );  
 
    //  Do not forget to clean up the snapshot object.  
    CloseHandle( hModuleSnap );  
 
    if (!bFound) //如果沒(méi)有加載模塊,就不能卸載 
    { 
        return FALSE; 
    } 
 
    //如果加載了,打開(kāi)進(jìn)程,遠(yuǎn)程注入 
 
    HANDLE hProcess = ::OpenProcess(PROCESS_CREATE_THREAD |PROCESS_VM_OPERATION |PROCESS_VM_WRITE, FALSE, dwProcessId); 
    if (hProcess == NULL) 
    { 
        return FALSE; 
    } 
    HMODULE  hKernerl32 = GetModuleHandle("kernel32.dll"); 
    LPTHREAD_START_ROUTINE pfnFreeLibrary = (LPTHREAD_START_ROUTINE)::GetProcAddress(hKernerl32, "FreeLibrary");
 
    int cbSize = strlen(m_szDllName)+1; 
    LPVOID lpRemoteDllName = ::VirtualAllocEx(hProcess, 0, cbSize, MEM_COMMIT, PAGE_READWRITE); 
    ::WriteProcessMemory(hProcess, lpRemoteDllName, m_szDllName, cbSize, NULL); 
    HANDLE hRemoteThread = ::CreateRemoteThreadEx(hProcess, NULL, 0, pfnFreeLibrary, lpRemoteDllName, 0, NULL, NULL); 
    if (NULL == hRemoteThread) 
    { 
        ::CloseHandle(hProcess); 
        return FALSE; 
    } 
    //等待目標(biāo)線程運(yùn)行結(jié)束,即LoadLibraryA函數(shù)返回 
    ::WaitForSingleObject(hRemoteThread, INFINITE); 
    ::CloseHandle(hRemoteThread); 
    ::CloseHandle(hProcess); 
    return TRUE; 
}

希望本文所述對(duì)大家的C++程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • win32使用openfilename瀏覽文件窗口示例

    win32使用openfilename瀏覽文件窗口示例

    這篇文章主要介紹了使用win32 API打開(kāi)瀏覽文件窗口,使用OPENFILENAME結(jié)構(gòu)體來(lái)實(shí)現(xiàn)這個(gè)功能,需要的朋友可以參考下
    2014-02-02
  • C++?計(jì)算時(shí)間差的五種方法小結(jié)

    C++?計(jì)算時(shí)間差的五種方法小結(jié)

    本文主要介紹了C++?計(jì)算時(shí)間差的五種方法小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • C語(yǔ)言中g(shù)etchar()函數(shù)的用法小結(jié)

    C語(yǔ)言中g(shù)etchar()函數(shù)的用法小結(jié)

    這篇文章主要介紹了C語(yǔ)言中g(shù)etchar()函數(shù)的用法,getchar是輸入函數(shù),輸入的過(guò)程是什么呢,本文給大家詳細(xì)講解,對(duì)C語(yǔ)言getchar()函數(shù)相關(guān)知識(shí)感興趣的朋友一起看看吧
    2022-10-10
  • C++實(shí)現(xiàn)發(fā)送郵件和附件功能

    C++實(shí)現(xiàn)發(fā)送郵件和附件功能

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)發(fā)送郵件和附件功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • C語(yǔ)言中的文件讀寫(xiě)fseek 函數(shù)

    C語(yǔ)言中的文件讀寫(xiě)fseek 函數(shù)

    這篇文章主要介紹是我是C語(yǔ)言中的文件讀寫(xiě)fseek 函數(shù)的相關(guān)資料,fseek 函數(shù)用來(lái)移動(dòng)文件流的讀寫(xiě)位置;就好比播放器,可以直接拖拽到精彩的時(shí)間點(diǎn)一樣,下面我們就來(lái)詳細(xì)介紹該內(nèi)容吧,感興趣的小伙伴可以參考一下
    2021-10-10
  • C語(yǔ)言超詳細(xì)梳理排序算法的使用

    C語(yǔ)言超詳細(xì)梳理排序算法的使用

    這篇文章主要介紹了C語(yǔ)言完成排序的實(shí)例,在C語(yǔ)言基本類(lèi)型的排序中特別有用,下面我們一起進(jìn)入文章學(xué)習(xí)更詳細(xì)的內(nèi)容吧,需要的朋友可以參考下
    2022-03-03
  • 在C/C++項(xiàng)目中合理使用宏詳解

    在C/C++項(xiàng)目中合理使用宏詳解

    這篇文章主要介紹了在C/C++項(xiàng)目中合理使用宏詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • C++實(shí)現(xiàn)LeetCode(205.同構(gòu)字符串)

    C++實(shí)現(xiàn)LeetCode(205.同構(gòu)字符串)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(205.同構(gòu)字符串),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++的繼承和派生你了解嗎

    C++的繼承和派生你了解嗎

    這篇文章主要為大家詳細(xì)介紹了C++繼承和派生,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • Unreal學(xué)習(xí)之簡(jiǎn)單三角形的繪制詳解

    Unreal學(xué)習(xí)之簡(jiǎn)單三角形的繪制詳解

    之所以寫(xiě)這個(gè)繪制簡(jiǎn)單三角形的實(shí)例其實(shí)是想知道如何在Unreal中通過(guò)代碼繪制自定義Mesh,如果你會(huì)繪制一個(gè)三角形,那么自然就會(huì)繪制復(fù)雜的Mesh了。所以這是很多圖形工作者的第一課,快跟隨小編一起學(xué)習(xí)起來(lái)吧
    2023-02-02

最新評(píng)論