内存映射+远线程 调用游戏CALL

  1 源码中 用到的结构和未公开函数 请到 http://www.cnblogs.com/IMyLife/p/4826286.html 获取
  2
  3 HANDLE ProcessHandle=NULL;
  4 DWORD pPID=NULL;
  5 DWORD TID=NULL;
  6 HWND i = FindWindowW(NULL, L"游戏窗口名称");
  7 TID=GetWindowThreadProcessId(i,&pPID);
  8 ProcessHandle=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pPID);
  9 /映射字节集到进程
 10 DWORD MappingBytes(PVOID Address,DWORD BYTE_SIZE,WCHAR Nume[])
 11 {
 12     DWORD vaddress=NULL,size=NULL;
 13     HANDLE hMap=CreateFileMappingW(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,NULL,BYTE_SIZE,Nume);
 14     if(hMap!=NULL)
 15     {
 16         HANDLE pAddress=MapViewOfFile(hMap,FILE_MAP_ALL_ACCESS,NULL,NULL,NULL);
 17         if(pAddress!=NULL)
 18         {
 19             RtlMoveMemory(pAddress,Address,BYTE_SIZE);
 20             //映射字节集到目标进程
 21             ZwMapViewOfSection(hMap,ProcessHandle,&vaddress,NULL,NULL,NULL,&size,1,0,4);
 22             UnmapViewOfFile(pAddress);
 23             return vaddress;
 24         }
 25     }
 26     return 0;
 27 }
 28 //获取HOOK函数的字节数量//记得HOOK函数最后加上 int 0 不然无法判断
 29 DWORD GetFunctionLong(DWORD JMPAddress)
 30 {
 31     BYTE *p=(BYTE*)JMPAddress;
 32     int i=0;
 33     while (TRUE)
 34     {
 35         if((DWORD)*p==205)
 36         {
 37             return i;
 38         }
 39         p++;
 40         i++;
 41     }
 42     return 0;
 43 }
 44 //远程调用CALL函数主功能
 45
 46
 47
 48 //要调用的CALL,参数结构,结构大小    可实现任意个数参数调用(看下面怎么获取参数的) 只测试了DWORD类型参数
 49 DWORD LoadCALL(DWORD* CALLAddress, DWORD* ParameterStruct, DWORD ParameterStruct_SIZE)
 50 {
 51     DWORD vaddress = NULL, size = NULL,lsbuff = 0,lenght=0,structbuff=0;
 52     lenght = GetFunctionLong((DWORD)CALLAddress);
 53     HANDLE hMap = CreateFileMappingW(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, NULL, lenght, L"CALL");
 54     if (hMap != NULL)
 55     {
 56         HANDLE pAddress = MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, NULL, NULL, NULL);
 57         if (pAddress != NULL)
 58         {
 59             RtlMoveMemory(pAddress, CALLAddress, lenght);
 60             //映射CALL字节集到目标进程
 61             ZwMapViewOfSection(hMap, ProcessHandle, &vaddress, NULL, NULL, NULL, &size, 1, 0, 4);
 62             //映射参数结构到目标进程
 63             structbuff=MappingBytes((PVOID)ParameterStruct, ParameterStruct_SIZE, L"struct");
 64             //修改内存页面保护属性
 65             VirtualProtectEx(ProcessHandle, (LPVOID)vaddress, lenght, PAGE_EXECUTE_READWRITE, &lsbuff);
 66             //创建远线程执行CALL
 67             CreateRemoteThread(ProcessHandle, NULL, NULL, (LPTHREAD_START_ROUTINE)vaddress, (LPVOID)structbuff, NULL, NULL);
 68             UnmapViewOfFile(pAddress);
 69             return = vaddress;
 70         }
 71     }
 72     return 0;
 73 }
 74
 75
 76  1 //调用远程CALL格式
 77  2 /*
 78  3 参数结构
 79  4 typedef struct A
 80  5 {
 81  6 DWORD a1;
 82  7 DWORD a2;
 83  8 DWORD a3;
 84  9 DWORD a4;
 85 10 };
 86 11 typedef struct A A1;
 87 12 typedef A1 *A2;
 88 13
 89 14 要调用的CALL
 90 15 void __declspec( naked ) ZwGoodsCALL()
 91 16 {
 92 17 _asm
 93 18 {
 94 19 MOV EAX, [ebp+8]
 95 20 mov ebx,dword ptr ds : [eax] //取结构第一个参数 第二个+4 第三个+8依次加4
 96 21 mov ecx,dword ptr ds : [eax+4]//获取第二个参数
 97 22 retn
 98 23 int 0// 结尾标识符 给获取函数长度函数做判断
 99 24 }
100 25 }
101 26 调用方法
102 27 A2 pA2 = NULL;
103 28 pA2 = (A2)malloc(sizeof(A1));
104 29 pA2->a1 = 1;
105 30 pA2->a2 = 2;
106 31 pA2->a3 = 3;
107 32 pA2->a4 = 4;
108 33 LoadCALL((DWORD*)ZwGoodsCALL, (DWORD*)pA2, sizeof(A1));
109 34 */ //
时间: 2024-10-24 02:07:07

