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 ebx
push 4
push 1
push 0
mov eax, 0x007C00B0
call eax
pop ebx
ret
}
}
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);
}