代码之家  ›  专栏  ›  技术社区  ›  flavour404

在别人的地址空间中线程

  •  1
  • flavour404  · 技术社区  · 14 年前

    我正在构建一个监视器应用程序,并且有一些线程问题。

    我已经使用CBT钩子将一个DLL注入到另一个进程内存中。我正在某些地址读另一个应用程序的内存。问题是我使用了一个循环来观察这个过程,基本上被观察的应用程序不能自由地继续运行。所以我想把我的手表放在一个线程中。我正在使用下面的代码创建线程:

    void readAddresses(DWORD addr)
    {
    LPDWORD dwThreadID;
    HANDLE hThread = CreateThread(NULL,0,ThreadProc,&addr,0,dwThreadID);
    }
    

    我也尝试了CreateMemoteThread(…)并得到了相同的错误。当线程在调用readProcessMemory()API时运行时,它会失败,我不确定自己做错了什么。

    //going to pass in an address, dword
    DWORD WINAPI ThreadProc(LPVOID lpParameter)
    {
     DWORD pid;
     GetWindowThreadProcessId(targetWindow,&pid);
     HANDLE hProcess = ::OpenProcess(PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | 
                             PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ,
                             FALSE, pid);
    
    ...
    ReadProcessMemory(hProcess,(void *)_start, data, 255, &lpRead);
    ...
    

    }

    问题是当我调用readprocessmemory时,我现在得到一个访问冲突。我想知道的是,线程与注入线程的进程在同一进程地址空间中运行。正如我所说,如果没有线程代码,它可以正常工作,但是我需要在后台运行监视器代码,我想知道如何实现这一点?我应该使用创建远程线程吗?

    正如remus sais所说,使用beginthread()或beginthreadex()。

    谢谢

    1 回复  |  直到 14 年前
        1
  •  1
  •   Remus Rusanu    14 年前

    有一点是肯定的:读写地址绝对不是 DWORD 类型。从上面的代码来看,您似乎通过了 DWORD addr 作为 地址 从中读取,然后启动一个线程,将 您当地的地址 addr 参数 . 很可能线程进程正在尝试读取 ADDR 参数 曾经是 在原始线程堆栈的当前进程中(现在位于 任何 过程),结果是随机的(有时你会点击Jackpot,在远程过程中读取一些无辜的受害者位置)。

    • 输入地址作为正确的地址(lpvoid)。双字 不能 是正确的。
    • 传递到后台线程 你想读的地址 不是它不能使用的某些本地堆栈帧垃圾

    .

    void readAddresses(LPVOID addr)
    {
    LPDWORD dwThreadID;
    HANDLE hThread = CreateThread(NULL,0,myThreadProc,addr,0,dwThreadID);
    }
    
    DWORD WINAPI myThreadProc(LPVOID addr)
    {
       ...
        ReadProcessMemory (..., addr);
    }