昨天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. 【操作】Linux快捷键

  2. AutoCAD2016安装破解教程

    AutoCAD2016安装破解教程.本人亲自实验,破解成功,有效.以64位为例. 工具/原料   笔记本电脑 AutoCAD2016安装包 AutoCAD2016注册机(xf-adsk2016_x64 ...

  3. 力扣算法题—150. Evaluate Reverse Polish Notation

      Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +,  ...

  4. babel/core 6.x升级到7.x要碰到的一些坑

    刚学习react.js没多久,碰到各种坑.就比如这个问题,弄了我3个小时,终于解决了.其实就是一个小问题. 报错信息: Error: Cannot find module '@babel/core' ...

  5. 时间同步服务器NTP搭建

    NTP服务器        NTP(Network Time Protocol)[网络时间协议],它是用来同步网络中各个计算机的时间的协议,它可以提供高精准度的时间校正(LAN上与标准间差小于1毫秒, ...

  6. 第二记 Java数据类型

    一.数据类型 java中数据类型分为基本数据与引用数据类型两大类,其中又有更细致的划分,下面以图展示 二.基本数据类型封装类 Java是一门面向对象的语言,但是在一些情况下基本数据类型无法满足Java ...

  7. zabbix--添加host

    在client配置好zabbix_agent后,如果server端没配置自动发现,那就需要创建添加host. 首先找到地方.Configuration--Hosts--Create Host 创建ho ...

  8. Spring-Boot使用neo4j-java-driver-- 查找两个节点之间关系的最短路径

    一.Cypher数据 create (小北:朋友圈{姓名:"小北", 喜欢的书类:"Poetry"}), (小菲:朋友圈{姓名:"小菲", ...

  9. Android四大组件之Service浅见

    Service 是Android四大组件之一,可以在不显示界面的情况下在后台运行.还有一个作用是通过AIDL来实现进程间通信. Service的启动方式 Service的启动方式有两种,startSe ...

  10. 内网渗透_win_socks代理_reGeorg+proxifier

    遇到内网windows机器,如果想远程登陆,通常得通过代理,常用的nc.lcx 工具可满足要求. 如 lcx 示例: 两台机器上均上传lcx.exe 在 xp机器(公网)上执行 lcx.exe -li ...