某游戏检测 硬件断点 软件断点之 KiUserExceptionDispatcher 怎么处理

发个用于监视目标程序的反调试的小工具
标 题:发个用于监视目标程序的反调试的小工具
作 者:accessd
时 间:<font color="#10-11-25 15:32:58 链 接:
在软件调试或脱壳的时候经常遇到反调试,但是不知道目标程序用了哪种反调试技术,在什么地方做了反调试。使用这个辅助工具可以看到具体的反调试手段与信息。
注意:如果目标程序检测了peb的DebugFlag位或者NtGlobalFlag位,本工具不输出相关信息。
原理很简单,就是一个调试器
1.在驱动程序中,hook&ZwQueryInformationProcess,检测ProcessDebugPort,hook&ZwQueryObject,&检测DebugObject,&hook&SetInformationThread,&检测ThreadHideFromDebugger,hook&GetContextThread,检测对调试器硬件断点的检测,hook&SetContextThread,&检测清除调试器的硬件断点
2.去掉PEB中的DebugFlag位和NtGlobalFlag位,heap&flag位&等。
3.对KiUserExceptionDispatcher和ZwContinue设置硬件断点,检测异常处理中的反调试
4.在发生CREATE_THREAD_DEBUG_EVENT事件时,对新建线程设置KiUserExceptionDispatcher和ZwContinue硬件断点,检测其他线程中的反调试
5.如果发生单步异常或调试异常之类的事件,也输出异常信息和地址
6.如果目标程序发生了异常(即拦截到了硬件断点KiUserExceptionDispatcher),那么清除context中的调试寄存器,并在执行下一个ZwContinue的时候还原。上传的附件查看: 1861|回复: 5
某游戏检测
硬件断点之 KiUserExceptionDispatcher 怎么处理
阅读权限50
在线时间18 小时
积分主题听众
技法精湛来自于日积月累
论坛严禁灌水,一律永久封禁!</
某游戏检测& &硬件断点之 KiUserExceptionDispatcher 怎么处理
貌似tx在检测上开始校验,开始往算法里钻,这无碍乎会增加分析人员的精力哦
有没有地主,直接放源码阿&&
附加我解决了,,硬件我解决不了,我懒得看了,我就知道里面有很多手和脚???? 联系我时,请说是在 外挂海论坛 上看到的,谢谢!
上一篇:下一篇:
阅读权限30
在线时间1 小时
积分主题听众
阅读权限40
在线时间10 小时
积分主题听众
drx处理之后,还有一个C0000094异常触发校验。此所谓的坑目前来说与看雪所说的坑略有异同。这些都是表面的一些东西,根本的东西其实还就是有一鬼。这一鬼若干年前已被公开。不是什么秘密了,只不过在处理这一鬼的时候不能用以前的粗鲁的办法稍微灵活一点即可。
阅读权限20
在线时间1 小时
积分主题听众
回个帖子,下班咯~
阅读权限100
在线时间26 小时
积分主题听众
支持,楼下的跟上哈~
阅读权限10
在线时间4 小时
积分主题听众
支持楼主,感谢楼主!
Powered by Discuz! X3.2
Comsenz Inc.帐号:密码:下次自动登录{url:/nForum/slist.json?uid=guest&root=list-section}{url:/nForum/nlist.json?uid=guest&root=list-section}
贴数:1&分页:小四★你说你最爱丁香花⊙发信人: hellguard (小四★一寸河山一寸血⊙), 信区: MSDN
标&&题: 4) 在ExecuteHandler或KiUserExceptionDispatcher入口处下断点定位ExceptionAddress
发信站: BBS 水木清华站 (Sun Aug 24 22:18:09 2003), 转信 && 本来是按这个小目录写学习笔记的,结果写4)的时候发现战线会拖得比较长,一个是
篇副膨胀,一个是只能在夜里、周末抽空学Windows,我也估计不来什么时候能写完这
个小目录。正好4)可单独切磋一些调试技巧,主要目的就是定位ExceptionAddress,
先灌了再说。 && 我的理想就是让Windows白痴们(当然,我自己就是典型的白痴)也能跟着走完这个过
程,迈过一些必要的门槛后,剩下的广袤天地就任初来乍到的兄弟们驰骋了,我也帮
不上更多忙啦。 &&&&&& ☆ 深入了解结构化异常处理(Structured Exception Handling) &&&&&&&& 1) C程序员所面对的SEH &&&&&&&& 2) 从汇编语言视角观察SEHDEMO_0.c &&&&&&&& 3) Matt Pietrek的第一个SEH示例 &&&&&&&& 4) 在ExecuteHandler或KiUserExceptionDispatcher入口处下断点定位ExceptionAddress &&&&&&&& 5) ... ... &&&&&&&& 6) ... ... && 4) 在ExecuteHandler或KiUserExceptionDispatcher入口处下断点定位ExceptionAddress && /* &&* Matt Pietrek 1997 &&*/ && #include &stdio.h&
#include &stdlib.h&
#include &windows.h& && static DWORD writable = 0xFFFFFFFF; && static EXCEPTION_DISPOSITION __cdecl seh_func
( &&&& struct _EXCEPTION_RECORD *ExceptionRecord, &&&& void&&&&&&&&&&&&&&&&&&&& *EstablisherFrame, &&&& struct _CONTEXT&&&&&&&&&&*ContextRecord, &&&& void&&&&&&&&&&&&&&&&&&&& *DispatcherContext
{ &&&& printf( "Hello from seh_func()\n" ); &&&& ContextRecord-&Eax = ( DWORD )& &&&& return( ExceptionContinueExecution );
}&&/* end of seh_func */ && int __cdecl main ( int argc, char * argv[] )
{ &&&& __asm &&&& { &&&&&&&& push&&&&seh_func &&&&&&&& push&&&&FS:[0] &&&&&&&& mov&&&& FS:[0],ESP &&&& } &&&& printf( "writable = 0x%08X\n", writable ); &&&& __asm &&&& { &&&&&&&& mov&&&& EAX,0 &&&&&&&& mov&&&& DWORD PTR [EAX],0 &&&& } &&&& printf( "You should see this message\n" &&&&&&&&&&&& "writable = 0x%08X\n", writable &&&&&&&&&& ); &&&& __asm &&&& { &&&&&&&& mov&&&& EAX,[ESP] &&&&&&&& mov&&&& FS:[0],EAX &&&&&&&& add&&&& ESP,8 &&&& } &&&& return( EXIT_SUCCESS );
}&&/* end of main */ && 下面以windbg命令行操作为例进行说明。 && Ctrl-E,选择SEHDEMO_1.exe,另存当前workspace,比如起名SEHDEMO。关闭所有其
它窗口,只留一个命令窗口。 && 指定必要的调试相关的路径信息: &&&&&& .exepath &source path& &&&& .srcpath &source path& &&&& .sympath &source path&;&symbols path& && 加载源代码。重新加载ntdll.dll,使用符号表信息。检查符号表信息已被正确使用: &&&&&& lsf SEHDEMO_1.c &&&& .reload /f ntdll.dll &&&& lml && 应该看到"(pdb symbols)",表示符号表信息正确可用。 && & u main
SEHDEMO_1!main [sehdemo_1.c @ 31]:
&&&&&&&&&&&&&& push&&&&ebp
bec&&&&&&&&&&&& mov&&&& ebp,esp
8104000&&&&&& push&&&&0x401058
ff&& push&&&&dword ptr fs:[]
&& mov&&&& fs:[],esp
0904000&&&&&& mov&&&& eax,[SEHDEMO_1!writable ()]
&&&&&&&&&&&&&& push&&&&eax
5c904000&&&&&& push&&&&0x40905c
3000000&&&&&& call&&&&SEHDEMO_1!printf ()
c408&&&&&&&&&& add&&&& esp,0x8
0000000&&&&&& mov&&&& eax,0x0
0040102e c&&&& mov&&&& dword ptr [eax],0x0
b0d&&&& mov&&&& ecx,[SEHDEMO_1!writable ()]
&&&&&&&&&&&&&& push&&&&ecx
&&&&&& push&&&&0x409070
4000000&&&&&& call&&&&SEHDEMO_1!printf ()
c408&&&&&&&&&& add&&&& esp,0x8
b0424&&&&&&&&&& mov&&&& eax,[esp]
a&&&& mov&&&& fs:[],eax
c408&&&&&&&&&& add&&&& esp,0x8
c0&&&&&&&&&&&& xor&&&& eax,eax
d&&&&&&&&&&&&&& pop&&&& ebp
&&&&&&&&&&&&&& ret
SEHDEMO_1!seh_func [sehdemo_1.c @ 24]:
&&&&&&&&&&&&&& push&&&&ebp
bec&&&&&&&&&&&& mov&&&& ebp,esp
&&&&&& push&&&&0x409044
4000000&&&&&& call&&&&SEHDEMO_1!printf ()
c404&&&&&&&&&& add&&&& esp,0x4
b4510&&&&&&&&&& mov&&&& eax,[ebp+0x10]
0040106b c780b000 mov dword ptr [eax+0xb0],0x409040
c0&&&&&&&&&&&& xor&&&& eax,eax
d&&&&&&&&&&&&&& pop&&&& ebp
&&&&&&&&&&&&&& ret && 在引发异常的指令处下断点,观察此时的_EXCEPTION_REGISTRATION_RECORD结构: && & bp 0040102e "dt _EXCEPTION_REGISTRATION_RECORD poi($teb)"
& g &&&&+0x000 Next&&&&&&&&&&&& : 0x0012ffb0 &&&&+0x004 Handler&&&&&&&&&&: 0x&&&& SEHDEMO_1!seh_func+0
eax= ebx=7ffdf000 ecx= edx= esi=00000a28 edi=
eip=0040102e esp=0012fedc ebp=0012fee4 iopl=0&&&&&&&& nv up ei pl nz na pe nc
cs=001b&&ss=0023&&ds=0023&&es=0023&&fs=0038&&gs=0000&&&&&&&&&&&& efl=
SEHDEMO_1!main+2e:
0040102e c&&&& mov&& dword ptr [eax],0x0 ds:0=???????? && 在seh_func()入口处下断点,观察由系统压栈的四个形参: && & bp seh_func
& gn (不要用g命令继续)
Breakpoint 1 hit
eax= ebx= ecx= edx=77fb1742 esi= edi=
eip= esp=0012fb0c ebp=0012fb2c iopl=0&&&&&&&& nv up ei pl zr na po nc
cs=001b&&ss=0023&&ds=0023&&es=0023&&fs=003b&&gs=0000&&&&&&&&&&&& efl=
SEHDEMO_1!seh_func:
&&&&&&&&&&&&&& push&&&&ebp && 注意,这里要用gn继续,而不是简单的g命令,否则有其它SEH机制在seh_func()之前
介入,给初学者带来不必要的困挠。 && static EXCEPTION_DISPOSITION __cdecl seh_func
( &&&& struct _EXCEPTION_RECORD *ExceptionRecord, &&&& void&&&&&&&&&&&&&&&&&&&& *EstablisherFrame, &&&& struct _CONTEXT&&&&&&&&&&*ContextRecord, &&&& void&&&&&&&&&&&&&&&&&&&& *DispatcherContext
); && & dd esp L5 (RetAddr占了一个DWORD,另加四个形参)
0012fb0c&&77fb172e 0012fbf0 0012fedc 0012fc10
0012fb1c&&0012fbc8
& u 77fb172e
ntdll!ExecuteHandler2+26:
77fb172e 648b&& mov&&&& esp,fs:[]
77fb0000000&& pop&&&& fs:[]
77fb173c 8be5&&&&&&&&&&&& mov&&&& esp,ebp
77fb173e 5d&&&&&&&&&&&&&& pop&&&& ebp
77fb173f c21400&&&&&&&&&& ret&&&& 0x14
& u ExecuteHandler2 77fb1742
ntdll!ExecuteHandler2:
77fb1708 55&&&&&&&&&&&&&& push&&&&ebp
77fb1709 8bec&&&&&&&&&&&& mov&&&& ebp,esp
77fb170b ff750c&&&&&&&&&& push&&&&dword ptr [ebp+0xc]
77fb170e 52&&&&&&&&&&&&&& push&&&&edx
77fb170f 64ff&& push&&&&dword ptr fs:[]
77fb0000000&& mov&&&& fs:[],esp
77fb171d ff7514&&&&&&&&&& push&&&&dword ptr [ebp+0x14]
77fb1720 ff7510&&&&&&&&&& push&&&&dword ptr [ebp+0x10]
77fb1723 ff750c&&&&&&&&&& push&&&&dword ptr [ebp+0xc]
77fb1726 ff7508&&&&&&&&&& push&&&&dword ptr [ebp+0x8]
77fbd18&&&&&&&&&& mov&&&& ecx,[ebp+0x18]
77fb172c ffd1&&&&&&&&&&&& call&&&&ecx
77fb172e 648b&& mov&&&& esp,fs:[]
77fb0000000&& pop&&&& fs:[]
77fb173c 8be5&&&&&&&&&&&& mov&&&& esp,ebp
77fb173e 5d&&&&&&&&&&&&&& pop&&&& ebp
77fb173f c21400&&&&&&&&&& ret&&&& 0x14 && 上述反汇编结果表明进入seh_func()之前,ntdll!ExecuteHandler2()先获得控制权。 && seh_func()的第一形参ExceptionRecord值为0x0012fbf0: && & dt _EXCEPTION_RECORD poi(esp+4) &&&&+0x000 exception_number : 0x&&// DWORD&&&&&&&&&&&&&&&&&&&& ExceptionC &&&&+0x004 exception_flags&&: 0&&&&&&&&&& // DWORD&&&&&&&&&&&&&&&&&&&& ExceptionF &&&&+0x008 exception_record : 0&&&&&&&&&& // struct _EXCEPTION_RECORD *ExceptionR &&&&+0x00c exception_address : 0x40102e&& // PVOID&&&&&&&&&&&&&&&&&&&& ExceptionA &&&&+0x010 number_parameters : 3&&&&&&&&&&// DWORD&&&&&&&&&&&&&&&&&&&& NumberP &&&&+0x014 exception_information : 0&&&&&&// ULONG_PTR&&&&&&&&&&&&&&&& ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
& dd poi(esp+4)+c L1 (查看ExceptionAddress)
0012fbfc&&0040102e && winnt.h中定义了ExceptionCode: && --------------------------------------------------------------------------
#define STATUS_BREAKPOINT&&&&&&&&&&&&&&&&((DWORD&& )0xL)
#define STATUS_ACCESS_VIOLATION&&&&&&&&&&((DWORD&& )0xC0000005L)
-------------------------------------------------------------------------- && seh_func()的第二形参EstablisherFrame值为0x0012fedc,SEHDEMO_1.exe执行到引
发异常的指令时,ESP寄存器的值正是0x0012fedc,二者之间应该有关联。 && seh_func()的第三形参ContextRecord值为0x0012fc10: && & dt _CONTEXT poi(esp+0n12) &&&&+0x000 ContextFlags&&&& : 0x1003f &&&&+0x004 Dr0&&&&&&&&&&&&&&: 0 &&&&+0x008 Dr1&&&&&&&&&&&&&&: 0 &&&&+0x00c Dr2&&&&&&&&&&&&&&: 0 &&&&+0x010 Dr3&&&&&&&&&&&&&&: 0 &&&&+0x014 Dr6&&&&&&&&&&&&&&: 0xc &&&&+0x018 Dr7&&&&&&&&&&&&&&: 0 &&&&+0x01c FloatSave&&&&&&&&: _FLOATING_SAVE_AREA &&&&+0x08c SegGs&&&&&&&&&&&&: 0 &&&&+0x090 SegFs&&&&&&&&&&&&: 0x38 &&&&+0x094 SegEs&&&&&&&&&&&&: 0x23 &&&&+0x098 SegDs&&&&&&&&&&&&: 0x23 &&&&+0x09c Edi&&&&&&&&&&&&&&: 0 &&&&+0x0a0 Esi&&&&&&&&&&&&&&: 0xa28 &&&&+0x0a4 Ebx&&&&&&&&&&&&&&: 0x7ffdf000 &&&&+0x0a8 Edx&&&&&&&&&&&&&&: 1 &&&&+0x0ac Ecx&&&&&&&&&&&&&&: 0x4090d0 &&&&+0x0b0 Eax&&&&&&&&&&&&&&: 0 &&&&+0x0b4 Ebp&&&&&&&&&&&&&&: 0x12fee4 &&&&+0x0b8 Eip&&&&&&&&&&&&&&: 0x40102e &&&&+0x0bc SegCs&&&&&&&&&&&&: 0x1b &&&&+0x0c0 EFlags&&&&&&&&&& : 0x202 &&&&+0x0c4 Esp&&&&&&&&&&&&&&: 0x12fedc &&&&+0x0c8 SegSs&&&&&&&&&&&&: 0x23 &&&&+0x0cc ExtendedRegisters : [512]&&"???" && seh_func()的第四形参DispatcherContext值为0012fbc8,目前我还不清楚它的含义。 && 观察此刻的调用栈回溯信息: && & kPn &&# ChildEBP RetAddr
00 fb172e SEHDEMO_1!seh_func( &&&&&&&&&&&&&&&&&&&&&&&& _EXCEPTION_RECORD* ExceptionRecord = 0012fbf0 , &&&&&&&&&&&&&&&&&&&&&&&& void* EstablisherFrame = 0012fedc , &&&&&&&&&&&&&&&&&&&&&&&& _CONTEXT* ContextRecord = 0012fc10 , &&&&&&&&&&&&&&&&&&&&&&&& void* DispatcherContext = 0012fbc8 ) [sehdemo_1.c @ 24]
01 fb1700 ntdll!ExecuteHandler2+0x26
02 0012fbd8 77f75dba ntdll!ExecuteHandler+0x24
& u ExecuteHandler 77fb1706
ntdll!ExecuteHandler:
77fb16dc 53&&&&&&&&&&&&&& push&&&&ebx
77fb16dd 56&&&&&&&&&&&&&& push&&&&esi
77fb16de 57&&&&&&&&&&&&&& push&&&&edi
77fb16df 33c0&&&&&&&&&&&& xor&&&& eax,eax
77fb16e1 33db&&&&&&&&&&&& xor&&&& ebx,ebx
77fb16e3 33f6&&&&&&&&&&&& xor&&&& esi,esi
77fb16e5 33ff&&&&&&&&&&&& xor&&&& edi,edi
77fb16e7 ff742420&&&&&&&& push&&&&dword ptr [esp+0x20]
77fb16eb ff742420&&&&&&&& push&&&&dword ptr [esp+0x20]
77fb16ef ff742420&&&&&&&& push&&&&dword ptr [esp+0x20]
77fb16f3 ff742420&&&&&&&& push&&&&dword ptr [esp+0x20]
77fb16f7 ff742420&&&&&&&& push&&&&dword ptr [esp+0x20]
77fb16fb e&&&&&& call&&&&ntdll!ExecuteHandler2 (77fb1708)
77fb1700 5f&&&&&&&&&&&&&& pop&&&& edi
77fb1701 5e&&&&&&&&&&&&&& pop&&&& esi
77fb1702 5b&&&&&&&&&&&&&& pop&&&& ebx
77fb&&&&&&&&&& ret&&&& 0x14 && 我所能想到的,在ntdll!ExecuteHandler()入口处下断点定位ExceptionAddress。
seh_func()的第一形参源自ExecuteHandler2()的[ebp+0x8],也就是后者的第一形参。
ExecuteHandler2()的第一形参源自ExecuteHandler()的第一形参。直接看上述反汇
编代码,可能不太容易得出这个结论,那我就画副栈区(stack)示意图好了: && --------------------------------------------------------------------------
内存高址方向
--------------------------------------------------------------------------
RetAddr&&&&&&&&&&&&&&&&&&&& &- Original ESP
--------------------------------------------------------------------------
EDI&&&&&&&&&&&&&&&&&&&&&&&& &- Current ESP = Original ESP - 0x0c
--------------------------------------------------------------------------
ExecuteHandler2()的第五形参 = [Original ESP+0x14]
ExecuteHandler2()的第四形参 = [Original ESP+0x10]
ExecuteHandler2()的第三形参 = [Original ESP+0x0c]
ExecuteHandler2()的第二形参 = [Original ESP+0x08]
ExecuteHandler2()的第一形参 = [Original ESP+0x04]
--------------------------------------------------------------------------
内存低址方向
-------------------------------------------------------------------------- && 一个附带的、自然而然的结论,seh_func()的四个形参直接对应ExecuteHandler()的
前四个形参。 && 好了,现在让我们重新执行SEHDEMO_1.exe,直接在在ntdll!ExecuteHandler()入口
处下断点,并定位ExceptionAddress: && & .restart
& bp ntdll!ExecuteHandler "dd poi(esp+4)+c L1"
(4e4.7a4): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax= ebx=7ffdf000 ecx= edx= esi=00000a28 edi=
eip=0040102e esp=0012fedc ebp=0012fee4 iopl=0&&&&&&&& nv up ei pl nz na pe nc
cs=001b&&ss=0023&&ds=0023&&es=0023&&fs=0038&&gs=0000&&&&&&&&&&&& efl=
SEHDEMO_1!main+2e:
0040102e c&&&& mov&& dword ptr [eax],0x0 ds:0=????????
40102e (定位ExceptionAddress)
eax=0012fbcc ebx=0012fedc ecx=0012fbd4 edx=77fb1742 esi=0012fbf4 edi=
eip=77fb16dc esp=0012fb58 ebp=0012fbdc iopl=0&&&&&&&& nv up ei pl zr na po nc
cs=001b&&ss=0023&&ds=0023&&es=0023&&fs=003b&&gs=0000&&&&&&&&&&&& efl=
ntdll!ExecuteHandler:
77fb16dc 53&&&&&&&&&&&&&& push&&&&ebx && 在这里我g了两次,第一次停下来是windbg的SEH机制起作用了,第二次才是自设断点
起作用了。可以看到,由于windbg自身有增强型SEH机制存在,并不需要自设断点即
可定位ExceptionAddress。但是,从更广泛兼容性来讲,应该掌握自设断点定位法。 && 现在已知ExceptionAddress为0x0040102e,查看调用栈回溯信息: && & kPn &&# ChildEBP RetAddr&&
00 0012fbdc 77f75dba ntdll!ExecuteHandler
01 e7a479 ntdll!KiUserExceptionDispatcher+0xe
02 e61a90 kernel32!BaseSetLastNTError+0x13
03 0012fee4
kernel32!ReadProcessMemory+0x2f
04 0012ffc0 77e814c7 SEHDEMO_1!mainCRTStartup( void )+0x170 [crt\src\crt0.c @ 259]
05 0012fff0
kernel32!BaseProcessStart+0x23
& u KiUserExceptionDispatcher 77f75dba (第二个地址参数来自RetAddr)
ntdll!KiUserExceptionDispatcher:
77f75dac 8b4c2404&&&&&&&& mov&&&& ecx,[esp+0x4]
77f75db0 8b1c24&&&&&&&&&& mov&&&& ebx,[esp]
77f75db3 51&&&&&&&&&&&&&& push&&&&ecx
77f75db4 53&&&&&&&&&&&&&& push&&&&ebx
77f75db5 e8bc1a0200&&&&&& call&&&&ntdll!RtlDispatchException (77f97876) && 我并不清楚KiUserExceptionDispatcher与ExecuteHandler如何联系起来的,看到过
一个伪函数原型: && RtlDispatchException
( &&&& PEXCEPTION_RECORD&&pExcptRec, &&&& CONTEXT&&&&&&&&&& *pContext
) && 意味着上述反汇编代码中[ESP]对应pExcptRec,[ESP+4]对应pContext。 && 重新执行SEHDEMO_1.exe,直接在ntdll!KiUserExceptionDispatcher处下断点,并定
位ExceptionAddress: && & .restart
& bp ntdll!KiUserExceptionDispatcher "dd poi(esp)+c L1"
(71c.270): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax= ebx=7ffdf000 ecx= edx= esi=00000a28 edi=
eip=0040102e esp=0012fedc ebp=0012fee4 iopl=0&&&&&&&& nv up ei pl nz na pe nc
cs=001b&&ss=0023&&ds=0023&&es=0023&&fs=0038&&gs=0000&&&&&&&&&&&& efl=
SEHDEMO_1!main+2e:
0040102e c&&&& mov&& dword ptr [eax],0x0 ds:0=????????
40102e (定位ExceptionAddress)
eax= ebx=7ffdf000 ecx= edx= esi=00000a28 edi=
eip=77f75dac esp=0012fbec ebp=0012fee4 iopl=0&&&&&&&& nv up ei pl nz na pe nc
cs=001b&&ss=0023&&ds=0023&&es=0023&&fs=003b&&gs=0000&&&&&&&&&&&& efl=
ntdll!KiUserExceptionDispatcher:
77f75dac 8b4c2404&&&&&&&& mov&&&& ecx,[esp+0x4]&&&& ss:fbf0=0012fc10 && 接下来尝试用SoftICE定位ExceptionAddress。重新编译SEHDEMO_1.c,去掉调试信息。 && 后面的操作基于远程SoftICE调试。Ctrl-Z呼出远程SoftICE,下断点: && :faults off
:bpx BaseProcessStart
:x && 执行SEHDEMO_1.exe,SoftICE弹出: && EAX=004010CA&& EBX=7FFDF000&& ECX=&& EDX=&& ESI=
EDI=77F517E6&& EBP=&& ESP=0012FFF4&& EIP=77E814A4&& o d I s Z a P c
CS=001B&& DS=0023&& SS=0023&& ES=0023&& FS=0038&& GS=0000
─────_BaseProcessStart───────────────────PROT32─
_BaseProcessStart
001B:77E814A4&&6A0C&&&&&&&&&&&&&&&&PUSH&&&&&&0C
001B:77E814A6&&&&&&&&&&&&PUSH&&&&&&77E91210
001B:77E814AB&&E8288EFFFF&&&&&&&&&&CALL&&&&&&__SEH_prolog
001B:77E814B0&&8365FC00&&&&&&&&&&&&AND&&&&&& DWORD PTR [EBP-04],00
001B:77E814B4&&6A04&&&&&&&&&&&&&&&&PUSH&&&&&&04
001B:77E814B6&&8D4508&&&&&&&&&&&&&&LEA&&&&&& EAX,[EBP+08]
001B:77E814B9&&50&&&&&&&&&&&&&&&&&&PUSH&&&&&&EAX
001B:77E814BA&&6A09&&&&&&&&&&&&&&&&PUSH&&&&&&09
001B:77E814BC&&6AFE&&&&&&&&&&&&&&&&PUSH&&&&&&FE
001B:77E814BE&&FF159C13E677&&&&&&&&CALL&&&&&&[__imp__NtSetInformationThread]
001B:77E814C4&&FF5508&&&&&&&&&&&&&&CALL&&&&&&[EBP+08]
001B:77E814C7&&50&&&&&&&&&&&&&&&&&&PUSH&&&&&&EAX
001B:77E814C8&&E8C235FFFF&&&&&&&&&&CALL&&&&&&_ExitThread
001B:77E814CD&&CC&&&&&&&&&&&&&&&&&&INT&&&&&& 3
(PASSIVE)-KTEB(810E06C8)-TID(06E4)──kernel32!.text+──────
Break due to BP 00: BPX _BaseProcessStart&&(ET=8.34 seconds) && 用G命令执行到001B:77E814C4,然后T命令单步跟进去: && :g 77E814C4
Break due to G (ET=2.07 milliseconds)
:t && EAX=&& EBX=7FFDF000&& ECX=0012FFB0&& EDX=7FFE0304&& ESI=
EDI=77F517E6&& EBP=0012FFF0&& ESP=0012FFC4&& EIP=004010CA&& o d I s z a P c
CS=001B&& DS=0023&& SS=0023&& ES=0023&& FS=0038&& GS=0000
─────────────────────────────────PROT32─
001B:004010CA&&6A18&&&&&&&&&&&&&&&&PUSH&&&&&&18
001B:004010CC&&68D0604000&&&&&&&&&&PUSH&&&&&&
001B:&&E8A6160000&&&&&&&&&&CALL&&&&&&0040277C
(PASSIVE)-KTEB(810E06C8)-TID(06E4)──SEHDEMO_1!.text+00CA──────── && 你会发现已经进入SEHDEMO_1.exe进程空间,其实这就是不利用Symbol Loader而中断
在程序总入口点的办法。 && :mod SEHDEMO_1
hMod Base&&&& PEHeader Module Name&&&&&&File Name &&&&&&000D8 SEHDEMO_1&&&&&&&&\onlytemp\SEHDEMO_1.exe &&&&&&&&&&&&&& ^^^^^^^^
:? *(+0a*4)
&void *& = 0x000010CA (显示AddressOfEntryPoint)
:? *(+0d*4)
&void *& = 0x (显示ImageBase)
:? 000010CA+
&ulong& = 0x4010CA, "@\x10\xCA" && 程序在内存中的总入口点是0x004010CA,这与其它办法所获取的信息相符。在此设置
bpx断点,由于已经在SEHDEMO_1.exe进程空间内,该bpx断点有效并可以保持到下次
执行SEHDEMO_1.exe时。 && :bc *
:bpx 004010CA
Break due to BP 00: BPX #001B:004010CA&&(ET=2.78 milliseconds)
:g && 重新执行SEHDEMO_1.exe,直接中断在程序总入口点处,另下一个断点: && Break due to BP 00: BPX #001B:004010CA&&(ET=32.54 seconds)
:bpx KiUserExceptionDispatcher do "dd (*esp)+c L10"
Break due to BP 01: BPX _KiUserExceptionDispatcher&&DO "dd (*esp)+c L10" &&&& (ET=5.46 milliseconds)
FC00 0040102D&&000000&&&&&&-.@............. &&&&&&&&&&&&&& ^^^^^^^^
:u 0040102D
001B:0040102D&&C&&&&&&&&MOV&&&&&& DWORD PTR [EAX],
001B:&&FF&&&&&&&&PUSH&&&&&&DWORD PTR []
001B:&&&&&&&&&&PUSH&&&&&&
001B:0040103E&&E&&&&&&&&&&CALL&&&&&&
001B:&&&&&&&&&&&&&&&&&&POP&&&&&& ECX
001B:&&&&&&&&&&&&&&&&&&POP&&&&&& ECX
001B:B0424&&&&&&&&&&&&&&MOV&&&&&& EAX,[ESP]
001B:A&&&&&&&&MOV&&&&&& FS:[],EAX && ExceptionAddress值为0x0040102D,反汇编该处代码,下断点: && :bc *
:bpx 0040102D
Break due to BP 00: BPX #001B:0040102D&&(ET=3.27 milliseconds)
001B:0040102D&&C&&&&&&&&MOV&&&&&& DWORD PTR [EAX],&&DS:004080
:g && 重新执行SEHDEMO_1.exe,直接中断在ExceptionAddress处: && Break due to BP 00: BPX #001B:0040102D&&(ET=90.49 seconds)
001B:0040102D&&C&&&&&&&&MOV&&&&&& DWORD PTR [EAX],&&DS:000000 && 虽然对SEH还是很陌生,但这次旅行已经让我初步了解如何利用SEH机制定位导致异常
的代码点(ExceptionAddress),或许该换个小标题,不是吗。 && -- &&&&&&&&&&&&&& 也许有一天,他再从海上蓬蓬的雨点中升起, &&&&&&&&&&&& 飞向西来,再形成一道江流,再冲倒两旁的石壁, &&&&&&&&&&&& 再来寻夹岸的桃花。然而,我不敢说来生,也不敢信来生...... &&&& ※ 来源:·BBS 水木清华站 smth.org·[FROM: 211.167.254.72]
文章数:1&分页:
抽奖到手软!将狂欢进行到底!

我要回帖

更多关于 硬件断点 的文章

 

随机推荐