C++ 逆向笔记3 创建远程线程

#include <iostream>
#include <Windows.h>

void inJect(int pid,char* path)
{
    //返回进程的句柄 PROCESS_ALL_ACCESS:获得所有权限 pid:进程id 
    HANDLE mHandle=OpenProcess(PROCESS_ALL_ACCESS, false,pid);
    /**
   在虚拟空间中分配内存,返回基址
   HANDLE hProcess,
   LPVOID lpAddress, 该指针为要分配的页面区域指定所需的起始地址。NULl:该函数确定将区域分配到的位置
   SIZE_T dwSize,    要分配的内存区域的大小,以字节为单位
   DWORD  flAllocationType,MEM_COMMIT:为指定的保留内存页面分配内存费用(从内存的总大小和磁盘上的页面文件的总容量)。
   DWORD  flProtect, PAGE_READWRITE:启用对页面的提交区域的只读或读/写访问
   申请一块内存给dll路径
  */
    LPVOID rRternAddress=VirtualAllocEx(mHandle, NULL, strlen(path) + 1,MEM_COMMIT,PAGE_READWRITE);
    
    /**
     HANDLE  hProcess, 要修改的过程存储器的句柄
     LPVOID  lpBaseAddress,指向指定过程的基地址的指针,数据将写入该过程中
     LPCVOID lpBuffer,要写入的数据。
    SIZE_T  nSize, 要写入指定进程的字节数。
    SIZE_T  *lpNumberOfBytesWritten 指向变量的指针,该变量接收传输到指定进程中的字节数。
    */
    WriteProcessMemory(mHandle, rRternAddress,path,strlen(path)+1,NULL);
    //检索指定模块的模块句柄
    HMODULE mModule = GetModuleHandleA("kernel32.dll");
    //从指定的动态链接库(DLL)检索导出的函数或变量的地址。GetProcAddress:方法放回一个指向函数的指针。LoadLibraryA:将指定的模块加载到调用进程的地址空间中
    LPTHREAD_START_ROUTINE lptheradStart=(LPTHREAD_START_ROUTINE)GetProcAddress(mModule, "LoadLibraryA");
    //创建一个在另一个进程的虚拟地址空间中运行的线程。
    //远程线程注入技术:强制创建一个目标进程的线程,将DLL加载进去
    HANDLE hHANDLE=CreateRemoteThread(mHandle,NULL,0, lptheradStart, rRternAddress,0,NULL);
    //等待hHANDLE 2000,  INFINITE:一直等待
    WaitForSingleObject(hHANDLE,2000);

    /**
    所有Handle都要关闭
    防止内存泄露
    */
    CloseHandle(mHandle);
    CloseHandle(hHANDLE);
 
}
int main()
{
    //PID 进程id
    inJect(14828,(char*)"C:\\Users\\30302\\Desktop\\dllpath\\Dll1.dll");
    std::cout << "Hello World!\n";
    getchar();
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值