注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

从C开始

 
 
 

日志

 
 

Hook 远程线程  

2010-10-27 21:38:10|  分类: SDK编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
#include <windows.h>
#include <string.h>
#include <Tlhelp32.h>
#include <iostream>
using namespace std;

class InjectionRemoteThread
{
public:
    InjectionRemoteThread(const char *FileName,const char *DllName);
    DWORD GetProcessID();             //获取目标进程pid
    DWORD OpenRemoteProcess();        //打开远程进程
    DWORD InjectionRemoteProcess();   //注入远程线程
    DWORD FreeRemoteProcess();        //释放远程线程
protected:
    HANDLE hProcess;                  //进程句柄
    char m_FileName[MAX_PATH];        //进程名
    char m_DllName[MAX_PATH];         //注入的DLL文件名
    DWORD m_Size;                     //DLL路径名长度
};
InjectionRemoteThread::InjectionRemoteThread(const char *FileName,const char *DllName){
    strncpy(m_FileName,FileName,MAX_PATH);
    strncpy(m_DllName,DllName,MAX_PATH);
    m_Size=(strlen(m_DllName)+1);
}
//获取目标进程pid
DWORD InjectionRemoteThread::GetProcessID()  
{
    HANDLE myhProcess;
    PROCESSENTRY32 mype;
    BOOL mybRet;
    //进行进程快照
    myhProcess=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //TH32CS_SNAPPROCESS快照所有进程
    //开始进程查找
    mybRet=Process32First(myhProcess,&mype);
    //循环比较,得出ProcessID
    while(mybRet)
    {
        if(strcmp(m_FileName,mype.szExeFile)==0)
            return mype.th32ProcessID;
        else
            mybRet=Process32Next(myhProcess,&mype);
    }
    return 0;
}
 //打开远程进程
DWORD InjectionRemoteThread::OpenRemoteProcess(){   
    //打开目标进程获得进程句柄
    hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,GetProcessID());
    if(!hProcess){
        cout<<"打开进程失败"<<endl;
        return 1;
    }
    return 0;
}
//注入远程进程    
DWORD InjectionRemoteThread::InjectionRemoteProcess(){     
    //打开进程
    OpenRemoteProcess();
    //分配内存空间
    LPVOID lpRemoteDllName=::VirtualAllocEx(hProcess,NULL,m_Size,MEM_COMMIT,PAGE_READWRITE);
    //将DLL路径名拷贝到已分配的内存空间中
    ::WriteProcessMemory(hProcess,lpRemoteDllName,(LPVOID)m_DllName,m_Size,NULL);
    //取得LoadLibraryA函数地址
    LPVOID StartRoutine=LoadLibraryA;
    
    //启动远程线程
    HANDLE hRemoteThread=::CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)StartRoutine,lpRemoteDllName,0,NULL);
    //如果启动注入失败退出
    if(hRemoteThread==NULL){
        cout<<"启动注入失败"<<endl;
        ::CloseHandle(hProcess);
        return 1;
    }
    //等待目标线程结束
    ::WaitForSingleObject(hRemoteThread,INFINITE);
    //释放空间关闭句柄
    ::VirtualFreeEx(hProcess,lpRemoteDllName,m_Size,MEM_DECOMMIT);
    ::CloseHandle(hRemoteThread);
    ::CloseHandle(hProcess);
    return 0;
}
//释放注入线程
DWORD InjectionRemoteThread::FreeRemoteProcess(){
    //打开进程
    OpenRemoteProcess();
    //分配内存空间
    LPVOID lpRemoteDllName=::VirtualAllocEx(hProcess,NULL,8,MEM_COMMIT,PAGE_READWRITE);
    //将DLL路径名拷贝到已分配的内存空间中
    ::WriteProcessMemory(hProcess,lpRemoteDllName,(LPVOID)m_DllName,8,NULL);
    //取得GetModuleHandleA函数地址
    LPVOID StartRoutine=GetModuleHandleA;
    //启动远程线程
    HANDLE hRemoteThread=::CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)StartRoutine,lpRemoteDllName,0,NULL);
    //如果启动注入失败退出
    if(hRemoteThread==NULL){
        cout<<"启动注入失败"<<endl;
        ::CloseHandle(hProcess);
        return 1;
    }
    DWORD dwHandle;
    //等待目标线程结束
    ::WaitForSingleObject(hRemoteThread,INFINITE);
    //释放空间关闭句柄
    ::GetExitCodeThread(hRemoteThread, &dwHandle);
    ::VirtualFreeEx(hProcess,lpRemoteDllName,m_Size,MEM_DECOMMIT);
    ::CloseHandle(hRemoteThread);
    // 使目标进程调用FreeLibrary,卸载DLL
    StartRoutine=FreeLibrary;
    // 等待FreeLibrary卸载完毕
    hRemoteThread=::CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)StartRoutine,(LPVOID)dwHandle,0,NULL);
    ::WaitForSingleObject(hRemoteThread,INFINITE);
    ::CloseHandle(hRemoteThread);
    ::CloseHandle(hProcess);
    return 0;
}
int main(){
    //构造函数重载
    InjectionRemoteThread myIRT("未命名2.exe","C:\\Users\\Mzf\\Documents\\C-Free\\Temp\\FUCK.dll");
    //远程注入线程
    myIRT.InjectionRemoteProcess();
    //远程卸载线程
    myIRT.FreeRemoteProcess();  
    //返回最后一个错误
    cout<<GetLastError()<<endl;
    return 0;
}
  评论这张
 
阅读(749)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018