Dump分析系列-3:临界区异常dump分析
Contents
分析一个线上Dump:
为什么eip是int 3,异常应该是BreakPoint,为什么是6 ERROR_INVALID_HANDLE <–> c0000024 STATUS_OBJECT_TYPE_MISMATCH?
是因为调用了RtlRaiseStatus,里面调用捕获当前线程的上下文,RtlCaptureContext会把Context.eip设置成上层调用的返回地址,接着后面触发异常流程。
句柄无效?继续看代码。
RtlpUnWaitCriticalSection函数一看是在解除等待临界区,IDA实现。
找了半天,没有任何线索发现这个句柄是怎么被关闭的,Windows本身只有在DeleteCriticalSection的时候会去关,但是没有代码会删gcsNlsProcessCache,奇了怪了,难道是谁的代码无意关闭掉了?罢了,就研究到这。
想要了解CriticalSection的原理,看下面的文章,写的不错。
《Break Free of Code Deadlocks in Critical Sections Under Windows》
http://bytepointer.com/resources/pietrek_critical_sections_and_deadlocks_2003.htm
翻译:http://blog.csdn.net/paschen/article/details/53090734