【问题标题】:Issue when attempting to open the contents of a memory adress in the web browser尝试在 Web 浏览器中打开内存地址的内容时出现问题
【发布时间】:2018-08-19 21:38:02
【问题描述】:

我目前正在尝试从内存地址中读取,然后在 Web 浏览器中打开其内容(其内容始终是 url。) 我目前正在尝试这样做:

public static void Main(string[] args)
{
    Process[] pname = Process.GetProcessesByName("t6mp");
    if (pname.Length == 0)
    {
        Console.WriteLine("Game not found. Please run your game then restart this program.");
        Console.ReadLine();
    }
    else
    {
        void ReadProcessMemory(object t6mp, int v1, byte[] url, int v2, ref int read)
        {
        }
        Console.WriteLine("Game found. Please go to the page where you can start a demo, then press enter to continue.");
        Console.ReadLine();
        Console.WriteLine("Please press enter to export");
        Console.ReadLine();

        var buffer = new byte[1];
        var sb     = new StringBuilder();
        var handle = Process.GetProcessesByName("t6mp")[0];
        int _bytesused = 200;

        for (var i = 0; i < _bytesused; i++)
        {
            ReadProcessMemory(handle, 0x2BDA932 + i, buffer, buffer.Length, ref _bytesused);
            if (buffer[0] != 0)
            {
                sb.Append(Encoding.ASCII.GetString(buffer));
                Process.Start(sb.ToString());
            }
            else
            {
                Console.WriteLine("Error has occured, please try again. Press enter to close program");
                Console.ReadLine();
                break;
            }
        }
    }
}

它正确识别进程何时打开,并且我确定地址存在(我尝试过 0x2BDA932 和 0x02BDA932)但是,它总是显示错误消息,由于某种原因,if (buffer[0] != 0) 总是错误的。当我删除 if / else 并让它直接转到sb.Append(Encoding.ASCII.GetString(buffer)); Process.Start(sb.ToString());

它只是崩溃。理想情况下,它会在我的浏览器中打开地址的内容,因为它是一个 url。有什么想法吗?

【问题讨论】:

标签: c#


【解决方案1】:

var buffer = new byte[1];

您的缓冲区只有 1 个字节的长度,您的 while 循环正在溢出您的缓冲区,可能导致未定义的行为。

buffer.Length 在您对 ReadProcessMemory 的调用中

长度为 1,你只读取 1 个字节,这就是为什么它永远不会是 0。

您应该使用像 2000 这样的固定大小来定义数组长度,它应该涵盖所有可能的情况,涉及 URL。

这是我读取空终止字符串的函数:

public static string ReadNullTerminatedString(IntPtr handle, IntPtr addr, int maxlength)
{
    var bytearray = new byte[maxlength];

    IntPtr bytesread = IntPtr.Zero;

    ReadProcessMemory(handle, addr, bytearray, maxlength, out bytesread);

    int nullterm = 0;
    while (nullterm < bytesread.ToInt64() && bytearray[nullterm] != 0)
    {
        nullterm++;
    }

    string s = Encoding.ASCII.GetString(bytearray, 0, nullterm);

    return s;
}

【讨论】:

    猜你喜欢
    • 2018-05-04
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 2020-10-05
    • 2011-09-03
    • 2023-02-26
    • 2020-04-23
    相关资源
    最近更新 更多