好了,现在来看看CreateAddrList方法:
以下为引用的内容: private List<IntPtr> CreateAddrList(IntPtr baseAddr, int value) { int bytesRead; byte[] buffer = new byte[4096]; bool ok; List<IntPtr> result = new List<IntPtr>();
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 ,若我们要修改的程序的某个数据是以其他数据类型存储的,则需要小修改下我们的修改器。
笔者水平有限,若有疑问或更好的建议,务必不吝赐教。
ASP编码教程:如何实现/使用缓存
[ASP]2015年4月15日ASP编码教程:asp缓存的分类
[ASP]2015年4月15日ASP编码教程:何谓ASP缓存/为什么要缓存
[ASP]2015年4月15日ASP编码教程:asp实现的sha1加密解密代码
[ASP]2015年4月15日ASP编码教程:asp执行带参数的sql语句实例
[ASP]2015年4月14日