昨天zhengwei同学说他机器上的一个BHO不能正常加载,我把BHO的代码拿过来,在我的两台机器上都验证了一下,一台是Win7+IE8的环境,一台是XP+IE7的环境,都能正常加载。zhengwei的机器是IE6+XP的环境,不能正常加载,升级到IE7后,还是不能加载。排除了是操作系统,以及IE版本的原因。会不会是IE安全设置的原因呢?没有听说过IE安全设置会影响到BHO加载的,还是试了试,同时把他机器上的360也给关了。问题还是没有解决。怎么办?只有上调试器了WinDbg了。

使用WinDbg如何来找查找问题的原因。分析了一下,在我自己的机器上和他的机器上同时开WinDbg,比较能加载和不能加载两个环境下,IE加载BHO的代码执行的路径,就能够找到问题的原因。

因此,第一个问题是,IE是如何加载BHO的?映像中好像没有哪里有文档说这个问题。但是BHO是一个DLL,DLL加载有两种方式,静态加载和动态加载。BHO肯定不是静态加载(为什么?)。动态加载肯定要调用LoadLibrary或者LoadLibraryEx,每个函数又有Ansi和Unicode的两个版本,因为实际上是LoadLibraryA、LoadLibraryW、LoadLibraryExA、LoadLibraryExW四个函数。在这四个函数上设置断点,肯定能够找到断到BHO被加载(当然也可能是别的非BHO的DLL被动态加载)。其实根据经验,只要在LoadLibraryExW设置断点就可以了。好了,可以在WinDbg中开始了。

打开WinDbg,从菜单项File中选择Open Executable…,找到iexplore.exe,打开。这时调试器会断下来,使用命令 bp kernel32!LoadLibraryExW,继续执行。调试器断下后,使用kv命令看调用栈,连着看了几个,都是加载的别的DLL,不是BHO。这样看下去肯定会看到BHO被加载,算了,换个别的思路。

知道的BHO模块的名字叫做test.dll,直接设置模块加载断点就可以了。重新启动WinDbg,加载IE,设置断点 sxe ld:test.dll,继续执行,断下来了,使用kv n 0x100(n 0x100参数是指定调用栈的层数)看调用栈,调用栈如图一。

图一

第06行印证了上面的结论,确实是使用了LoadLibraryExW加载的,至于为什么是KERNELBASE而不是kernel32,是因为这是Win7上的截图,Win7上就是KERNELBASE。另外看行,IE加载BHO使用了一个重要的函数IEFRAME中CShellBrowser2类中的_LoadBrowserHelperObjects函数。好了,可以在出问题的机器上工作了。

在出问题的机器上,在IEFRAME上设置一个断点,不过,WinDbg加载IE启动时,直接bp IEFRAME!CShellBrowser2::_LoadBrowserHelperObjects,你会得到一个如下的错误,0:000> bp IEFRAME!CShellBrowser2::_LoadBrowserHelperObjects

Bp expression 'IEFRAME!CShellBrowser2::_LoadBrowserHelperObjects' could not be resolved, adding deferred bp

为什么?因为这个时候IEFrame还没有加载,WinDbg不知道你设置的是一个什么断点。因此要先通过 sxe ld:ieframe.dll设置dll加载的断点,等到ieframe加载进去后,再在_LoadBrowserHelperObjects函数上设置断点。

断下来后,再在两台机器上都单步执行,比较两台机器上执行的不一样的地方。根据经验,重点是看一下里面调用函数后的返回值。发现_LoadBrowserHelperObjects里会调用几次读注册表,但是两台机器上的返回值是一样的。接着往下看,看到调用了一个函数IEFRAME!IERegGetBoolWithPoliciesW,这个函数的返回值(eax的值)两台机器不一样,正常加载的机器上返回1,不能加载的函数上返回0。问题的范围进一步缩小。

再重新启动,走到IEFRAME!IERegGetBoolWithPoliciesW函数里面,这个函数里也显示调用了几次读注册表的函数,打开注册表看了一下,两台机器上都没有要读的表项。再往下看,调用了一个函数IEFRAME!SHRegGetBoolValueFromHKCUHKLM,从函数的名字看,是要从Current User和Local Machine两个根键下去找要读的键,看看这个函数的参数,参数如下:

很清楚,是要去在Local Machine和Current User下去找Software\Microsoft\Internet Explorer\Main的Enable Browser Extensions的值,看这个注册表项的名字,估计找到原因了。先到正常的机器上去看,Local Machine下没有这个键值,在看Current User,有,值是yes,再看出问题的机器上,值是no,改成yes,问题解决了。

小结:之前不知道有Enable Browser Extensions这样一个值可以影响注册表的加载,知道就用这么折腾了,因此把它记录下来,免得后面的同学继续这样折腾,不过Windbg确实是个好东西,Windows上的很多疑难问题,都能用它来解决,可以好好学下。

