cff资源管理器成功添加了
部分,但是如果我执行生成的可执行文件
我遇到错误: br />“启动应用程序时出错(0xc000007b)...”
我想了解为何修改后的应用程序崩溃
#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
评论
在特征列中,数字是什么另外,您是否对该程序进行了其他修改?您采取了什么步骤?因为我可以添加一个部分而不会出现该错误,并且如果我故意破坏了Optional Header也会出现该错误。对我来说,这意味着您在编辑程序时可能犯了一个错误。
@Samson E00000E0
@Samson老实说,我没有编辑其他任何内容。我只是添加了一个部分(空白区域),并添加了所有内容,
奇怪的是您没有编辑其他任何东西,并且遇到了问题。您可以发送经过编辑的有问题的可执行文件吗?