C++黑客编程揭秘与防范之利用修改内存的方式实现进程注入

头文件ILHook.h

/********************************************************************	
	purpose:	利用修改内存的方式来实现进程注入
*********************************************************************/

#pragma once
#include <Windows.h>
class CILHook
{
public:
    CILHook(void);
    ~CILHook(void);

    BOOL Hook(LPSTR pszModuleName, LPSTR pszFunName, PROC procFun);
    void UnHook();
    BOOL ReHook();

    PROC m_pfnOld;
    BYTE m_bOld[5];
    BYTE m_bNew[5];
};


源文件ILHook.cpp

#include "StdAfx.h"
#include "ILHook.h"

CILHook::CILHook(void)
{
    m_pfnOld = NULL;
    ZeroMemory(m_bNew, 5);
    ZeroMemory(m_bOld, 5);

}

CILHook::~CILHook(void)
{
    UnHook();
}

BOOL CILHook::Hook( LPSTR pszModuleName, LPSTR pszFunName, PROC procFun )
{
    BOOL bRet = FALSE;
    m_pfnOld = (PROC)GetProcAddress(GetModuleHandle(pszModuleName), pszFunName);
    if (m_pfnOld != NULL)
    {
        //保证旧的数据
        DWORD dwNum(0);
        ReadProcessMemory(GetCurrentProcess(), m_pfnOld, m_bOld, 5, &dwNum);

        //构造JMP指令, 39是JMP指令的机器码
        m_bNew[0] = '\xe9';

        //修改目标函数的入口地址
        *(DWORD*)(m_bNew+1) = DWORD(procFun) - DWORD(m_pfnOld) - 5;
        WriteProcessMemory(GetCurrentProcess(), m_pfnOld, m_bNew, 5, &dwNum);
        bRet = TRUE;

    }
    return bRet;
}

void CILHook::UnHook()
{
    if (m_pfnOld != NULL)
    {
        DWORD dwNum(0);
        WriteProcessMemory(GetCurrentProcess(), m_pfnOld, m_bOld, 5, &dwNum);
    }

}

BOOL CILHook::ReHook()
{

    if (m_pfnOld != NULL)
    {
        DWORD dwNum(0);
        WriteProcessMemory(GetCurrentProcess(), m_pfnOld, m_bNew, 5, &dwNum);
        return  TRUE;    
    }

    return FALSE;
}


测试文件

#include "StdAfx.h"
#include "MainHook.h"

CILHook MsgHook;


int WINAPI myMessageBoxA(HWND hwnd,
                         LPCTSTR lpText,
                         LPCTSTR lpCaption, 
                         UINT uType)
{
    MsgHook.UnHook();
    MessageBox(hwnd, "hook", lpCaption, uType);
    //MessageBox(hwnd, lpText, lpCaption, uType);
    MsgHook.ReHook();
    return IDOK;
}


void testHook()
{
    MessageBox(NULL, "test", "information", MB_YESNO);

    MsgHook.Hook("User32.dll", "MessageBoxA", (PROC)myMessageBoxA);
    MessageBox(NULL, "test", "information", MB_OK);
    MsgHook.UnHook();

    MessageBox(NULL, "test", "information", MB_OK);

}


 

 

进程注入自己的dll 带有测试dll 路径和要注入的程序可以自己改 hRemoteProcess=OpenProcess(PROCESS_CREATE_THREAD| //允许远程创建线程 PROCESS_VM_OPERATION | //VM操作 PROCESS_VM_WRITE , //允许写 FALSE,dwProcessID); if(!hRemoteProcess) AfxMessageBox(L"无法打开目标进程"); // KillTimer(m_ntime); //计算DLL路径需要多大内存 int cb=(1+lstrlenW(pszLibFile))*sizeof(WCHAR); //使用VirtualAllocEx函数在远程进程内存地址空间分配DLL文件名缓冲区 pszLibFileRemote=(PWSTR)VirtualAllocEx(hRemoteProcess,NULL,cb,MEM_COMMIT,PAGE_READWRITE); if(pszLibFileRemote==NULL) { AfxMessageBox(L"建立内存失败"); CloseHandle(hRemoteProcess); return; } //使用WriteProcessMemory函数将DLL的路径名复制到远程进程内存空间 BOOL iReturnCode=WriteProcessMemory (hRemoteProcess,pszLibFileRemote,(PVOID)pszLibFile,cb,NULL); if(!iReturnCode) { AfxMessageBox(L"写入错误"); VirtualFreeEx(hRemoteProcess,NULL,0,MEM_RELEASE); CloseHandle(hRemoteThread); CloseHandle(hRemoteProcess); return; } //计算loadlibraryW入口地址 HMODULE hModule=LoadLibrary(L"C:\\WINDOWS\\system32\\kernel32"); PTHREAD_START_ROUTINE pfnStartAddr=( PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("Kernel32")),"LoadLibraryW"); hRemoteThread=CreateRemoteThread(hRemoteProcess,NULL,0,pfnStartAddr,pszLibFileRemote,0,NULL); if(hRemoteThread==NULL) { //等待线程结束 WaitForSingleObject(hRemoteThread,INFINITE); DWORD RetV; if(GetExitCodeThread(hRemoteThread,&RetV)) CloseHandle(hRemoteThread);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值