为了学习 vtrace,我一直在尝试附加到进程并挂钩导入地址表,然后恢复进程的主线程。当我不附加到进程 ResumeThread() 调用工作正常。但是当我这样做时,它会启动一个线程,然后对 ResumeThread() 的调用不起作用并且主线程永远不会运行。下面是代码...
from ctypes import *
from ctypes import wintypes
from defines import *
import vdb
import vtrace
import sys
from iathook import *
class PROCESS_INFORMATION(ctypes.Structure):
_fields_ = [
("hProcess", HANDLE),
("hThread", HANDLE),
("dwProcessId", DWORD),
("dwThreadId", DWORD),
]
process_info = PROCESS_INFORMATION()
kernel32 = ctypes.WinDLL('kernel32.dll')
bCreateProcessW = kernel32.CreateProcessA(
path_to_binary,
None,
None,
None,
True,
creation_flags,
None,
None,
byref(startupinfo),
byref(process_info))
#launched the process in a suspended state and patch it using DLL injection
#but this code doesn't effect the following code
apptrace = vtrace.getTrace()
apptrace.attach(process_info.dwProcessId) #1
hookSomeStuff = hookIat(apptrace, 'MSVCR110') #2
#apptrace.resumeThread(process_info.hThread) #3
dwPrevSuspendCount = kernel32.ResumeThread(process_info.hThread)
正如我上面提到的,当我删除vtrace attach
and 和hookIat
东西时(第 1 行和第 2 行)。ResumeThread() 调用工作正常并且主线程运行。我还尝试使用 vtrace 方法(第 3 行)恢复线程,但它告诉我线程没有挂起。主线程实际上并没有运行,所以我想知道它为什么不能被挂起或发生了什么。我还使用 procmon 检查二进制文件的事件,当它附加时,它会启动另一个线程,这似乎把事情搞砸了。这可能看起来很尴尬,我知道还有很多其他方法可以做到这一点,但我将其用作学习练习,现在我很感兴趣为什么它不起作用。任何帮助表示赞赏,并在此先感谢您的帮助。