第一个注入实例【远程注入DLL】

首先,编译时出现了这样一个问题,WTL的。。。
error C2504: “CUpdateUI”: 未定义基类
出现上面的情况时需要include <atlframe.h>头文件
另外在stdfax.h中加入对resource.h的引用吧,要不错误一堆。。。尼妈,不知道是不是VS出了问题。。。变傻了
 
下面开始写第一个注入程序,用远程注入DLL的模式:
要求:提供被注入的程序名(已经启动,或者未启动的文件路径),提供要注入的DLL路径
目标:实现DLL的注入与卸载。
 
知识点:
1,远程线程函数的运用
2,提权提取进程句柄
3,DLL的注入与卸载
 
 
。。。
 
//InjectDll.h

class InjectDll
{
public:
    InjectDll();
    ~InjectDll();

    VOID InjectByProcessName(LPCTSTR szProcessName, LPCWSTR szDllName);
    VOID InjectByPID(DWORD dwPID, LPCWSTR szDllPath);
};
 
//.cpp
#include "stdafx.h"
#include "InjectDll.h"
#include "tlhelp32.h"

InjectDll::InjectDll()
{
}


InjectDll::~InjectDll()
{
}

VOID InjectDll::InjectByProcessName(LPCTSTR szProcessName,LPCWSTR szDllPath)
{
    DWORD dwPID = 0xFFFFFFFF;
    HANDLE hSnapShot = INVALID_HANDLE_VALUE;
    PROCESSENTRY32 pe;

    // Get the snapshot of the system
    pe.dwSize = sizeof(PROCESSENTRY32);
    hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);

    // find process
    Process32First(hSnapShot, &pe);
    do
    {
        if (!_tcsicmp(szProcessName, (LPCTSTR)pe.szExeFile))
        {
            dwPID = pe.th32ProcessID;
            InjectByPID(dwPID, szDllPath);
        }
    } while (Process32Next(hSnapShot, &pe));

    CloseHandle(hSnapShot);
}


VOID InjectDll::InjectByPID(DWORD dwPID, LPCWSTR szDllPath)
{
    HANDLE hProcess = NULL, hThread = NULL;
    HMODULE hMod = NULL;
    LPVOID pRemoteBuf = NULL;
    DWORD dwBufSize = (DWORD)(_tcslen(szDllPath) + 1) * sizeof(TCHAR);

    /*查找该进程下有没有加载该DLL模块*/
    BOOL bMore = FALSE;
    HANDLE hSnapshot;
    HMODULE hModule = NULL;
    MODULEENTRY32 me = { sizeof(me) };
    LPTHREAD_START_ROUTINE pThreadProc;
    wchar_t szDllName[32] = { 0 };

    wcscpy_s(szDllName, wcsrchr(szDllPath, '\\')+1);
    hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID);

    bMore = Module32First(hSnapshot, &me);
    for (; bMore; bMore = Module32Next(hSnapshot, &me))
    {
        if (!_tcsicmp((LPCTSTR)me.szModule, szDllName) ||
            !_tcsicmp((LPCTSTR)me.szExePath, szDllName))
        {
            //如果已经加载,则退出。
            return;
        }
    }
    /*   查找完毕        */
    // 根据进程ID取得进程句柄
    if (!(hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID)))
    {
        wchar_t buf[MAXBYTE] = { 0 };
        wsprintf(buf,L"OpenProcess(%d) failed!!! [%d]\n", dwPID, GetLastError());
        OutputDebugString(buf);
        return ;
    }

    // 在目标进程内开辟空间
    pRemoteBuf = VirtualAllocEx(hProcess, NULL, dwBufSize, MEM_COMMIT, PAGE_READWRITE);

    // 将DLL路径写入开辟的内存内
    WriteProcessMemory(hProcess, pRemoteBuf, (LPVOID)szDllPath, dwBufSize, NULL);

    //取LoadLibraryW的地址
    hMod = GetModuleHandle(L"kernel32.dll");
    pThreadProc = (LPTHREAD_START_ROUTINE)GetProcAddress(hMod, "LoadLibraryW");

    //在目标程序内调用loadlibrary加载DLL
    hThread = CreateRemoteThread(hProcess, NULL, 0, pThreadProc, pRemoteBuf, 0, NULL);
    WaitForSingleObject(hThread, INFINITE);

    CloseHandle(hThread);
    CloseHandle(hProcess);
}

