我在此可执行文件中添加了一个部分外部链接,以使用cff资源管理器从Windows XP中下载名为Winmine的可执行文件。手动或以其他方式
cff资源管理器成功添加了

部分,但是如果我执行生成的可执行文件

我遇到错误: br />“启动应用程序时出错(0xc000007b)...”


我想了解为何修改后的应用程序崩溃



评论

在特征列中,数字是什么

另外,您是否对该程序进行了其他修改?您采取了什么步骤?因为我可以添加一个部分而不会出现该错误,并且如果我故意破坏了Optional Header也会出现该错误。对我来说,这意味着您在编辑程序时可能犯了一个错误。

@Samson E00000E0

@Samson老实说,我没有编辑其他任何内容。我只是添加了一个部分(空白区域),并添加了所有内容,

奇怪的是您没有编辑其他任何东西,并且遇到了问题。您可以发送经过编辑的有问题的可执行文件吗?

#1 楼

blabb的答案可能与所编辑的二进制文件中的错误有关,是正确的,但是建议不要使用内核调试器来查找有问题的堆栈。 XP,而不是像您这样的7。除了XP上的NTSTATUS是0xC0000135而不是0xC000007B以外,效果几乎相同。

我们打开WinDbg并执行二进制文件:

Microsoft (R) Windows Debugger Version 6.12.0002.633 X86
Copyright (c) Microsoft Corporation. All rights reserved.

CommandLine: "C:\Documents and Settings\Administrator\My Documents\Downloads\Winmine - XP - копия.exe"
Symbol search path is: *** Invalid ***
****************************************************************************
* Symbol loading may be unreliable without a symbol search path.           *
* Use .symfix to have the debugger choose a symbol path.                   *
* After setting your symbol path, use .reload to refresh symbol locations. *
****************************************************************************
Executable search path is: 
ModLoad: 01000000 01021000   winmine.exe
ModLoad: 7c900000 7c9b2000   ntdll.dll
ModLoad: 7c800000 7c8f6000   C:\WINDOWS\system32\kernel32.dll


弹出消息框:



我们不会关闭该消息框。取而代之的是,我们闯入WinDbg:

Break-in sent, waiting 30 seconds...
WARNING: Break-in timed out, suspending.
         This is usually caused by another thread holding the loader lock
(b58.e64): Wake debugger - code 80000007 (first chance)
eax=c0000135 ebx=00000000 ecx=00000a2b edx=00090608 esi=7ffdfc00 edi=c0000135
eip=7c90e514 esp=0006f6f0 ebp=0006f7d4 iopl=0         nv up ei pl nz na po cy
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000203
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for ntdll.dll - 
ntdll!KiFastSystemCallRet:
7c90e514 c3              ret


是的,实际上需要30秒。
0:000> ~* k

.  0  Id: b58.e64 Suspend: 1 Teb: 7ffdf000 Unfrozen
ChildEBP RetAddr  
WARNING: Stack unwind information not available. Following frames may be wrong.
0006f7d4 7c91c880 ntdll!KiFastSystemCallRet
0006fa34 7c9246f2 ntdll!LdrDisableThreadCalloutsForDll+0xce
0006fa78 7c92469b ntdll!sprintf+0x13e
0006fa98 7c9247d5 ntdll!sprintf+0xe7
0006fb14 7c920244 ntdll!sprintf+0x221
0006fc94 7c91fad7 ntdll!RtlInitMemoryStream+0x2e8
0006fd1c 7c90e457 ntdll!RtlLookupElementGenericTable+0x80
00000000 00000000 ntdll!KiUserApcDispatcher+0x7

   1  Id: b58.324 Suspend: 1 Teb: 7ffde000 Unfrozen
ChildEBP RetAddr  
WARNING: Stack unwind information not available. Following frames may be wrong.
0028fc98 7c901046 ntdll!KiFastSystemCallRet
0028fd18 7c90e457 ntdll!RtlEnterCriticalSection+0x46
00000000 00000000 ntdll!KiUserApcDispatcher+0x7


第二个线程可能用于与CSRSS进行通信以显示消息或类似内容,这并不是很有趣。第一个线程很重要,它的符号都弄乱了。

我们解决一下:堆栈blabb,没有任何内核调试。即使我自己这么说也很了不起。

顺便说一句,第二个线程的堆栈仍然没有意思:

