Contents

Dump分析系列-3:临界区异常dump分析

Contents

分析一个线上Dump:

/posts/2017/dump-analysis-3-cs/res/1.png

为什么eip是int 3,异常应该是BreakPoint,为什么是6 ERROR_INVALID_HANDLE <–> c0000024 STATUS_OBJECT_TYPE_MISMATCH?

/posts/2017/dump-analysis-3-cs/res/2.png

是因为调用了RtlRaiseStatus,里面调用捕获当前线程的上下文,RtlCaptureContext会把Context.eip设置成上层调用的返回地址,接着后面触发异常流程。

/posts/2017/dump-analysis-3-cs/res/3.png

句柄无效?继续看代码。

/posts/2017/dump-analysis-3-cs/res/4.png

RtlpUnWaitCriticalSection函数一看是在解除等待临界区,IDA实现。

/posts/2017/dump-analysis-3-cs/res/5.png

/posts/2017/dump-analysis-3-cs/res/6.png

/posts/2017/dump-analysis-3-cs/res/7.png

找了半天,没有任何线索发现这个句柄是怎么被关闭的,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