//////////////////////下面是卸载
 
#include "stdafx.h"
#include "EjectDll.h"
#include "tlhelp32.h"

EjectDll::EjectDll()
{
}


EjectDll::~EjectDll()
{
}

VOID EjectDll::EjectByProcessName(LPCTSTR szProcessName, LPCWSTR szDllPath)
{
    DWORD dwPID = 0xFFFFFFFF;
    HANDLE hSnapShot = INVALID_HANDLE_VALUE;
    PROCESSENTRY32 pe;

    // Get the snapshot of the system
    pe.dwSize = sizeof(PROCESSENTRY32);
    hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);

    // find process
    Process32First(hSnapShot, &pe);
    do
    {
        if (!_tcsicmp(szProcessName, (LPCTSTR)pe.szExeFile))
        {
            dwPID = pe.th32ProcessID;
            EjectByPID(dwPID, szDllPath);
        }
    } while (Process32Next(hSnapShot, &pe));

    CloseHandle(hSnapShot);
}


BOOL EjectDll::EjectByPID(DWORD dwPID, LPCWSTR szDllPath)
{

    BOOL bMore = FALSE, bFound = FALSE;
    HANDLE hSnapshot, hProcess, hThread;
    HMODULE hModule = NULL;
    MODULEENTRY32 me = { sizeof(me) };
    LPTHREAD_START_ROUTINE pThreadProc;

    wchar_t szDllName[32] = { 0 };

    wcscpy_s(szDllName, wcsrchr(szDllPath, '\\') + 1);

    hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID);

    bMore = Module32First(hSnapshot, &me);
    for (; bMore; bMore = Module32Next(hSnapshot, &me))
    {
        if (!_tcsicmp((LPCTSTR)me.szModule, szDllName) ||
            !_tcsicmp((LPCTSTR)me.szExePath, szDllName))
        {
            bFound = TRUE;
            break;
        }
    }

    if (!bFound)
    {
        CloseHandle(hSnapshot);
        return FALSE;
    }

    if (!(hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID)))
    {
        _tprintf(L"OpenProcess(%d) failed!!! [%d]\n", dwPID, GetLastError());
        return FALSE;
    }

    hModule = GetModuleHandle(L"kernel32.dll");
    pThreadProc = (LPTHREAD_START_ROUTINE)GetProcAddress(hModule, "FreeLibrary");
    hThread = CreateRemoteThread(hProcess, NULL, 0,
        pThreadProc, me.modBaseAddr,
        0, NULL);
    WaitForSingleObject(hThread, INFINITE);

    CloseHandle(hThread);
    CloseHandle(hProcess);
    CloseHandle(hSnapshot);

    return TRUE;
}

 
 
////////////////////提权代码
 
BOOL SetPrivilege(LPCTSTR lpszPrivilege, BOOL bEnablePrivilege)
{
    TOKEN_PRIVILEGES tp;
    HANDLE hToken;
    LUID luid;

    if (!OpenProcessToken(GetCurrentProcess(),
        TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
        &hToken))
    {
        _tprintf(L"OpenProcessToken error: %u\n", GetLastError());
        return FALSE;
    }

    if (!LookupPrivilegeValue(NULL,           // lookup privilege on local system
        lpszPrivilege,  // privilege to lookup
        &luid))        // receives LUID of privilege
    {
        _tprintf(L"LookupPrivilegeValue error: %u\n", GetLastError());
        return FALSE;
    }

    tp.PrivilegeCount = 1;
    tp.Privileges[0].Luid = luid;
    if (bEnablePrivilege)
        tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    else
        tp.Privileges[0].Attributes = 0;

    // Enable the privilege or disable all privileges.
    if (!AdjustTokenPrivileges(hToken,
        FALSE,
        &tp,
        sizeof(TOKEN_PRIVILEGES),
        (PTOKEN_PRIVILEGES)NULL,
        (PDWORD)NULL))
    {
        _tprintf(L"AdjustTokenPrivileges error: %u\n", GetLastError());
        return FALSE;
    }

    if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
    {
        _tprintf(L"The token does not have the specified privilege. \n");
        return FALSE;
    }

    return TRUE;
}

 
/////////////////////////////////////在主程序开始处调用一次就成
SetPrivilege(SE_DEBUG_NAME, TRUE);//提权
 
posted @ 2015-05-13 22:43  笔直的一道弯  阅读(382)  评论(0编辑  收藏  举报