2023年1月

最近,我处理了一个问题,在系统帐户下安装32位Office时没有发生注册表反射。这需要同时研究32位Office代码和实现注册表反射的Wow64代码。使用32位调试器附加到Wow64进程时,就像在32位计算机上调试32位进程一样;进程中没有64位二进制文件。但是,我们需要调试Wow64来调试注册表反射代码。为此,我们使用64位调试器附加到Wow64进程,它允许您查看Wow64二进制文件。

lm

Base TimeStamp Module
400000 42435b2a Mar 24 18:28:26 2005C:\Program Files (x86)\Internet Explorer\IEXPLORE.EXE

77ec0000 45d6cc72 Feb
17 03:35:46 2007C:\WINDOWS\system32\ntdll.dll

6b000000 45d6943d Feb
16 23:35:57 2007C:\WINDOWS\system32\wow64.dll

6b280000 45d695f3 Feb
16 23:43:15 2007C:\WINDOWS\system32\wow64win.dll

78b80000 42438b7a Mar
24 21:54:34 2005 C:\WINDOWS\system32\wow64cpu.dll

我们很多人都认为调试器中的一些简单命令是理所当然的,这些命令可以让生活变得轻松。我想了几个特别能搭配的。第一个命令是kn。Kn将显示当前调用堆栈,并在单个调用的最左边包含堆栈帧编号。
我在Windbg中运行BadWindow.EXE文件,通过~0s将我的线程设置为线程0。然后我只需键入kn。这将转储调用堆栈,如您所见,在最左边的每个调用都有堆栈帧号。

 

使用上面堆栈中的堆栈帧2,让我们看看它使用的局部变量。首先,我们必须使用.frame和frame number获取上下文。

 

 

 

现在要转储局部变量,我们可以使用dv(Display Local Variables)命令。(请注意,您需要为正在调试的二进制文件使用专用符号才能使其正常工作)。

 

如你所见,我们这里有几个当地人。现在,因为我有这个二进制的私有符号,所以调试器已经理解了每个变量的结构和数据类型。
此外,因为我已经在堆栈帧上下文中,所以我可以简单地dt(display type)加上变量的名称,调试器就可以算出地址。让我们dt msg看看它包含什么数据。

 

如你所见,有几个结构是这个结构的一部分。请看上面输出的右边。您将注意到右侧的数据类型名称HWND_和tagPOINT。这些都是结构。好消息是dt将递归地工作,并将在当前结构下转储结构。您只需发出DT–r。您可以通过在–r后面附加一个数字来指定深度。

 

说到现场调试,断点是最重要的。通常,在生产环境中解决一个非常复杂的问题需要在本地、非生产环境中调试我自己的一台测试机器。我通常会调试有问题的进程或代码,以便更好地了解它是如何工作的,以及在我进入时需要收集哪些数据。这通常涉及一些逆向工程,并对相关流程或模块进行代码审查。我们总是希望在进行实时调试时尽量减少对生产环境的影响。我称之为设计完美的断点。

我们通常使用几种类型的断点。

最常见的断点是bp,在windbg中设置它很简单:bp 0xaddress。请注意,当您进入用户模式进程时,它会停止进程的执行。当您进入内核调试器时,它会停止整个机器。在这种情况下,我们想知道一旦断点命中,我们将发出什么命令。然后,可以设置断点,以便在插入时自动发出命令。

在遇到断点时运行命令的语法很简单:bp 0xaddress “comand1;command2;…”。例如-bp 0xMYADDRESS “kv;dd g_myGlobal;g” 此命令将在0xMYADDRESS上中断,通过kv转储调用堆栈;将内存转储为从g_MyGlobal地址开始的dword;然后使用g命令继续执行。

简介

我最近研究了一个问题,Winlogon中两个线程的交互导致错误检查。一个线程是初始化GDI的Winlogon线程。这个场景的有趣之处在于另一个线程是如何在这个进程中结束的。

线程在干什么?

下面是线程堆栈的用户一半。线程试图加载DLL

ChildEBP RetAddr Args to Child

