这是我的Form1代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;

namespace ReadMemory
{
    public partial class Form1 : Form
    {
        List<int> memoryAddresses = new List<int>();

        public Form1()
        {
            InitializeComponent();


            Process proc = Process.GetCurrentProcess();
            IntPtr startOffset = proc.MainModule.BaseAddress;
            IntPtr endOffset = IntPtr.Add(startOffset, proc.MainModule.ModuleMemorySize);
            for (int i = 0; i < startOffset.ToInt64(); i++)
            {
                memoryAddresses.Add(startOffset[i]
            }

        }

        private void modelsToolStripMenuItem_Click(object sender, EventArgs e)
        {

        }
    }
}


我尝试从头到尾扫描所有内存地址,并将它们添加到列表中。
但是我在网上遇到一个错误:

memoryAddresses.Add(startOffset[i]


错误3无法将带有[]的索引应用于类型'System.IntPtr'的表达式

第二件事是在循环中做:startOffset.ToInt64()可以吗?还是我应该做ToInt32()?

最佳答案

IntPtr值只是一个数字,它不是可以通过索引访问的数组。现在,您正在从零循环到startOffset,但我认为您想从startOffset循环到endOffset

由于内存地址可以是32位或64位,具体取决于运行代码的平台,因此需要longInt64)来处理任何一种指针:

List<long> memoryAddresses = new List<long>();


使用ToInt64将指针值转换为整数是正确的。内存地址将只是您在循环中使用的变量。

for (long i = startOffset.ToInt64(); i < endOffset.ToInt64(); i++) {
  memoryAddresses.Add(i);
}


注意:在为过程存储器中每个字节的列表添加项目时,该列表将是过程存储器大小的八倍。可能您的进程中没有足够的内存来实现此目的。

10-07 19:54