赞!VC++编程创建远程线程式调用CALL_VirtualAllocEx_WriteProcessMemory_CreateRemoteThread_WaitForSingleObject

来源:互联网 发布:javascript 设置class 编辑:程序博客网 时间:2024/05/16 23:34

16!VC++编程创建远程线程式调用CALL

借箭源码:14.解密!远程CALL调用代码实现原理。

VirtualAllocEx 在指定进程里申请一块内存

LPVOID WINAPI VirtualAllocEx(

  __in      HANDLE hProcess, //进程句柄

  __in_opt  LPVOID lpAddress, //指定分配的内存地址 NULL 自动

  __in      SIZE_T dwSize, //分配内存大小

  __in      DWORD flAllocationType, //MEM_COMMIT |MEM_RESERVE

  __in      DWORD flProtect  //PAGE_EXECUTE_READWRITE  可读可写权限

);

MEM_COMMIT:为特定的页面区域分配内存中或磁盘的页面文件中的物理存储

MEM_RESERVE:保留进程的虚拟地址空间,而不分配任何物理存储。

返回的是 一块申请到的内存地址

WriteProcessMemory  向内存写入数据

BOOL WINAPI WriteProcessMemory(

  __in   HANDLE hProcess, //进程句柄

  __in   LPVOID lpBaseAddress,//要写入数据的内存地址

  __in   LPCVOID lpBuffer,//要写入的数据

  __in   SIZE_T nSize, //要写入的大小

  __out  SIZE_T *lpNumberOfBytesWritten //实际写入大小。NULL

);

写入成功返回 TRUE

CreateRemoteThread  创建远程线程

HANDLE WINAPI CreateRemoteThread(

  __in   HANDLE hProcess,   //进程句柄

  __in   LPSECURITY_ATTRIBUTES lpThreadAttributes,//安全结构指针 NULL

  __in   SIZE_T dwStackSize,  //无参数的CALL 填写0

  __in   LPTHREAD_START_ROUTINE lpStartAddress, //调用的CALL

  __in   LPVOID lpParameter, //传递参数的指针 NULL stdcall

  __in   DWORD dwCreationFlags, //0 线程创建后立即执行

  __out  LPDWORD lpThreadId  //输出一个 线程ID。&lpTId

);

返回值为null 创建进程失败

//VC以裸函数的形式内联汇编

__declspec(naked) void Fun()

{

 __asm

 {

  ....//汇编代码

 }

}

在函数名前声明__declspec(naked),表示以裸函数的形式内联汇编,裸函数是指编译器生成汇编代码时不添加任何额外的指令,对于一般的函数调用,编译器都会自动生成函数初始化代码,如压入和弹出

ebp指针,分配和清理局部变量等。

WaitForSingleObject   等待线程结束

DWORD WINAPI WaitForSingleObject(

  __in  HANDLE hHandle,  //线程句柄

  __in  DWORD dwMilliseconds  //INFINITE 无限-1

);

// #define INFINITE            0xFFFFFFFF  // Infinite timeout 无限超时

VirtualFreeEx 释放内存

BOOL WINAPI VirtualFreeEx(

  __in  HANDLE hProcess, //进程句柄

  __in  LPVOID lpAddress, //要释放的内存地址

  __in  SIZE_T dwSize, //释放内存大小

  __in  DWORD dwFreeType // MEM_RELEASE 释放指定页。这里填写这值,那么dwSize必须为0否则函数会调用失败。

);

CloseHandle 关闭句柄

BOOL WINAPI CloseHandle(

  __in  HANDLE hObject  //要关闭的句柄,进程句柄 or线程句柄等

);

mfc------------------------------------------------------------------

__declspec(naked) void beibaoyongwupincall(){__asm{push ebxpush 4push 1push 0mov eax, 0x007C00B0call eaxpop ebxret}}void chuangjianyuanchengxiancheng()//创建远程线程{SIZE_T xierudaxiao = 0;LPVOID calldizhi1 = ::VirtualAllocEx(jinchengjubing, NULL, 0x40900, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);if (calldizhi1 == NULL){AfxMessageBox(L"内存申请失败");}BOOL a = WriteProcessMemory(jinchengjubing, calldizhi1, beibaoyongwupincall, 0x40900, &xierudaxiao);if (a == 0){AfxMessageBox(L"数据写入失败");}DWORD id_xiancheng = 0;HANDLE xianchengjubing = ::CreateRemoteThread(jinchengjubing, NULL, 0, (LPTHREAD_START_ROUTINE)calldizhi1, NULL, 0, &id_xiancheng);//创建远程线程if (xianchengjubing==0){AfxMessageBox(_T("创建远程线程失败"));}WaitForSingleObject(xianchengjubing, INFINITE);VirtualFreeEx(jinchengjubing, calldizhi1, 0, MEM_RELEASE);}




0 0