0058eaec 773901ad 773901d9 0058eafc
00240022 ntdll!KiFastSystemCallRet

0058eb0c 775d96f3 775d1808
00000000 77e6f032 USER32!NtUserRegisterWindowMessage+0xc0058ed24 775e475500000000 00000001 7c837512 comctl32!InitGlobalMetrics+0x440058ed3c 775e426a00000031 0058ed68 7763490c comctl32!_ProcessAttach+0x980058ed48 7763490c 775d000000000001 00000000 comctl32!DllMain+0x210058ed68 7c81a352 775d000000000001 00000000 comctl32!_DllMainCRTStartup+0x520058ed88 7c833465 776348ba 775d000000000001 ntdll!LdrpCallInitRoutine+0x140058ee90 7c83431100000000 00000000 7c8e2e58 ntdll!LdrpRunInitializeRoutines+0x3670058f124 7c83406500000000 00080e98 0058f3ec ntdll!LdrpLoadDll+0x3cd0058f3a0 77e41bf3 00080e98 0058f3ec 0058f3cc ntdll!LdrLoadDll+0x1980058f408 77e5c70b 7c8e2e5800000000 00000000 kernel32!LoadLibraryExW+0x1b20058f41c 7c92a6a1 7c8e2e5800000000 7c8e2e58 kernel32!LoadLibraryW+0x110058f454 7c92a65f 7c8e2e58 7c8d0000 7c9297b6 SHELL32!SHFusionLoadLibrary+0x2a0058f460 7c9297b600000020 00000008 0058f6a8 SHELL32!DelayLoadCC+0x150058f694 7c929728 0058f6a8 0000007c00000001 SHELL32!SHFusionInitializeIDCC+0x920058f8b4 7c92966f 7c8d0000 0000007c00000001 SHELL32!SHFusionInitializeFromModuleID+0x3a0058f8c8 7c92962c 7c8d000000000001 0058f8f8 SHELL32!_ProcessAttach+0x340058f8d8 7c92bb63 7c8d000000000001 00000000 SHELL32!DllMain+0x270058f8f8 7c81a352 7c8d000000000001 00000000 SHELL32!_DllMainCRTStartup+0x520058f918 7c833465 7c92bb1b 7c8d000000000001 ntdll!LdrpCallInitRoutine+0x140058fa20 7c83431100000000 00000000 00000004 ntdll!LdrpRunInitializeRoutines+0x367

我最近处理的一个棘手的死锁问题开始。让我先解释一下表面症状,然后我们就可以找到好东西了。当运行Vista的用户尝试启动internetexplorer时,任何事情都不会发生。所以他们再次双击图标,还是什么也没发生。所以用户会重新启动并返回他们的网络活动。
经过一些基本的故障排除后发现Iexplore.exe正在运行多次,每次尝试打开浏览器都会导致另一个Iexplore.exe实例。因为没有用户界面,所以我继续收集了一些Iexplore.exe进程转储以及完整的系统转储。
进程转储没有被证明是非常有用的,所以我决定转到完整的内存转储。
因为我知道我们有多个IExplore.exe运行的进程,我想先调查一下。

0: kd>!process 0 0

<snip>PROCESS 87289d90 SessionId:5 Cid: 0fdc Peb: 7ffdc000 ParentCid: 0968DirBase: 7d66c520 ObjectTable: a203a178 HandleCount:205.

Image: iexplore.exe

PROCESS 861a9d90 SessionId:
5Cid: 0d34 Peb: 7ffd9000 ParentCid: 0fdc

DirBase: 7d66c7a0 ObjectTable: a5651a98 HandleCount:
170.

Image: ieuser.exe

PROCESS 86c175b0 SessionId:
5 Cid: 1250 Peb: 7ffd9000 ParentCid: 0968DirBase: 7d66c940 ObjectTable: a0853f10 HandleCount:91.

Image: iexplore.exe

PROCESS 861ac7a8 SessionId:
5 Cid: 1024 Peb: 7ffde000 ParentCid: 0968DirBase: 7d66c620 ObjectTable: a83f7898 HandleCount:91.

Image: iexplore.exe
</snip>