优雅的禁用chrome V75的'请停用以开发者模式运行的扩展程序'提示

前言

笔者最近沉迷chrome的插件开发,但是每次启动都有一个烦人的“请停用以开发者模式运行的扩展程序”提示,这个提示有多烦人,接触过的人都知道。


通过某度到了一个解决方案彻底禁用Chrome的“请停用以开发者模式运行的扩展程序”提示。可是该方法仅支持到74版本,笔者使用的75版本无法搜索到字符串 ExtensionDeveloperModeWarning

秉着自己动手丰衣足食的想法,愉(ku)快(bi)的开始了逆向之旅。

分析

如果您不想看这复杂的分析,请直接跳转懒人法
首先来理一理思路,chrome启动的时候,在程序的某个地方判断chrome是否加载了以开发者运行的扩展程序,如果加载了则弹出提示。那么只要找到了这个判断的地方,并把它强制跳过就可以去掉这个烦人的提示框了。那么如何定位判断的地方呢?显然可以先对弹出提示框的地方进行定位,在通过堆栈回溯就可以找到判断的地方。

定位弹出提示框代码位置

使用SpyLite,来看看这个提示框到底是个什么玩意儿。

看到窗口类名那一行,这个提示框其实是一个Window。那么直接在系统api CreateWindowExW,上打个断点,就可以定位弹出提示框的位置到底在哪。
x64dbg,载入chrome.exe,在CreateWindowExW打上断点

F9直接运行,期间会被程序会被断下很多次。提示框是最后一个被创建的,所以当程序最后一次被断下的时候,通过调用堆栈即可定位提示框代码位置。

点击调用堆栈。

调用堆栈的前几层一般来说都是语言自身对创建窗口的封装,所以属于公共代码,分析意义不大。那么如何定位呢?这里使用一个最愚蠢的方法,在调用堆栈调用的每个函数前下断,前面提到,前几层是公共代码,所以咱们从第四层开始下断点。

这里对4-11层的调用堆栈进行了下断。
重新载入,直接F9运行,对于多次命中的断点,直接取消断点,因为它肯定属于公共代码。在chrome运行起来,提示框弹出后,找到命中次数为1的断点。(命中次数为1说明只调用了一次)

有两个命中次数为1的断点,下面的函数是被以上函数进行调用的。所以第一个命中次数为1的断点就是弹出提示框代码的位置。

定位判断代码位置

如图,代码中有3个跳转可以跳过弹出提示框这个call,且第2个跳转为无条件跳转jmp。而在,0x00007FFF33B7DD38有个跳转可以跳过前两个跳转。所以如果0x00007FFF33B7DD38这个跳转不成立时,无论0x00007FFF33B7DD55这个跳转是否成立,最后都会跳过弹出提示框的call。
即,弹出提示框的唯一路径是0x00007FFF33B7DD38跳转成立且0x00007FFF33B7DD72跳转不成立。因为是且,所以破坏一个条件即可,但是0x00007FFF33B7DD38的跳转是对类进行异常(空指针)检查的,一般不对第一个跳转进行修改。那么将第二个跳转改成强制跳转即可。

懒人法

既刚刚已经找到了修改的位置,那么就可以直接使用特征值进行定位。
x64dbg载入chrome.dll,连续多次单击运行到用户。

直至模块变成chrome.dll。

然后在主面板依次选择 搜索->当前模块->匹配特征

搜索

1
74 71 48 8B 0E 48 8B 01 4C 8D 74 24 28 4C 89 F2 FF 50 48 48 89 F9 4C 89 F2 E8 AE FA FF FF

等待搜索完毕,双击搜索到的结果

跳转到反汇编界面,双击第一行将je修改成jmp

修改完成后,Ctrl+P,导出修改后的dll文件(点击修补文件按钮导出dll)

最后再把原始chrome.dll文件备份,再把这个修改过的替换,就可以发现,这个恶心的提示已经没有了。

文章目录
  1. 1. 前言
  2. 2. 分析
    1. 2.1. 定位弹出提示框代码位置
    2. 2.2. 定位判断代码位置
  3. 3. 懒人法