WinDbg解决BHO不加载的更多相关文章

  1. 解决crontab不加载环境变量问题

    公司需要做异构库数据同步,由于之前实际使用过,且字段类型也兼容,满足业务场景,使用了阿里开源数据同步工具:datax,服务器上crontab定时脚本执行. 由于crontab只加载/ect/envir ...

  2. nuxt 头部引入js文件 第一次进入页面不加载js文件的解决方法

    head () { return { title: '', meta: [ { hid: 'description', name: 'description', content: '' } ], sc ...

  3. EasyUI 1.4.4 DataGrid(大数据量) bufferview滚动时不加载下一页数据解决方案

    在使用Easyui DataGrid 过程中,发现若单页数据量超过300,IE浏览器加载速度很慢.也通过网上找寻了很多解决方案,最典型的就是去掉datagrid的自动列宽以及自动行高判断. 1.解决自 ...

  4. Android开源代码解读のOnScrollListener实现ListView滚屏时不加载数据

    使用ListView过程中,如果滚动加载数据的操作比较费时,很容易在滚屏时出现屏幕卡住的现象,一个解决的办法就是不要在滚动时加载数据,而是等到滚动停止后再进行数据的加载.这同样要实现OnScrollL ...

  5. Swift - 表格图片加载优化(拖动表格时不加载,停止时只加载当前页图片)

    列表的单元格中包含有图片在开发中很常见.通常我们可以直接在tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIn ...

  6. 在360、UC等浏览器,img不加载原因

    问题:图片在360浏览器不被加载,在UC浏览器强制不显示. 前言不多说,直接上图. 360浏览器显示情况: UC浏览器显示情况: 由以上两张截图可以看到,在360浏览器,banner图片处根本没有加载 ...

  7. ArcGIS Runtime For Android 100.3天地图不加载问题

    ArcGIS Runtime 100.3 不加载天地图问题 参考这篇帖子:https://community.esri.com/thread/220496-1003-webtiledlayer-can ...

  8. 火狐浏览器返回不加载JS

    火狐浏览器 go(-1),返回后不加载JS,谷歌会加载. 总结: Firefox和Safari在back时不会触发load, ready事件! 解决方法: $(window).unload(funct ...

  9. 使用jquery的load方法设计动态加载,并解决被加载页面JavaScript失效问题

    一.问题分析 对于后台系统,相比大家都有所印象,知道其中的布局结构,如图: 在这种布局中我们需要将header,sidebar,footer分开,而且对于中间部分的content内容需要动态变化,即根 ...

随机推荐

  1. 【Flutter学习】基本组件之基本网格Gradview组件

    一,概述 数据量很大的时用矩阵方式排列比较清晰,此时用网格列表组件,即为GridView组件,可实现多行多列的应用场景. 使用GridView创建网格列表有多种方式: GridView.count 通 ...

  2. 拆边+BFS队列骚操作——cf1209F

    这个拆边+队列操作实在是太秒了 队列头结点存的是一个存点集的vector,1到这个点集经过的路径权值是一样的,所以向下一层拓展时,先依次走一遍每个点的0边,再走1边...以此类推,能保证最后走出来的路 ...

  3. DUBBO+Zookeeper在Centos7中本地搭建及小案例

    环境: 1.centos7 2.jdk-7u76-linux-x64.tar.gz 2.tomcat:apache-tomcat-7.0.59.tar.gz 3.zookeeper-3.4.6.tar ...

  4. hive的调优

    调优 1 Fetch抓取(Hive可以避免进行MapReduce) Hive中对某些情况的查询可以不必使用MapReduce计算.例如:SELECT * FROM employees;在这种情况下,H ...

  5. noip2007 tg day1t1 统计数字

    题目描述 某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*10^9).已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出 ...

  6. docker包含哪些内容(1)

    包含哪些内容? 如下图,三大块: 下面分别介绍各部分包含的内容. 启程 “启程”会介绍容器的生态系统,让大家先从整体上了解容器都包含那些技术,各种技术之间的相互关系是什么,然后再来看我们的教程都会涉及 ...

  7. JS 变量 相关内容

    JS变量按存储方式区分为哪些类型?: js变量按照存储方式分为两种类型:值类型 和 引用类型 1.值类型(基本类型): 布尔值(boolean) . null .undefined .数值(numbe ...

  8. pta作业1

    7-1 打印沙漏 (20 分) 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个“*”,要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”,是指每行输出奇数 ...

  9. pytest-文件名类名方法名执行部分用例

    pytest test_class_01.py 执行文件名 pytest -v -s test_class_01.py 执行文件名 pytest -v test_class_01.py::TestCl ...

  10. PyQt5初识

    学习PyQt5是个机缘,那是因为我的linux16.04+python3.6使了浑身解数也装不上PyQt4! PyQt5的官方文档貌似是要钱的!又想快速了解这个东东,我还是借鉴了万能的博客园大佬博主: ...