内存映射+远线程 调用游戏CALL
源码中 用到的结构和未公开函数 请到 http://www.cnblogs.com/IMyLife/p/4826286.html 获取 HANDLE ProcessHandle=NULL;
DWORD pPID=NULL;
DWORD TID=NULL;
HWND i = FindWindowW(NULL, L"游戏窗口名称");
TID=GetWindowThreadProcessId(i,&pPID);
ProcessHandle=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pPID);
/映射字节集到进程
DWORD MappingBytes(PVOID Address,DWORD BYTE_SIZE,WCHAR Nume[])
{
DWORD vaddress=NULL,size=NULL;
HANDLE hMap=CreateFileMappingW(INVALID_HANDLE_VALUE,NULL,PAGE_EXECUTE_READWRITE,NULL,BYTE_SIZE,Nume);
if(hMap!=NULL)
{
HANDLE pAddress=MapViewOfFile(hMap,FILE_MAP_ALL_ACCESS,NULL,NULL,NULL);
if(pAddress!=NULL)
{
RtlMoveMemory(pAddress,Address,BYTE_SIZE);
//映射字节集到目标进程
ZwMapViewOfSection(hMap,ProcessHandle,&vaddress,NULL,NULL,NULL,&size,,,PAGE_EXECUTE_READWRITE);
UnmapViewOfFile(pAddress);
return vaddress;
}
}
return ;
}
//获取HOOK函数的字节数量//记得HOOK函数最后加上 int 0 不然无法判断
DWORD GetFunctionLong(DWORD JMPAddress)
{
BYTE *p=(BYTE*)JMPAddress;
int i=;
while (TRUE)
{
if((DWORD)*p==)
{
return i;
}
p++;
i++;
}
return ;
}
//远程调用CALL函数主功能 //要调用的CALL,参数结构,结构大小 可实现任意个数参数调用(看下面怎么获取参数的) 只测试了DWORD类型参数
DWORD LoadCALL(DWORD* CALLAddress, DWORD* ParameterStruct, DWORD ParameterStruct_SIZE)
{
DWORD vaddress = NULL, size = NULL,lsbuff = ,lenght=,structbuff=;
lenght = GetFunctionLong((DWORD)CALLAddress);
HANDLE hMap = CreateFileMappingW(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, NULL, lenght, L"CALL");
if (hMap != NULL)
{
HANDLE pAddress = MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, NULL, NULL, NULL);
if (pAddress != NULL)
{
RtlMoveMemory(pAddress, CALLAddress, lenght);
//映射CALL字节集到目标进程
ZwMapViewOfSection(hMap, ProcessHandle, &vaddress, NULL, NULL, NULL, &size, , , );
//映射参数结构到目标进程
structbuff=MappingBytes((PVOID)ParameterStruct, ParameterStruct_SIZE, L"struct");
//修改内存页面保护属性
VirtualProtectEx(ProcessHandle, (LPVOID)vaddress, lenght, PAGE_EXECUTE_READWRITE, &lsbuff);
//创建远线程执行CALL
CreateRemoteThread(ProcessHandle, NULL, NULL, (LPTHREAD_START_ROUTINE)vaddress, (LPVOID)structbuff, NULL, NULL);
UnmapViewOfFile(pAddress);
return = vaddress;
}
}
return ;
} //调用远程CALL格式
/*
3 参数结构
4 typedef struct A
5 {
6 DWORD a1;
7 DWORD a2;
8 DWORD a3;
9 DWORD a4;
10 };
11 typedef struct A A1;
12 typedef A1 *A2;
13
14 要调用的CALL
15 void __declspec( naked ) ZwGoodsCALL()
16 {
17 _asm
18 {
19 MOV EAX, [ebp+8]
20 mov ebx,dword ptr ds : [eax] //取结构第一个参数 第二个+4 第三个+8依次加4
21 mov ecx,dword ptr ds : [eax+4]//获取第二个参数
22 retn
23 int 0// 结尾标识符 给获取函数长度函数做判断
24 }
25 }
26 调用方法
27 A2 pA2 = NULL;
28 pA2 = (A2)malloc(sizeof(A1));
29 pA2->a1 = 1;
30 pA2->a2 = 2;
31 pA2->a3 = 3;
32 pA2->a4 = 4;
33 LoadCALL((DWORD*)ZwGoodsCALL, (DWORD*)pA2, sizeof(A1));
34 */ //
内存映射+远线程 调用游戏CALL的更多相关文章
- linux编程之内存映射
一.概述 内存映射是在调用进程的虚拟地址空间创建一个新的内存映射. 内存映射分为2种: 1.文件映射 ...
- VB.NET实现32位、64位远线程运行ASM,注入非托管、托管DLL
这是一个老话题,远线程函数给我们提供了机会在其他进程中启动一个新线程,所以我们可以做很多事情.但事情远远没有结束,如果我们要做的事情非常复杂,那么将面临编写大量的ASM代码,虽然我们可以用VC之类的工 ...
- 《windows核心编程》 17章 内存映射文件
内存映射文件主要用于以下三种情况: 系统使用内存映射文件载入并运行exe和dll,这大量节省了页交换文件的空间以及应用程序的启动时间 开发人员可以使用内存映射文件来访问磁盘上的数据文件.这使得我们可以 ...
- 内存映射文件MemoryMappedFile使用
参考资料: http://blog.csdn.net/bitfan/article/details/4438458 所谓内存映射文件,其实就是在内存中开辟出一块存放数据的专用区域,这区域往往与硬盘上特 ...
- Java NIO内存映射---上G大文件处理(转)
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了java中内存映射的原理及过程,与传统IO进行了对比,最后,用实例说明了结果 ...
- [转载]linux内存映射mmap原理分析【转】
转自:http://www.cnblogs.com/wanpengcoder/articles/5306688.html 转自:http://blog.csdn.net/yusiguyuan/arti ...
- .NET 4.0中使用内存映射文件实现进程通讯
操作系统很早就开始使用内存映射文件(Memory Mapped File)来作为进程间的共享存储区,这是一种非常高效的进程通讯手段.Win32 API中也包含有创建内存映射文件的函数,然而,这些函数都 ...
- Linux驱动mmap内存映射
mmap在linux哪里? 什么是mmap? 上图说了,mmap是操作这些设备的一种方法,所谓操作设备,比如IO端口(点亮一个LED).LCD控制器.磁盘控制器,实际上就是往设备的物理地址读写数据. ...
- C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 VC中进程与进程之间共享内存 .net环境下跨进程、高频率读写数据 使用C#开发Android应用之WebApp 分布式事务之消息补偿解决方案
C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing). ...
随机推荐
- poj 1679 The Unique MST【次小生成树】
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 24034 Accepted: 8535 D ...
- cf493A
Description Vasya has started watching football games. He has learned that for some fouls the player ...
- WebView Cache 缓存清除
当我们加载Html时候,会在我们data/应用package下生成database与cache两个文件夹: 我们请求的Url记录是保存在webviewCache.db里,而url的内容是保存在webv ...
- 支持MySql的数据库自动分表工具DBShardTools发布
支持MySql的数据库自动分表工具DBShardTools发布 前段时间参与了公司的一个项目,这个项目的特点是数据量.访问量都比较大,考虑使用数据库水平分表策略,Google了大半天,竟然没有找到分表 ...
- linux 最大文件描述符fd
使用四种框架分别实现百万websocket常连接的服务器 著名的 C10K 问题提出的时候, 正是 2001 年.这篇文章可以说是高性能服务器开发的一个标志性文档,它讨论的就是单机为1万个连接提供服务 ...
- [CodeForce]358D Dima and Hares
有N<3000只宠物要喂,每次只能喂一只,每喂一只宠物,宠物的满足度取决于: 1 紧靠的两个邻居都没喂,a[i] 2 邻居中有一个喂过了,b[i] 3 两个邻居都喂过了,c[i] 把所有宠物喂一 ...
- Hadoop WritableComparable接口
WritableComparable接口 Writable接口大家可能都知道,它是一个实现了序列化协议的序列化对象.在Hadoop中定义一个结构化对象都要实现Writable接口,使得该结构化对象可以 ...
- windows和linux双系统删除linux
装了Windows和linux双系统的朋友,在后期要删除linux是个比较头痛的问题,因为MBR已经被linux接管,本文的目的是如何在windows 和linux双系统下,简单,完美地卸载linux ...
- Java源码中的发现:快速判断一个int值是几位数
判断一个int值是几位数,要是我自己实现,估计又会想到除法和模运算了,偶然在java标准API源码中发现的写法,很强大. public class Test { final static int[] ...
- 14、SQL Server 存储过程
SQL Server 存储过程 存储过程类似函数,可以重复使用.相对于函数,存储过程拥有更强大的功能和更高的灵活性. 存储过程中可以包含逻辑控制语句和数据操作语句,可以接受参数,输出参数,返回单个值或 ...