Homely 发表于 2021-10-11 22:44

C#的ReadProcessMemory植物大战僵尸进行内存偏移的取值的时候无法取出正确值

本帖最后由 Homely 于 2021-10-12 14:34 编辑

      
      static extern bool ReadProcessMemory(int hProcess, IntPtr lpBaseAddress,out int lpBuffer, int nSize, int lpNumberOfBytesRead);
      
      public static extern int OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);
      private void button1_Click(object sender, EventArgs e)
      {
            IntPtr hwnd = new IntPtr();

            //这里是通过NuGet程序包下载的PInvoke.User32 直接调用的
            hwnd = User32.FindWindow("MainWindow", null);

            int testID;
            int testTD;
            int OpenHwnd;
            testTD = User32.GetWindowThreadProcessId(hwnd, out testID);

            //打开进程
            OpenHwnd = OpenProcess(0x1F0FFF, false, testID);
            Boolean aa;
            IntPtr FistAdd = new IntPtr(0x007578F8);
            int dataAddress;
            //偏移地址
            int[] offsetData = new int[] {0x94c,0x50};
            
            //源地址
            aa = ReadProcessMemory(OpenHwnd, FistAdd, out dataAddress, 4, 0);

            //一次偏移         
         FistAdd = IntPtr.Add(FistAdd, offsetData);
            aa = ReadProcessMemory(OpenHwnd, FistAdd, out dataAddress,4,0);
            //二次偏移
            aa = ReadProcessMemory(OpenHwnd, IntPtr.Add(FistAdd, offsetData), out dataAddress, 4, 0);
      }

第一次获取值的跟CE一样的。



第一次偏移过后取值就一直为0,https://p.pstatp.com/origin/pgc-image/1ce7f4b08e18452d99cd2c98cd255410

第二次偏移取值也为0,



就是不知道问题出在哪里了,求大佬解答一下。



lxwan 发表于 2021-10-12 00:17

我一直用的NuGet的memory.dll_x32

Homely 发表于 2021-10-12 00:29

lxwan 发表于 2021-10-12 00:17
我一直用的NuGet的memory.dll_x32
没有搜索到呢。 可否截图下,谢谢大佬。

lxwan 发表于 2021-10-12 06:33

Homely 发表于 2021-10-12 00:29
没有搜索到呢。 可否截图下,谢谢大佬。



然后实例化 Mem m = new();

newpowersky 发表于 2021-10-12 10:16

好厉害,,,,,
跟楼主学习一下

幽溪左畔 发表于 2021-10-12 11:59

二级偏移计算 不应该是用 一级偏移计算出的dataAddress + 二级偏移吗 怎么还用inp+二级偏移

Homely 发表于 2021-10-12 14:15

幽溪左畔 发表于 2021-10-12 11:59
二级偏移计算 不应该是用 一级偏移计算出的dataAddress + 二级偏移吗 怎么还用inp+二级偏移


            Boolean aa;
            IntPtr FistAdd = new IntPtr(0x007578F8);
            int dataAddress;

            //偏移地址
            int[] offsetData = new int[] {0x94c,0x50};
            
            //源地址
            aa = ReadProcessMemory(OpenHwnd, FistAdd, out dataAddress, 4, 0);

            //一次偏移         
            FistAdd = IntPtr.Add(FistAdd, offsetData);
            aa = ReadProcessMemory(OpenHwnd, FistAdd, out dataAddress,4,0);


            //二次偏移
            aa = ReadProcessMemory(OpenHwnd, IntPtr.Add(FistAdd, offsetData), out dataAddress, 4, 0);

那是之前写的代码逻辑写错了。我修改了代码后依旧是一样的情况。

chinasmu 发表于 2021-10-12 15:09

还是偏移计算错了吧,你这样写的一次二次便宜都是基址+固定数值,相当于都是硬编码了吧。
一次偏移应该是读出来的 dataAddress+offsetData,而不是你的FistAdd = IntPtr.Add(FistAdd, offsetData);

Homely 发表于 2021-10-12 16:27

chinasmu 发表于 2021-10-12 15:09
还是偏移计算错了吧,你这样写的一次二次便宜都是基址+固定数值,相当于都是硬编码了吧。
一次偏移应该是 ...

大佬的意思是修改成这样的吗 ,
第一次偏移是 FistAdd=FistAdd+offsetData;
第二次偏移是 FistAdd=FistAdd+offsetData;

但是这样我测试过一次一样的是错误的。。

chinasmu 发表于 2021-10-13 00:18

Homely 发表于 2021-10-12 16:27
大佬的意思是修改成这样的吗 ,
第一次偏移是 FistAdd=FistAdd+offsetData;
第二次偏移是 FistAdd=F ...

你说的修改跟不改有什么区别吗?
你还是没搞明白
页: [1] 2
查看完整版本: C#的ReadProcessMemory植物大战僵尸进行内存偏移的取值的时候无法取出正确值