关于火狐浏览器默认搜索引擎search.json.mozlz4的分析
背景:
最近要研究的东西挺多,其中一快就是默认搜索引擎,不得不说的是,基本上快搞定了,但是现在在qqbrowser和ucbrowser上碰到瓶径了,连续突破n天无果,原因是chrome.dll太大了,真的定位太难了,调试太麻烦了,调试一次就动辄上小时,跑飞了就蛋疼.但是一定得想办法搞定,为什么要说一说火狐呢,目的就是为了增加点信心,以保持足够的定力去静心突破剩余的.好象有点罗嗦了,按下没搞定的不说,我们只说firefox的默认搜索引擎.
目的:
我们的目的很简单,就是为了能够修改火狐浏览器的默认搜索引擎为我们自己设置的.譬如说设置为baidu.com/?tn=flash678,当然这只是举的个例子
定位:
这个问题想都不用想设置后的内容肯定是要不保存为文件要不保存为注册表,按照惯例,一般就是保存为文件,纯猜的.现在首先的问题就是我们如何知道到底是哪个文件保存着这个默认搜索引擎的设置呢?
关于这个问题一般有两个办法。
办法1: Procmon监视文件读写
办法2:肉眼
我们这里选择了肉眼,原因其实也很简单,我们上图说明为什么选择肉眼.


从上图可以看出,我们通过火狐浏览器默认搜索引擎选项里自己手工随便设置一个,然后火狐浏览器配置文件目录根据时间排序,修改时间变化的就是这么几个。现在我们就得想办法从这些变化的文件中筛选出真正负责火狐浏览器的默认搜索引擎的配置文件,当然这里我们可以顾名思义从名字上判断,我首先就看到了search.json.mozlz4.于是迫不及待的查看下文本内容。一看内容乱七八糟,如下图:

说实话,一般碰到这种乱七八糟内容的文本文件我就发憷,因为这往往会设计到加密算法,逆算法可是很头疼的一个问题。
因为看到是乱七八糟的内容,所以对这个文件是否就是火狐浏览器默认搜索引擎的配置文件产生了严重的怀疑,怀疑的结果就是,对其他的同样修改时间为本次时间的文件,进行了查看,但是都没发现这个痕迹,当然places.sqlite等文件都仔细查看过,最后没办法了,还是怀疑search.json.mozlz4是这个文件,但是到底怎么来测试是不是这个文件呢?现在就要进行大刀阔斧的删除大法了,这个时间修改的文件,我们一个一个的删除,看删除后,哪个会影响我们设置的bing,一路删下来,就是只有在删除search.json.mozlz4的时候,设置的bing才被火狐自己还原回去了,于是恢复配置文件,再进行测试一次,最后的确发现就是search.json.mozlz4这个,其实看名字也象,只要删除search.json.mozlz4搜索引擎就恢复,不删除就正常。看来这下99%的可能就是它了,现在我们顺利的定位到了负责火狐浏览器默认搜索引擎的配置文件为search.json.mozlz4,文件所在目录%appdata%\Mozilla\Firefox\Profiles\******.default\search.json.mozlz4.
解密:
A:利用lz4解压回search.json.mozlz4的明文
我们上面已经定位到了search.json.mozlz4文件,我们上面也已经打开看过内容,是乱码,这,说实话什么算法真没看出来,本来抽了只烟想掳起袖子准备大干一场攻防战,进行逆向了。但是想了想还是先搜搜,实在搜不到的话,再干不迟,于是户baidu搜索了下search.json.mozlz4
第一次搜索: 内容为 inurl:Mozilla “search.json.mozlz4” 搜索出了一个内容如下:

最近要研究的东西挺多,其中一快就是默认搜索引擎,不得不说的是,基本上快搞定了,但是现在在qqbrowser和ucbrowser上碰到瓶径了,连续突破n天无果,原因是chrome.dll太大了,真的定位太难了,调试太麻烦了,调试一次就动辄上小时,跑飞了就蛋疼.但是一定得想办法搞定,为什么要说一说火狐呢,目的就是为了增加点信心,以保持足够的定力去静心突破剩余的.好象有点罗嗦了,按下没搞定的不说,我们只说firefox的默认搜索引擎.
目的:
我们的目的很简单,就是为了能够修改火狐浏览器的默认搜索引擎为我们自己设置的.譬如说设置为baidu.com/?tn=flash678,当然这只是举的个例子
定位:
这个问题想都不用想设置后的内容肯定是要不保存为文件要不保存为注册表,按照惯例,一般就是保存为文件,纯猜的.现在首先的问题就是我们如何知道到底是哪个文件保存着这个默认搜索引擎的设置呢?
关于这个问题一般有两个办法。
办法1: Procmon监视文件读写
办法2:肉眼
我们这里选择了肉眼,原因其实也很简单,我们上图说明为什么选择肉眼.


从上图可以看出,我们通过火狐浏览器默认搜索引擎选项里自己手工随便设置一个,然后火狐浏览器配置文件目录根据时间排序,修改时间变化的就是这么几个。现在我们就得想办法从这些变化的文件中筛选出真正负责火狐浏览器的默认搜索引擎的配置文件,当然这里我们可以顾名思义从名字上判断,我首先就看到了search.json.mozlz4.于是迫不及待的查看下文本内容。一看内容乱七八糟,如下图:

