技术开发 频道

.Net巧妙实现植物大战僵尸修改器

  该方法用以创建地址列表。它接受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了一回

1
 

  代码下载:ProgramMemoryEditor

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

0
相关文章