内存映射+远线程 调用游戏CALL的相关文章

Java NIO内存映射---上G大文件处理

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了java中内存映射的原理及过程,与传统IO进行了对比,最后,用实例说明了结果. 一.java中的内存映射IO和内存映射文件是什么? 内存映射文件非常特别,它允许Java程序直接从内存中读取文件内容,通过将整个或部分文件映射到内存,由操作系统来处理加载请求和写入文件,应用只需要和内存打交道,这使得IO操作非常快.加载内存映射文件所使用的内存在Java堆区之外.Java编程语言

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

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了java中内存映射的原理及过程,与传统IO进行了对比,最后,用实例说明了结果. 一.java中的内存映射IO和内存映射文件是什么? 内存映射文件非常特别,它允许Java程序直接从内存中读取文件内容,通过将整个或部分文件映射到内存,由操作系统来处理加载请求和写入文件,应用只需要和内存打交道,这使得IO操作非常快.加载内存映射文件所使用的内存在Java堆区之外.Java编程语言

内存映射文件MemoryMappedFile使用

参考资料: http://blog.csdn.net/bitfan/article/details/4438458 所谓内存映射文件,其实就是在内存中开辟出一块存放数据的专用区域,这区域往往与硬盘上特定的文件相对应.进程将这块内存区域映射到自己的地址空间中,访问它就象是访问普通的内存一样. 在.NET中,使用MemoryMappedFile对象表示一个内存映射文件,通过它的CreateFromFile()方法根据磁盘现有文件创建内存映射文件,调用这一方法需要提供一个与磁盘现有文件相对应的File

内存映射实现进程通讯

unit FileMap; interface uses  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,  StdCtrls, Dialogs; type  //定义TFileMap类  TFileMap = class(TComponent)  private    FMapHandle: THandle; //内存映射文件句柄    FMutexHandle: THandle; //互斥句柄    FMapN

VC++ 中使用内存映射文件处理大文件

摘要: 本文给出了一种方便实用的解决大文件的读取.存储等处理的方法,并结合相关程序代码对具体的实现过程进行了介绍. 引言 文件操作是应用程序最为基本的功能之一,Win32 API和MFC均提供有支持文件处理的函数和类,常用的有Win32 API的CreateFile().WriteFile().ReadFile()和MFC提供的CFile类等.一般来说,以上这些函数可以满足大多数场合的要求,但是对于某些特殊应用领域所需要的动辄几十GB.几百GB.乃至几TB的海量存储,再以通常的文件处理方法进行处

内存映射

http://www.cnblogs.com/mahaikai/p/6025512.html 在多任务操作系统中,每个进程都运行在属于自己的内存沙盘中.这个沙盘就是虚拟地址空间(Virtual Address Space),在32位模式下它是一个4GB的内存地址块.在Linux系统中, 内核进程和用户进程所占的虚拟内存比例是1:3,而Windows系统为2:2(通过设置Large-Address-Aware Executables标志也可为1:3).这并不意味着内核使用那么多物理内存,仅表示它可

笔记:I/O流-内存映射文件

内存映射文件时利用虚拟内存实现来将一个文件或者文件的一部分映射到内存中,然后整个文件就可以当作数组一样的访问,这个比传统的文件操作要快得多,Java 使用内存映射文件首先需要从文件中获取一个channel(通道),通道时磁盘文件的一个抽象,他使得我们可以访问诸如内存映射.文件加锁机制以及文件间快速数据传递等操作系统特性,然后通过调用 FileChannel 类的 map 方法从这个通道获取一个映射块(ByteBuffer),然后就可以读取/写入文件块内容,map 支持的模式有如下: FileCh

内存映射文件原理探索

首先说说这篇文章要解决什么问题? 1.虚拟内存与内存映射文件的区别与联系. 2.内存映射文件的原理. 3.内存映射文件的效率. 4.传统IO和内存映射效率对比. 虚拟内存与内存映射文件的区别与联系 二者的联系 虚拟内存和内存映射文件都是将一部分内容加载到,另一部分放在磁盘上的一种机制,二者都是应用程序动态性的基础,由于二者的虚拟性,对于用户都是透明的. 虚拟内存其实就是硬盘的一部分,是计算机RAM与硬盘的数据交换区,因为实际的物理内存可能远小于进程的地址空间,这就需要把内存中暂时不用到的数据放到

Linux进程间通信--内存映射

一  内存映射概述 从原理上讲,Linux系统利用已有的存储管理机制可以很自然的实现进程间的共享存储.对于一段物理存储空间,只需通过进程的虚存管理机构就可以映射到各自的3G用户地址空间中.通过这种映射,在不同进程看来"私有"的数据事实上是同一段内存单元,它们被这些不同的进程所共享. 在Linux系统实际运行时,内存中的页面要经常被换入或换出,共享存储区中的页面也不例外.一般而言,内存页面的换入/换出过程采用两种方式进行: 1. 普通页面因长时间未得到访问而被内核线程kswaps在系统空