0:000> lm
start    end        module name
01000000 01021000   winmine    (deferred)             
7c800000 7c8f6000   kernel32   (deferred)             
7c900000 7c9b2000   ntdll      (export symbols)       C:\WINDOWS\system32\ntdll.dll
0:000> .symfix+
0:000> .reload /f
Reloading current modules
...
0:000> lm
start    end        module name
01000000 01021000   winmine    (pdb symbols)          C:\Documents and Settings\Administrator\Desktop\debugger_x86\sym\winmine.pdbB7D84751\winmine.pdb
7c800000 7c8f6000   kernel32   (pdb symbols)          C:\Documents and Settings\Administrator\Desktop\debugger_x86\sym\kernel32.pdb\A02FC3EC19B4474FB75641AF4C5B031C2\kernel32.pdb
7c900000 7c9b2000   ntdll      (pdb symbols)          C:\Documents and Settings\Administrator\Desktop\debugger_x86\sym\ntdll.pdb\CEFC0863B1F84130A11E0F54180CD21A2\ntdll.pdb
0:000> k
ChildEBP RetAddr  
0006f6ec 7c90d9ca ntdll!KiFastSystemCallRet
0006f6f0 7c9423a9 ntdll!NtRaiseHardError+0xc
0006f7d4 7c91c880 ntdll!LdrpMapDll+0x1b8
0006fa34 7c9246f2 ntdll!LdrpLoadImportModule+0x174
0006fa78 7c92469b ntdll!LdrpHandleOneNewFormatImportDescriptor+0x53
0006fa98 7c9247d5 ntdll!LdrpHandleNewFormatImportDescriptors+0x20
0006fb14 7c920244 ntdll!LdrpWalkImportDescriptor+0x19e
0006fc94 7c91fad7 ntdll!LdrpInitializeProcess+0xe1c
0006fd1c 7c90e457 ntdll!_LdrpInitialize+0x183
00000000 00000000 ntdll!KiUserApcDispatcher+0x7


我们可以看看这些函数的参数并在绑定的导入表中查看问题:

0:000> ~1 k
ChildEBP RetAddr  
0028fc0c 7c90df5a ntdll!KiFastSystemCallRet
0028fc10 7c919b23 ntdll!NtWaitForSingleObject+0xc
0028fc98 7c901046 ntdll!RtlpWaitForCriticalSection+0x132
0028fca0 7c924d2d ntdll!RtlEnterCriticalSection+0x46
0028fd18 7c90e457 ntdll!_LdrpInitialize+0xf0
00000000 00000000 ntdll!KiUserApcDispatcher+0x7


如果要跟踪加载过程,而不是失败后仅查看堆栈您也可以使用用户模式调试器来执行此操作。已解决:

0:000> kb
ChildEBP RetAddr  Args to Child              
0006f6ec 7c90d9ca 7c9423a9 c0000135 00000002 ntdll!KiFastSystemCallRet
0006f6f0 7c9423a9 c0000135 00000002 00000003 ntdll!NtRaiseHardError+0xc
0006f7d4 7c91c880 00020498 7ffdfc00 00000000 ntdll!LdrpMapDll+0x1b8
0006fa34 7c9246f2 00020498 010002ab 01000000 ntdll!LdrpLoadImportModule+0x174
0006fa78 7c92469b 7ffd6000 00020498 00191ee0 ntdll!LdrpHandleOneNewFormatImportDescriptor+0x53
0006fa98 7c9247d5 7ffd6000 00020498 00191ee0 ntdll!LdrpHandleNewFormatImportDescriptors+0x20
0006fb14 7c920244 00020498 00191ee0 7ffdf000 ntdll!LdrpWalkImportDescriptor+0x19e
0006fc94 7c91fad7 0006fd30 7c900000 0006fce0 ntdll!LdrpInitializeProcess+0xe1c
0006fd1c 7c90e457 0006fd30 7c900000 00000000 ntdll!_LdrpInitialize+0x183
00000000 00000000 00000000 00000000 00000000 ntdll!KiUserApcDispatcher+0x7
0:000> du 7ffdfc00 
7ffdfc00  "NEL32.dll"
0:000> db 010002ab
010002ab  4e 45 4c 33 32 2e 64 6c-6c 00 47 44 49 33 32 2e  NEL32.dll.GDI32.
010002bb  64 6c 6c 00 55 53 45 52-33 32 2e 64 6c 6c 00 53  dll.USER32.dll.S
010002cb  48 45 4c 4c 33 32 2e 64-6c 6c 00 57 49 4e 4d 4d  HELL32.dll.WINMM
010002db  2e 64 6c 6c 00 43 4f 4d-43 54 4c 33 32 2e 64 6c  .dll.COMCTL32.dl
010002eb  6c 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  l...............
010002fb  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
0100030b  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
0100031b  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................


