吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1885|回复: 11
收起左侧

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

[复制链接]
Homely 发表于 2021-10-11 22:44
本帖最后由 Homely 于 2021-10-12 14:34 编辑

        [DllImport("kernel32.dll ")]
        static extern bool ReadProcessMemory(int hProcess, IntPtr lpBaseAddress,out int lpBuffer, int nSize, int lpNumberOfBytesRead);
        [DllImport("kernel32.dll")]
        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[0]);
            aa = ReadProcessMemory(OpenHwnd, FistAdd, out dataAddress,4,0);
            //二次偏移
            aa = ReadProcessMemory(OpenHwnd, IntPtr.Add(FistAdd, offsetData[1]), out dataAddress, 4, 0);
        }

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

1

1


第一次偏移过后取值就一直为0,

第二次偏移取值也为0,

3

3



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



发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

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
没有搜索到呢。 可否截图下,谢谢大佬。

QQ截图20211012062852.png

然后实例化 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[0]);
            aa = ReadProcessMemory(OpenHwnd, FistAdd, out dataAddress,4,0);


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

那是之前写的代码逻辑写错了。我修改了代码后依旧是一样的情况。
chinasmu 发表于 2021-10-12 15:09
还是偏移计算错了吧,你这样写的一次二次便宜都是基址+固定数值,相当于都是硬编码了吧。
一次偏移应该是读出来的 dataAddress+offsetData[0],而不是你的FistAdd = IntPtr.Add(FistAdd, offsetData[0]);
 楼主| Homely 发表于 2021-10-12 16:27
chinasmu 发表于 2021-10-12 15:09
还是偏移计算错了吧,你这样写的一次二次便宜都是基址+固定数值,相当于都是硬编码了吧。
一次偏移应该是 ...

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

但是这样我测试过一次一样的是错误的。。
chinasmu 发表于 2021-10-13 00:18
Homely 发表于 2021-10-12 16:27
大佬的意思是修改成这样的吗 ,
第一次偏移是 FistAdd=FistAdd+offsetData[0];
第二次偏移是 FistAdd=F ...

你说的修改跟不改有什么区别吗?
你还是没搞明白
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 20:41

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表