当前位置: 首页 > 编程笔记 >

C++封装远程注入类CreateRemoteThreadEx实例

商皓
2023-03-14
本文向大家介绍C++封装远程注入类CreateRemoteThreadEx实例,包括了C++封装远程注入类CreateRemoteThreadEx实例的使用技巧和注意事项,需要的朋友参考一下

本文实例讲述了C++封装远程注入类CreateRemoteThreadEx的方法,分享给大家供大家参考。具体方法如下:

首先,类初始化时传入要注入的DLL文件名

只使用两个函数

// 注入DLL到指定的地址空间

BOOL InjectModuleInto(DWORD dwProcessId);

// 从指定的地址空间卸载DLL

BOOL EjectModuleFrom(DWORD dwProcessId);

.h头文件如下:

#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源文件如下:

#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) //如果已经加载了模块,就不再加载  

    {  

        return FALSE;  

    }  

  

    //如果没加载,打开进程,远程注入  

      

    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;  

    }  

    //等待目标线程运行结束,即LoadLibraryA函数返回  

    ::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) //如果没有加载模块,就不能卸载  

    {  

        return FALSE;  

    }  

  

    //如果加载了,打开进程,远程注入  

  

    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;  

    }  

    //等待目标线程运行结束,即LoadLibraryA函数返回  

    ::WaitForSingleObject(hRemoteThread, INFINITE);  

    ::CloseHandle(hRemoteThread);  

    ::CloseHandle(hProcess);  

    return TRUE;  

}

希望本文所述对大家的C++程序设计有所帮助。

 类似资料:
  • 本文向大家介绍深入解析C++编程中类的封装特性,包括了深入解析C++编程中类的封装特性的使用技巧和注意事项,需要的朋友参考一下 共用接口和私有实现的分离 C++通过类来实现封装性,把数据和与这些数据有关的操作封装在一个类中,或者说,类的作用是把数据和算法封装在用户声明的抽象数据类型中。 实际上用户往往并不关心类的内部是如何实现的,而只需知道调用哪个函数会得到什么结果,能实现什么功能即可。 在声明了

  • 主要内容:1、public,2、private,3、protected,4、internal,5、protected internalC# 是一门面向对象编程语言,面向对象编程语言有三大特性,分别是封装、 继承和 多态。所谓封装就是将一个或多个项目(函数)集合在一个单元中,这个单元称之为类,我们可以根据需要通过访问权限修饰符来设定类中成员的范围和可见性。C# 中的访问权限修饰符有以下几种: public:公共的,所有对象都可以访问,但是需要引用命名空间; private:私有的,类的内部才可以访

  • 本文向大家介绍C#实现客户端弹出消息框封装类实例,包括了C#实现客户端弹出消息框封装类实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#实现客户端弹出消息框封装类。分享给大家供大家参考。具体如下: asp.net在服务器端运行,是不能在服务器端弹出对话框的,但是C#可以通过在页面输出JS代码实现弹出消息框的效果,这个C#类封装了常用的消息框弹出JS代码,可以在服务器端调用,在客户端显

  • 封装一个ADO.net,插入一条数据不能显示插入内容而是变量名 调用封装方法 封装的方法 设置断点后看到,形参已经拿到输入内容,但是变量始终没有赋值成功。

  • 本文向大家介绍php mysql 封装类实例代码,包括了php mysql 封装类实例代码的使用技巧和注意事项,需要的朋友参考一下 废话不多说了,具体代码如下所示: 以上所述是小编给大家介绍的php mysql 封装类实例代码,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的,在此也非常感谢大家对呐喊教程网站的支持!

  • 本文向大家介绍python写日志封装类实例,包括了python写日志封装类实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python实现写日志封装类。分享给大家供大家参考。具体如下: 将这段代码保存为 TLog,调用的时候先import TLog,然后TLog.writelog("jb51.net")即可 希望本文所述对大家的Python程序设计有所帮助。