OMG这是什么?!仅加载winmine吗?但是我们知道ntdll从一开始就被映射到每个Win32进程中。

好吧,实际上已经映射了ntdll,但是调试器仍然没有得到有关它的调试事件。这就是我们进行流程初始化过程的早期时间。然后,我们可以在sxe ld ntdll等上放置断点:

0:000> sxe cpr
0:000> .restart
CommandLine: "C:\Documents and Settings\Administrator\My Documents\Downloads\Winmine - XP - копия.exe"
Symbol search path is: srv*
Executable search path is: 
eax=01003e21 ebx=7ffd4000 ecx=7c910060 edx=7c90e920 esi=0078c60c edi=00ecf554
eip=7c810735 esp=0006fffc ebp=7c91005d iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=0038  gs=0000             efl=00000200
7c810735 ??              ???
0:000> lm
start    end        module name
01000000 01021000   winmine    (deferred)             
0:000> k
ChildEBP RetAddr  
WARNING: Frame IP not in any known module. Following frames may be wrong.
0006fff8 00000000 0x7c810735


这里绝对不需要内核调试。 br />

#2 楼

您的exe的导入表地址位于0x248(最后一节的末尾),而cff Explorer正在覆盖这些条目(从带有时间戳的kernel32.dll绑定导入
>这就是为什么它崩溃的原因

5.1.2600.0  3B7DFE0E (18th August 2001)     926,720     Windows XP 


原始exe绑定的导入模块名是@ vcvc.dll从起始位置偏移0x48。

,但是在cff Explorer中编辑的exe中,绑定的导入表已损坏

dumpbin /headers Winmine_test.exe | grep -i bound
             248 [      A8] RVA [size] of Bound Import Directory


绑定的导入表模块名称作为偏移量给出,因此第一个偏移量是0x74

C:\wdscr\cfftest>xxd -s 0x248 -g4 -l 0xa8 "W
0000248: 0efe7d3b 48000000 0efe7d3b 53000000
0000258: 0efe7d3b 60000000 0efe7d3b 6d000000
0000268: 0efe7d3b 77000000 0ffe7d3b 82000000
0000278: 13fe7d3b 8e000000 32fe7d3b 98000000
0000288: 00000000 00000000 6d737663 72742e64


所以248 + 74 = 0x2bc
>
6c6c0055 53455233 322e646c 32.d ** ll。** USER32.dl

您无法用用户模式调试器捕获此错误,因为初始化代码
在调试器获取之前运行有机会附加

如果您在连接到内核调试器的vm中运行此exe,则可以观看b如果您在

xxd -s 0x248 -g 4 -l 0xa8 Winmine_test.exe
0000248: 2e746573 **74000000** 00100000 00000200  .test...........
0000258: 00100000 00d40100 00000000 00000000  ................
0000268: 00000000 200000e0 0ffe7d3b 82000000  .... .....};....
0000278: 13fe7d3b 8e000000 32fe7d3b 98000000  ..};....2.};....
0000288: 00000000 00000000 6d737663 72742e64  ........msvcrt.d
0000298: 6c6c0041 44564150 4933322e 646c6c00  ll.ADVAPI32.dll.
00002a8: 4b45524e 454c3332 2e646c6c 00474449  KERNEL32.dll.GDI
00002b8: 33322e64 6c6c0055 53455233 322e646c  32.dll.USER32.dl
00002c8: 6c005348 454c4c33 322e646c 6c005749  l.SHELL32.dll.WI
00002d8: 4e4d4d2e 646c6c00 434f4d43 544c3332  NMM.dll.COMCTL32
00002e8: 2e646c6c 00000000                    .dll....

上设置中断,则声音导入失败,还可以在上下文中启用gflag + sls(显示加载程序快照)以使加载程序快照弹出该Winmine绑定到ll.dll,然后尝试在不存在的dll中导入导入文件

0000248: 2e746573 74000000


评论


内核调试完全没有必要。所有这些都可以使用WinDbg作为用户调试器来完成。

– conio
17年9月6日在16:39