源码中 用到的结构和未公开函数 请到 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的更多相关文章

  1. linux编程之内存映射

    一.概述                                                   内存映射是在调用进程的虚拟地址空间创建一个新的内存映射. 内存映射分为2种: 1.文件映射 ...

  2. VB.NET实现32位、64位远线程运行ASM,注入非托管、托管DLL

    这是一个老话题,远线程函数给我们提供了机会在其他进程中启动一个新线程,所以我们可以做很多事情.但事情远远没有结束,如果我们要做的事情非常复杂,那么将面临编写大量的ASM代码,虽然我们可以用VC之类的工 ...

  3. 《windows核心编程》 17章 内存映射文件

    内存映射文件主要用于以下三种情况: 系统使用内存映射文件载入并运行exe和dll,这大量节省了页交换文件的空间以及应用程序的启动时间 开发人员可以使用内存映射文件来访问磁盘上的数据文件.这使得我们可以 ...

  4. 内存映射文件MemoryMappedFile使用

    参考资料: http://blog.csdn.net/bitfan/article/details/4438458 所谓内存映射文件,其实就是在内存中开辟出一块存放数据的专用区域,这区域往往与硬盘上特 ...

  5. Java NIO内存映射---上G大文件处理(转)

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了java中内存映射的原理及过程,与传统IO进行了对比,最后,用实例说明了结果 ...

  6. [转载]linux内存映射mmap原理分析【转】

    转自:http://www.cnblogs.com/wanpengcoder/articles/5306688.html 转自:http://blog.csdn.net/yusiguyuan/arti ...

  7. .NET 4.0中使用内存映射文件实现进程通讯

    操作系统很早就开始使用内存映射文件(Memory Mapped File)来作为进程间的共享存储区,这是一种非常高效的进程通讯手段.Win32 API中也包含有创建内存映射文件的函数,然而,这些函数都 ...

  8. Linux驱动mmap内存映射

    mmap在linux哪里? 什么是mmap? 上图说了,mmap是操作这些设备的一种方法,所谓操作设备,比如IO端口(点亮一个LED).LCD控制器.磁盘控制器,实际上就是往设备的物理地址读写数据. ...

  9. C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 VC中进程与进程之间共享内存 .net环境下跨进程、高频率读写数据 使用C#开发Android应用之WebApp 分布式事务之消息补偿解决方案

    C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing). ...

随机推荐

  1. MySQL可视化管理工具 —— Navicat for MysSQL

    类似PL/SQL管理Oracle的工具 Navicat可以管理MySQL 1.安装 2.连接(输入IP.端口.用户名.密码) 3.新建sql语句:点击左侧database.点击菜单“查询”.点击“新建 ...

  2. python_Opencv_opencv2.4.4+python配置问题

    下载numpy-1.8.1-win32-superpack-python2.7.exe.下载地址微博微盘:http://vdisk.weibo.com/s/aJcp4pI6mYEXg 必须安装nump ...

  3. hdu2817 A sequence of numbers

    这题就是判断是等差数列还是等比数列,然后计算结果mod200907 因为数字比较大10的九次方 所以等比用到了快速幂求模 不懂可以看看算法导论,在大数那里有讲 #include <iostrea ...

  4. Mina学习之与Spring整合

    本章中演示在Spring中整合Mina,为了整合到Spring,需要做以下几个步骤: 1. 设置IoHandler <bean id="trapHandler" class= ...

  5. Matrix的set,pre,post调用顺序

    Matrix调用一系列set,pre,post方法时,可视为将这些方法插入到一个队列.当然,按照队列中从头至尾的顺序调用执行.其中pre表示在队头插入一个方法,post表示在队尾插入一个方法.而set ...

  6. [RxJS] Filtering operators: throttle and throttleTime

    Debounce is known to be a rate-limiting operator, but it's not the only one. This lessons introduces ...

  7. Java基础知识强化之集合框架笔记31:集合之泛型类的概述和基本使用

    1. 为什么会有泛型呢? (1)早期的Object类型可以接收任意的对象类型,但是在实际使用中,会有类型转换的问题,也存在这隐患,所以Java提供了泛型来解决这个安全问题. 2. 泛型类的使用: (1 ...

  8. iOS图片压缩

    项目中常会遇到,上传图片的操作,由于iPhone手机直接拍照的图片往往比较大,一般3-4M,如果直接上传不做处理会浪费用户很多流量,再者有很多场景并不需要高清图片,所以在上传图片前对图片进行压缩,是很 ...

  9. 完全卸载oracle

    今天在网上看到有位网友写的篇日志,感觉蛮好的,一般卸载oracle有4个地方需求注意:1)Services,2)software,3eventlog,4)path. 1.关闭 oracle 所有的服务 ...

  10. 那些年,我们一起学WCF--(6)PerCall实例行为

    当客户端调用服务器端服务后,服务器端就会为客户端生成一个实例,关于服务实例的分配问题,在WCF中有专门的属性进行设置,可以让所有客户端共享一个实例, 也可以让一个客户端可以拥有多个实例,也可以让一个实 ...