循环不能正常工作

时间:2015-03-13 05:37:59

标签: c# loops

我没有要求代码给我!请解释一下为什么无限循环不循环=)

static void Main()
{
  int i=1;
  while (i>0)
  {
    using (StreamWriter writer = new StreamWriter("O:\\out.txt"))
    {       
      Console.SetOut(writer); 
      Act();            
    }
  }
}


static void Act()
{

    Process process = Process.GetProcessesByName("notepad")[0]; 
    IntPtr processHandle = OpenProcess(PROCESS_WM_READ, false, process.Id); 

    int bytesRead = 0;
    byte[] buffer = new byte[8]; 

    ReadProcessMemory((int)processHandle, 0x002BAAD0, buffer, buffer.Length, ref bytesRead);

    Console.WriteLine("<bytes>" + Encoding.Unicode.GetString(buffer) + "</bytes>");
}

Main写入特定文件控制台的输出,调用Act。该程序运行一次。有道理,对吧?

要进行无限循环,我添加:

int=1 while (i>0) {}

...循环。 Act()操作 INSIDE 循环,为什么Main无限运行但Act仍然运行一次?

3 个答案:

答案 0 :(得分:0)

首先,我建议你将Main()重组为类似的东西:

[DllImport("kernel32.dll")]
public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);

[DllImport("kernel32.dll")]
public static extern bool ReadProcessMemory(int hProcess, int lpBaseAddress, byte[] lpBuffer, int dwSize, ref int lpNumberOfBytesRead);

const int PROCESS_WM_READ = 0x0010;


static void Main()
{
    try
    {
        using (var sw = new StreamWriter("O:\\out.txt"))
        {
            Console.SetOut(sw);
            while (true)
            {
                Act();
            }
        }
    }
    catch (Exception e)
    {
        Debug.WriteLine(e.Message);
    }
}

我认为你是从这里复制示例:C# Read/Write another Process' Memory。您应该注意示例2中的第27行:

  

// 0x0046A3B8是我找到字符串的地址,将其替换为您找到的字符

该警告存在,因为您尝试读取的缓冲区的位置可能会在应用程序的每个独立运行中发生更改(文章Graphical memory layout for notepad process有一些关于使用Process Explorer来调查此信息的信息)。

另请注意Address space layout randomization上维基百科文章中的一行:

  

堆,堆栈,进程环境块和线程环境块的位置也是随机的。

所以,问题的答案是:

  • 在运行具有硬编码地址的应用程序之前,忠实地按照示例确定正确的缓冲区地址
  • 关闭Notepad.exe
  • 的ASLR

答案 1 :(得分:0)

我认为你必须关闭你的作家

当你第一次打开文件时,文件更改状态为锁定,第二次命令new StreamWriter("O:\\out.txt")返回null

答案 2 :(得分:0)

问题出在:

using (StreamWriter writer = new StreamWriter("O:\\out.txt"))
{
   Console.SetOut(writer);
   Act();
}