类似于金山游戏修改器我要对一个进程进行内存扫描找到我要找的值的内存地址。。然后修改这个内存地址中值我应该在一个什么范围内搜索呢再有是不是所有程序中的整数数字都是DWORD型的呢如果比这个小,是不是应该搜索的字长要改啊。希望高人提供思路。。或者具体文献。。谢谢了

解决方案 »

  1.   

    先给你源程序,等一分再解释:
    http://www.dssz.com/45114.html
    内存修改器
      

  2.   

    类似金山游侠的游戏内存修改器
    http://down.csdn.net/source/1303686
    这个更好一点。
      

  3.   

    Windows2K/XP/2003 是一个完全保护的系统,工作于CPU的保护模式下,引入了虚存技术。每个进程拥有独立的4GB的地址空间,其中低的2GB为进程的私有空间,高的2GB为系统空间的映射(如果在Boot.ini文件中使用“/3GB”的开关可以使进程的私有空间增大到3GB,系统空间1GB)。对于每个进程来讲其虚拟的地址空间是连续的,实际上它们是以页面为单位离散的存在于物理内存中,一些可能被交换到硬盘上的页面文件中,而且还有大部分的空间是未提交(Uncommitted)的。因此在Windows2000中对进程的用户空间进行扫描必须依次对每个进程的空间进行扫描。一个进程的低2GB有空间的分布如下表:范围                         大小                   作用
     
    0x0~~0xFFFF             64KB                不可访问区域,只是用来防止非法的指针访问,访问该范围的地址会导致访问违例。
    0x10000~~0x7FFEFFFF     2GB 减去至少192KB    进程的私有地址空间
    0x7FFDE000~~0x7FFDEFFF  4KB                 进程中第一个线程的线程环境块,即TEB(Thread environment block)
    0x7FFDF000~~0x7FFDFFFF  4KB                 进程的进程环境块,即PEB(Process environment block)
    0x7FFE0000~~0x7FFE0FFF  4KB                  一个共享的只读用户数据块,该块映射到到系统空间的一个数据块,其中存放的是一些系统信息如系统时间、时钟的滴答数、系统版本号等。这样访问这些信息的时候系统就不用切换到核心模式。
    0x7FFE1000~~0x7FFEFFFF  60KB                不可访问 
    0x7FFF0000~~0x7FFFFFFF  64KB                不可访问,用于防止线程的缓冲跨越两种模式空间的边界从上表可以看出,我们要扫描范围的起点和终点不是从0~~2GB,而只是其中的一部分。要得到这个起点和终点可以使用API函数GetSystemInfo,函数的原型如下:
    VOID GetSystemInfo(
      LPSYSTEM_INFO lpSystemInfo  // system information
    );
       而在结构SYSTEM_INFO中有两个域:lpMinimumApplicationAddress和 lpMaximumApplicationAddress(类型都是LPVOID) 中,我们就可以得到一个应用程序可用的最小和最大的地址空间。这样我们就得到了要扫描的地址的起点和终点。那么是不是这起点和终点间所有的地址都要扫描呢?并不是这样的,因为一般情况下一个进程是用不着这么大(接近2GB)的地址空间的。因此一个进程的大部分地址空间都是未用(Free)或是保留(Reserved)的,真正用到的只是那些已提交(Committed)的内存而已。
         内存页面可以有三种状态:未用(Free)、保留(Reserved)和提交(Committed)。一个未用的页面是指该页面未被保留或是提交,对一个进程来讲一个未用的页面是不可访问的,访问这样的页面将导致访问违例。进程可以要求系统保留一些页面以备后用,系统返回一段保留的地址给进程,但是这些地址同样是不可访问的,进程若想使用这段地址空间,使用必须先提交。只有一个提交的页面才是一个真正可以访问的页面。不过你提交了一个页面,系统并不会马上分配物理页面,只有在该页面第一次被访问到时,系统才会分配页面并初始化。另外,这三个状态的两两之间都是可以相互转化的。相关的API函数有VirtualAlloc、VirtualAllocEx、VirtualFree、VirtualFreeEx等.
    这样我们的工作已大大减少了,只需要扫描那些提交的页面就好了。接下来要做的就是得到一个进程的已提交的页面范围。这就要用到另外两个API函数VirtualQuery和VirtualQueryEx。两个函数的功能相似,不同就是VirtualQuery只是查询本进程而VirtualQueryEx可以查询指定进程的内存空间信息,后者正是我们所需要的,函数原型如下:
    DWORD VirtualQueryEx(
        HANDLE hProcess,                     // handle to process
        LPCVOID lpAddress,                   // address of region
        PMEMORY_BASIC_INFORMATION lpBuffer,  // information buffer
        SIZE_T dwLength                      // size of buffer
    );
    第一个参数是进程的句柄;第二个参数是内存地址指针;第三个参数是指向MEMORY_BASIC_INFORMATION结构的指针,用于返回内存空间的信息;第四个参数是lpBuffer的长度。再来看一下结构MEMORY_BASIC_INFORMATION的声明:
    typedef struct _MEMORY_BASIC_INFORMATION {
         PVOID BaseAddress; 
         PVOID AllocationBase; 
         DWORD AllocationProtect; 
         SIZE_T RegionSize; 
         DWORD State; 
         DWORD Protect; 
         DWORD Type; 
    } MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION; 
        第一个参数是查询内存块的基地址;第二个参数指的是用VirtualAlloc分配该内存时实际分配的基地址,可以小于BaseAddress,也就是说BaseAddress一定包含在AllocationBase分配的范围内;第三个参数指的是分配该页面时,页面的一些属性,如PAGE_READWRITE、PAGE_EXECUTE等(其它属性可参考Platform SDK);第四个参数指的是从BaseAddress开始,具有相同属性的页面的大小。第五参数指的是页面的状态,有三种可能值:MEM_COMMIT、MEM_FREE和MEM_RESERVE,这个参数对我们来说是最重要的了,从中我们便可知指定内存页面的状态了;第六个参数指的是页面的属性,其可能的取值与AllocationProtect相同;最后一个参数指明了该内存块的类型,有三种可能值:MEM_IMAGE 、MEM_MAPPED和MEM_PRIVATE。
     这样我们就可得到进程中需要扫描的地址范围了。到这里剩下的问题就是要读取指定的进程的指定的地地址空间的内容了。这里要用到的是用于调试程序和错误处理(Debugging and Error Handling)的API函数。在“Platform SDK: Debugging and Error Handling”章节中,介绍了一部分与程序调试和错误处理相关的API函数,有许多是很有用,例如我们下面用到的ReadProcessMemory和WriteProcessMemory,它们原型如下:
    BOOL ReadProcessMemory(
         HANDLE hProcess,              // handle to the process
         LPCVOID lpBaseAddress,        // base of memory area
         LPVOID lpBuffer,              // data buffer
         SIZE_T nSize,                 // number of bytes to read
         SIZE_T * lpNumberOfBytesRead  // number of bytes read
    );
    BOOL WriteProcessMemory(
         HANDLE hProcess,                // handle to process
         LPVOID lpBaseAddress,           // base of memory area
         LPCVOID lpBuffer,               // data buffer
         SIZE_T nSize,                   // count of bytes to write
         SIZE_T * lpNumberOfBytesWritten // count of bytes written
    );
    参数很简单从它们的名字都可以猜出其意义了,这里就不多做说明了。根据工作方式不同,用到的API可能还涉及到以下几个:   
      FindWindow   
      GetWindowThreadProcessId   
      OpenProcess   
      WrITeProcessMemory   
      ReadProcessMemory   
      CloseHandle   
      virtualallocex   
      virtualfreeex  
      

  4.   

    头文件可以查找一下,应该都是系统中自带的。主要用到的API都是我上面提到的,所以那些头文件都是VC中的,不是什么特殊的,你大可放心。自已根据上面的函数研究也一样可以的,大家都是这么写的。只是上面下载的那个可以作为参考而已。
      

  5.   


    对了。。随便问句比较弱的问题怎么在MSDN上找资料啊。。
    比如我想找VC里控件的资料
    咋就笨笨的没找到呢。。是不是这些资料都收费啊
      

  6.   

    你可以用spy++找到你运行程序的内存大致范围,然后逐步缩小
      

  7.   

    网络上吗?http://msdn.microsoft.com/zh-cn/aa570318.aspx
      

  8.   


    有没有API文档之类的东西。
    直接就能搜到各个控件什么的
      

  9.   

    MSDN就是API文档的超集, 包括使用方法、Q&A、BUGs都有详细的介绍你如果有安装MSDN,在search或是index中随便输入一个函数名就会列出相关的文档
      

  10.   

    你可以下载一个MSDN光盘版,即ISO文件,到本地硬盘安装,什么版本(VC6.0-VC2008)的都可以,对于API来说都一样的,新的只是增加了一些系统相关的新特性而已,而且新版更多都是针对C#、.net更新的,和VC的区别不大,你下哪一版本都可以,大小一般都是1G以上,版本越高,日期越新的越大。
      

  11.   


    能给个下载地址什么的嘛。。
    我找了半天也没找到一个完整的能下的。
    理论上MSDN的网站上应该有啊。
      

  12.   

    天,哪里下还要别人告诉你啊?
    搜索是最基本的技能,如果这个不会的话,应该先学一学电脑基础,不能直接就学编程,因为编程是在了解系统、熟悉系统基本操作的前提下进行的。话说得难听了点,但事实确实如此。
    Visual C++6.0+MSDN2001 ISO 1.88G版本
    http://www.cn029.com/soft/118/2006/2006072429475.htmlVisualStadio.net2005集成SP1&MSDNsp1 ISO 4.6GB 
    http://www.downtool.com/Bt/86651.htmlBT、FTP、电驴、HTTP,各种方式的都可以,再不会还可以到电脑城买套光盘。
      

  13.   

    下后面那个吧,将VC也一起装了,是VC2005。这个贴可以结了吗?有问题再重新开贴吧。也可以加我的QQ群,我签名上有。
      

  14.   


    不是我不会搜。
    搜了 10个有9个有毒
    1个下不了我有啥办法。。
    而且理论上这个应该在MSDN官方网站上有下的。你给的不也是1G+版本的嘛~~~这个迅雷上有~~~就是因为太大了才没下精简版的下了几个又不全。才有次一问难道论坛上问。。不也是搜索资源的一种嘛我估计我这贴子要是20分你肯定不会回答一个字!!!你这么喜欢分?????
      

  15.   

    那就不用它不就行了,主要还是ReadProcessMemory(),WriteProcessMemory(),你只要学会有这二个就可以了,那个源程序只是给你参考的,你打开来看源码就行了,再说,就算代码也不会看,那就说明基础还太差,等看一书再看也是可以的,不一定要运行。我上面只是讲原理给你听,不是要给程序你。你看懂原理了,管什么源不源代码呢?学习也要讲方法啊。
      

  16.   


    你以为我是要看你给我的那几个函数啊我自己就已经做出这个修改器了。。只不过我觉得不用将内存全部都搜索一遍才发的这个帖子MSDN网上的都上G还不一定能用。。每个都下来再试看能用不我得试多少次。。占着带宽成天下东西寝室人得削死我你真以为别人都傻啊。。就你聪明
      

  17.   

    我在QQ群都是无偿大量回答的,所以让你加群。你不加。
    在这里我只回答100分的题,你说对了。MSDN都是至少三张CDROM的,精简就说明被删除掉很多,你下了当然就不全,这个本来就是无法二全的事情。我可以对你另开贴再回答一切问题,不喜欢一个贴里问很多事情的。这样不公平,但在QQ群里可以无限回答,上这来不就为了分吗?我是这样的。你可以BS。
      

  18.   

    我再说明一下,那份源码里就包含所有操作,所以让你看源码(不是你说要看,是我要你看,这样更明白),这是不需要编译和运行的,那个头文件完全可以不管,就是这个意思。看代码要看关键之间,不是看整个,否则那来这么多时间?我是不满你连MSDN在哪里下都要问。而且我都说了,话难听,但有理。
      

  19.   


    我说的过激了点。。
    我道歉不过确实很气愤啊。我大学3年所有学到的东西都是自己查资料学的。。竟然说我连搜索资源都不会。。天啊。。要是不会
    怎么学到今天的我只不过以前一直都学JAVA。。最近有低层需要要攻下VC
    大家都知道开源的文档在各个官方网站都下得到有保证
    而我习惯行的去MSDN的网站找资料的时候发现真是一片混乱啊。。
    于是利用迅雷啊BAIDU,GOOGLE啊。。什么的
    那些资源的评论都不好
    也不知道哪个是完整能用的,每个都上G
    在寝室的带宽条件大家也知道
    你一下东西那别人开网页都费劲
    我不可能每个都下来。。然后看看哪个好使
    所以才问哪有下的想直接就找到一个完全没有问题的资源,就这样而已
    确遭来类似于计算机盲的评价。气愤。。非常气愤
    所以言行过激在次道歉结贴给分