编程开发 > ASP > 文章内容

.Net实现游戏修改器(二)

2010-12-31编辑:dan

好了,现在来看看CreateAddrList方法:

以下为引用的内容:

        private List<IntPtr> CreateAddrList(IntPtr baseAddr, int value)

        {

            int bytesRead;

            byte[] buffer = new byte[4096];

            bool ok;

            List<IntPtr> result = new List<IntPtr>();

 
            ok = ReadProcessMemory(_selectedProcess.Handle, baseAddr, buffer, 4096, out bytesRead);


            if (!ok)

                return null ;

 

            int currentVal;

            for (int i = 0; i < 4096 - 3; i++)

            {

                currentVal = BitConverter.ToInt32(buffer, i);

                if (currentVal == value)

                {

                    IntPtr addr = new IntPtr(baseAddr.ToInt32() + i);

                    result.Add(addr);

                    i += 3;

                }

            }

            return result;

        }

该方法用以创建地址列表。它接受2个参数,分别是基地址和要查找的值。

我们用ReadProcessMemory 一次读取4KB的值,并把它存放在buffer中。由于buffer 是byte[ ],所以需要用BitConverter.ToInt32[ ]把buffer中的一部分值转成Int32以和要查找的值进行比对。

如果值匹配,则把对应地址添加到该方法的 result中以供方法返回。

接下来是RefreshAddrList方法:

以下为引用的内容:

.        private void RefreshAddrList(int value)

        {

            var la = _addrList.ToList();

            _addrList.Clear();

 

            byte[] buffer = new byte[4];

            int bytesRead;

 

            foreach (var i in la)

            {

                ReadProcessMemory(_selectedProcess.Handle, i, buffer, 4, out bytesRead);

                if (BitConverter.ToInt32(buffer, 0) == value)

                    _addrList.Add(i);

            }

        }

因为要根据第一次查找的地址结果进行查找并要更新主地址列表,所以要用addrList.ToList( )得到一份主地址列表的拷贝。接下来再在作为第一次搜索结果的地址表中查找新的值。如果等于之前的值的地址中的数据现在还等于新的值,那么就添加到地址列表。

回看查找按钮的事件处理代码可以发现:反复多次,直到地址列表中只有一个地址时,就可以确定这就是我们要的地址,此时,我们就可以修改它了。

以下为引用的内容:

        private void button2_Click(object sender, EventArgs e)

        {

            int value;

            if (!int.TryParse(textBox2.Text, out value))

            {

                MessageBox.Show("输入值太大!小心溢出!请重新输入!");

                return;

            }

            var buffer=BitConverter.GetBytes(value);

            int bytesWritten;

            WriteProcessMemory(_selectedProcess.Handle, _addrList[0], buffer, 4,out bytesWritten);

        }

这样就完成了,按下F5我又IMBA了一回!

 

代码下载:ProgramMemoryEditor

该程序搜索值的数据类型是Int32 ,若我们要修改的程序的某个数据是以其他数据类型存储的,则需要小修改下我们的修改器。

笔者水平有限,若有疑问或更好的建议,务必不吝赐教。

.Net实现游戏修改器(一)

热点推荐

登录注册
触屏版电脑版网站地图