说实话,一般碰到这种乱七八糟内容的文本文件我就发憷,因为这往往会设计到加密算法,逆算法可是很头疼的一个问题。
因为看到是乱七八糟的内容,所以对这个文件是否就是火狐浏览器默认搜索引擎的配置文件产生了严重的怀疑,怀疑的结果就是,对其他的同样修改时间为本次时间的文件,进行了查看,但是都没发现这个痕迹,当然places.sqlite等文件都仔细查看过,最后没办法了,还是怀疑search.json.mozlz4是这个文件,但是到底怎么来测试是不是这个文件呢?现在就要进行大刀阔斧的删除大法了,这个时间修改的文件,我们一个一个的删除,看删除后,哪个会影响我们设置的bing,一路删下来,就是只有在删除search.json.mozlz4的时候,设置的bing才被火狐自己还原回去了,于是恢复配置文件,再进行测试一次,最后的确发现就是search.json.mozlz4这个,其实看名字也象,只要删除search.json.mozlz4搜索引擎就恢复,不删除就正常。看来这下99%的可能就是它了,现在我们顺利的定位到了负责火狐浏览器默认搜索引擎的配置文件为search.json.mozlz4,文件所在目录%appdata%\Mozilla\Firefox\Profiles\******.default\search.json.mozlz4.
解密:
A:利用lz4解压回search.json.mozlz4的明文
我们上面已经定位到了search.json.mozlz4文件,我们上面也已经打开看过内容,是乱码,这,说实话什么算法真没看出来,本来抽了只烟想掳起袖子准备大干一场攻防战,进行逆向了。但是想了想还是先搜搜,实在搜不到的话,再干不迟,于是户baidu搜索了下search.json.mozlz4
第一次搜索: 内容为 inurl:Mozilla “search.json.mozlz4” 搜索出了一个内容如下:

这可是火狐浏览器官方的说明,这次搜索验证了一个事情search.json.mozlz4绝对是火狐浏览器的默认搜索引擎的存储文件
第二次搜索:宽泛一点直接搜索search.json.mozlz4

我们捕捉到了一个关键词,就是上面话当中的“之后再用lz4压回”,lz4是什么鬼,之前并不知道这个算法,而且看search.json.mozlz4文件名字当中也有个lz4,接下来我们就有更具体的内容可以搜索了那就是lz4
第三次搜索: lz4
这不看不知道,一看吓一跳,原来lz4是这么有名的一个压缩算法,很是niubility
看来真是孤陋寡闻了,惭愧惭愧啊。于是呼抓紧找到权威的地方下一个看看。
于是呼找到了一份测试可用的 github.com/avih/dejsonlz4
下载下来粗略一读,并做了一下修改方便自己来用,一顿折腾终于调试好。如下图


下面我们就要迫不及待的看下解压后的明文内容是什么了,如下图:

通过对解压后的明文肉眼分析,我们可以得出如下的一个大概结构
engines一个对象数组,里面包含着可以选择的搜索引擎
metaData里面的current是选择哪个是默认的搜索引擎,而里面的hash又是对选择的current进行校验的。
只有满足:metaData里的current包含在engines里面,而且hash校验的值是正确的,那么设置有效,否则被恢复。
B:metaData里的hash校验算法
下面的重点就是如何来分析hash校验算法了,这里就是关键了,下面就是头疼的问题,到底怎么拿到这个算法?
按照以前的做法肯定又要逆了,但是自从有了上次的经验知道firefox是开源的了之后,咱可不干那傻事,直接搜索出对应版本的下载地址,很容易就找到了。releases.mozilla.org/pub/firefox/releases/
选择好对应的版本下载安装,一个小时后,在1两个g的文件中搜索search.json.mozlz4关键词,顺利的定位到了nsSearchService.js这个文件,我们来看关键地方

找到了关键的信息,剩下的就很简单了,不会的搜都可以了,于是我们已经非常明确了算法了
也就是说:
firefox的配置目录文件名olr0bo0x.default(每个机器不同,提取对应的文件夹) + 默认搜索引擎的名称 + 上图中的固定字符串,其中$appName换成Firefox 这三快内容组合成一个这是的字符串,然后进行utf8编码,然后进行sha256,最后base64
伪代码:
dst = profilename + aname + magic
u8dst=utf8(dst)
encode = sha256(u8dst)
out = base64(encode)
如下图:

C:对上面的json明文的json的engines对象数组进行追加,然后再对追加的名称进行hash算法之后的jsonlz4压回
到了这里所有的难点问题就已经解决了,剩下的码代码就很简单了,上图为证:


最后总结:
关于火狐浏览器问题,以后碰到第一时间的反应一定不要想着逆向,一定要首先想到firefox是开源的,去下载代码并想办法
搜索到关键问题才是火狐浏览器的王道,本次搞定除了搜索就是搜索,没逆过一行,还是很过瘾的。
接下来的时间还是继续好好的掳起袖子继续研究庞大到想吐血的chrome.dll吧。
CopyRight @2018, Www.LiuLanQiCode.Com, Inc.All Rights Reserved. QQ:8560851 转载请标明来源,否则木有小jj