Windows 中的三个线程

逆向工程 风袋 线
2021-06-23 22:30:52

我写了一个小程序,它只显示一个对话框。基本上是一个 ASM Hello World。当显示对话框并且我在 WinDBG 中中断时,即使应用程序根本不使用任何线程,我也可以看到三个线程。

我不知道有类似默认线程应用于进程的东西,还是因为 WinDBG?

进程/线程窗口显示

 000:13d4:MyApp.exe
    000:d14
    001:11bc
    002:50c

如果我放置了一个内存访问断点并且该进程将有多个线程,我是否必须指定应该在哪个线程中触发它。我觉得这应该没有关系吧?因此,如果任何线程访问地址,则无论如何都应触发断点。

日期

所以我现在仔细看看(句柄号已经改变,但 ID 无论如何都是相关的)。如果有帮助,我正在运行 Windows 7-32bit-x86。

000: 指的是我原来的过程,但这已经是众所周知的了。

001: 我中断时的堆栈跟踪看起来像这样(WinDBG 需要一些线程同步?):

ntdll!KiFastSystemCallRet
kernel32!WaitForMultipleObjectsEx+0x8e
kernel32!WaitForMultipleObjects+0x18
msiltcfg!RestartMsi+0x32e
kernel32!BaseThreadInitThunk+0x12
ntdll!RtlInitializeExceptionChain+0xef
ntdll!RtlInitializeExceptionChain+0xc2

似乎这个线程属于一些msiltcfg.dll可能是 Windows 7 DLL 的线程,但是为什么它会在我的进程中创建线程?

002:所以这可能是 Akira32 在他的回答中提到的 WinDBG 线程,对吗?(为什么 WinDBG 需要自己的线程?)。

ntdll!DbgBreakPoint
kernel32!BaseThreadInitThunk+0x12
ntdll!RtlInitializeExceptionChain+0xef
ntdll!RtlInitializeExceptionChain+0xc2
1个回答

根据你的描述:

是的,你的程序应该只有一个线程在运行,没有调试器。你可以在任务管理器上查看。但是,当您附加到 windbg 时,它会在中断时创建一个线程。你提到的第三个线程,我真的不知道。也许是注入的 dll 运行代码...

但是您可以尝试通过在 winbgd 上打开 windows 的“调用堆栈”来找出答案。(并在线程窗口中选择每个线程)

  • 你会看到你的代码线程,最后一个函数调用在上面。
  • Windbg 线程,可能在顶部带有函数 ntdll!DbgBreakPoint。
  • 第三个,看看它在哪里停止以及代码在dissambly窗口中属于什么dll。

你说的对。您只需要设置一个断点,任何线程都会在访问时触发:)。

让我们知道您发现了什么:)。

希望我有所帮助!

更新

002:

每次暂停附加的进程执行时,windbg 都会创建该线程。这是有道理的,因为windbg需要一个断点来停止执行,因为他不知道在哪里修补代码上的正常断点,立即中断。他创建了一个线程来调用 dbgbreakpoint 和 break。

如果继续执行,windbg 的线程将终止。这是调试器的正常行为,不仅仅是windbg。

001:

msiltcfg.dll 具有处理 MSI 安装程序的功能。“Windows Installer Configuration API Stub” 对我来说,这个进程加载了这个 dll 很奇怪。通过您显示的堆栈调用,它在等待某些东西。一个线程,互斥事件等...这个线程与windbg无关。有些东西在你的进程上加载了那个 dll 并创建了线程。几乎可以肯定,这是一个操作系统进程。

您可以做的一件事是检查其他进程(calc.exe 或 notpad.exe,简单的)是否加载了相同的线程或相同的 dll。一些程序/操作系统可以在 abritary 进程甚至所有进程上加载 dll 并运行代码(使用 WIN32 API 函数 CreateRemoteThread)。这也是恶意软件的正常行为:)。

您可以确定的一件事是您的程序只创建了一个线程。在正常情况下,它不应超过一个。

我确实测试了一个像你这样的程序,并且刚刚得到一个线程。