ce吧 关注:197,026贴子:3,802,926
  • 12回复贴,共1

有关ReadProcessMemory和WriteProcessMemory方法地址参数的问题

只看楼主收藏回复

内个...刚玩ce不久,在自己真上去写代码的时候出现了很多问题,想在这里问一下大佬们(
DllImport Kernel32 里的Read ProcessMemory方法。
[DllImport("kernel32.dll")]
public extern static bool ReadProcessMemory(IntPtr hprocess, uint lpbaseaddress, int[] plbuffer, UInt32 nsize, Int32[] lpnbr);
第二个参数是整数型,但我CE找出来的地址都是非常长的,要长于int的取值范围,不知道该怎么弄(
方法里面把形参类型换成long类型的话,就会报
System.AccessViolationException:“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”
怎么办,总结一下就是需要传入的地址参数太长了,但方法定义的类型是int不够。
もう一つ,还有就是模块地址该怎么办,我用指针扫描查到的很多基地址都是 "某游戏.exe + XXXX",怎么办,我该怎么在程序中使用(C#)的话最好(
希望大佬能解答一下.....


IP属地:日本1楼2020-09-05 23:28回复
    把程序编译成64位就没有地址长的苦恼。还有ce上显示的xxx.exe戓xxx.dll都可以变成数字。只不过现在的游戏这些模块在内存中加载的地址都不是固定的,读的时候得先取它的加载地址。比如正常编译的.exe默认加载地址是0x00400000。xx.exe+xxx就等同0x400000+xxx。
    如果是本进程要获取某模块加载地址可以用getmodulehandle,外部进程最简单的就是用enumprocessmodules枚举所有模块。不过32位进程只能怼32位目标进程,64位目标进程只能用64位进程去怼它。64位进程操作32位进程内存很随便。32位想要操作64位进程内存技术含量还是很高的,不能用常规办法


    IP属地:广西来自Android客户端2楼2020-09-06 12:56
    收起回复
      2025-08-14 13:46:23
      广告
      不感兴趣
      开通SVIP免广告
      C#。。


      IP属地:云南来自Android客户端4楼2020-09-07 11:08
      回复
        这个函数原型 第二个参数 是PVOID 类型 并不是int类型


        IP属地:云南来自Android客户端5楼2020-09-07 11:09
        收起回复
          ReadProcessMemory(process, (LPCVOID)0x01005361,&gamedata,32*24, &Pid)
          第一个参数 进程句柄,第二个参数基地址,第三个参数为传参,第四是读取大小,第五个可以为0,也可以为进程标识符;
          注:c++


          6楼2020-09-08 23:03
          收起回复
            可以一起交流吗,之前也用c#写过自动动刷图的,快2年没玩了,源码还在,现在变64了,不知道要怎么改


            IP属地:浙江来自iPhone客户端7楼2020-09-11 01:52
            收起回复
              一样用c#的,可以给份源码吗,学习一下,感谢529166258@qq.com


              IP属地:广东来自Android客户端8楼2020-10-12 00:46
              回复