![d5740407d6856807d5b9190079052037.png](https://i-blog.csdnimg.cn/blog_migrate/e8d77271a25a771bf916d56efd405d8b.jpeg)
背景
自己手里有一个用duilib开发的工具在某一个用户那边高频崩溃。只要一启动就崩溃,一天崩溃几十次,很奇怪。从用户那边抓取dump文件回来,调出windbg进行调试查找原因。
过程
1. 准备好pdb及源码文件,windbg加载dump起来。命令行输入.ecxr, 然后切换看堆栈如下:
![60dbf4f9dd8554ebe30779d0aafdca8e.png](https://i-blog.csdnimg.cn/blog_migrate/51d5e8519cd029fe7750a260c20e1e21.png)
报错的代码在这里:
![f34043093583b618b9210f2bde1531ac.png](https://i-blog.csdnimg.cn/blog_migrate/05bb1a6a1ee7c0afea4b17275a8c5de9.jpeg)
这个工具是用duilib做的界面,handleMessage处理消息后跳转到CWebBrowserUI::AddRef中,但是我的代码里根本就没有用到CWebBrowserUI这个类,怎么会跳转到这个类中呢?奇怪。
2. 然后查看了local,thread等信息都没有找到有用的线索。
3. 怀疑堆栈不准, 但windbg加载pdb文件又能加载起来,对应的代码也能找到,理论上来看应该是准的。但是代码里根本就没有写,但是堆栈却跳转到这个类里了,莫名其妙。
4. 问了一下组内的另一大神,分析了一下,给出了一个思路:EIP寄存器。EIP寄存器,用来存储CPU要读取指令的地址,CPU通过EIP寄存器读取即将要执行的指令。查看EIP寄存器的值,看一下它下一步要执行的动作是什么?
5. 查看EIP的值
![6b550243ce92bbc6330638ace4a5a893.png](https://i-blog.csdnimg.cn/blog_migrate/b819a8ea12fb173fc4bc67f069f55210.jpeg)
可以看见EIP的内存地址,通过windbg memory窗口可以看到对应的值
![0d5fbebc3dccf8f149404dc4877cac61.png](https://i-blog.csdnimg.cn/blog_migrate/9eb5d2a1741814befbf3b6121e5485dd.png)
看memory的值,竟然看见了Trojan的字样。觉得这个工具可能是中了病毒或者木马。
6. 通过抓取的dump挨个分析,发现只要是出现崩溃堆栈是这样的,exe的名字都是同一个,基本上确认是同一个exe,被病毒或木马感染导致崩溃。因为没有办法联系到用户,所以还只是猜测。