赞!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);}
- 赞!VC++编程创建远程线程式调用CALL_VirtualAllocEx_WriteProcessMemory_CreateRemoteThread_WaitForSingleObject
- 创建远程线程
- CreateRemoteThread创建远程线程
- 创建远程线程
- VC多线程编程之线程创建与示例
- VC多线程编程之线程创建与示例
- VC多线程编程之线程创建与示例
- VC创建线程
- vc 创建线程
- vc 线程创建关闭
- VC创建删除线程
- vc 线程创建关闭
- VC 线程创建对话框
- VC 创建线程
- vc 线程创建关闭
- VC创建子线程
- VC创建线程
- vc 线程创建关闭
- 167. Two Sum II - Input array is sorted [LeetCode]
- 算法提高 8皇后·改
- 运维自动化实践笔记
- HDU 4350 Card【规律】
- JuliaOpt Optimization packages for the Julia language
- 赞!VC++编程创建远程线程式调用CALL_VirtualAllocEx_WriteProcessMemory_CreateRemoteThread_WaitForSingleObject
- 为LWIP移植DM9000驱动
- mysql小记
- spring framework体系结构及内部各模块jar之间的maven依赖关系
- wikioi1052 地鼠游戏
- Warning: Link to vtkInteractionStyle for default style selection的解决办法
- wei.getA()
- 项目实战(连载):基于Angular2+Mongodb+Node技术实现的多用户博客系统教程(2)
- Webservice实践(五)基于CXF的服务端开发