为BHO开道之异或加花XORObfuscateValue


背景:
        话说对ie浏览器的BHO插件,应该是无人不知无人不晓的,但是由于中国国内环境原因,逐渐的消失在人们的视线当中,这其中当然都是杀毒的"巨大贡献" ,于是大家都从ie8之后基本都不怎么关注所谓的BHO了,但是由于某种原因又接触了下BHO,但是却碰到了一个以前从未知道的事情,还是比较新鲜的。按照常规做法,我们都是把BHO在目标机器直接regsvr32注册一下完事,然后打开ie浏览器坐等出现我们所像出现的结果,于是就按照这种常规做法做了一下,但是却发现问题了。问题如下图:
为BHO开道之异或加花XORObfuscateValue_01

问题就是:打开ie浏览器之后在浏览器的下面会出现这个 启用 或者 不启用。如果点了不启用,那么结果可想而知,BHO不生效,并且关掉ie浏览器之后下次再打开ie浏览器还是提示上图。如果什么也不点,也跟不启用是同样的效果。只有在点了启用之后,BHO才会生效,并且以后再打开ie浏览器都不会再提示。

分析问题:
        按照上面出现的三个状态,启用,不启用,什么也不点。我们猜想的是:点了启用之后,按照ie的习惯,应该是往注册表里写个dword值来标记一下。如果猜想结果正确的话,我们应该只需要找到这个注册表位置,并修改成这个值即可。应该还是比较简单的。
        好吧,开始动手,当然还是proc moniter。设置进程为iexplorer.exe 操作为SetRegValue.如下图:
        为BHO开道之异或加花XORObfuscateValue_02

然后我们首先手工注册下BHO,然后打开ie浏览器,坐等出现的启用和不启用的提示,既图1所示,然后我们毫不犹豫的点 启用
然后抓到信息如下图:
        为BHO开道之异或加花XORObfuscateValue_03

我们jmp到注册表看下,内容如图:
为BHO开道之异或加花XORObfuscateValue_04

键为clsid,键值为一个24字节的东西。看来我们上面设想的,注册表可能标记为一个dowrd直,修改下就行的逻辑是行不通了。
然后又一想自己手工尝试把24字节的内容胡乱修改下,看浏览器能不能认!可是又一个想不到的事情产生了如下图:
为BHO开道之异或加花XORObfuscateValue_05

也就是说:我们手工根本没权限去修改,竟然对这个地方做了保护,怎么做的暂时未知,但是我们知道的是:这个保护必须要绕过
然后,继续我们刚才的设想,既把clsid的内容修改看ie认不认,经过pchunter的测试,删除clsid 和 修改clsid的内容,都是失败的。
现在我们总结下问题:
                1:我们必须要绕过这个地方些注册表的保护
                2:   我们必须计算出这个clsid的24字节内容是怎么来的。
                只有解决这两个问题,我们的问题才算是解决,也才算是真正的为BHO开道了。

解决问题:
       A: 定位操作的dll和函数
                根据上面proc moniter抓到的写入注册表的操作,我们看一下 栈属性 的调用关系 和 操作位置。
                如下图:
                为BHO开道之异或加花XORObfuscateValue_06
                
                    根据经验ie嘛,操作这个的肯定就是ieframe.dll 这个每个人都知道的哦。
                    函数位置 我们先拿IELaunchManageAddOnsUI + 0x5a9c 计算下看看准确不准确,这里需要小小的尝试。
                    当我们IDA分析完ieframe.dll之后,找到
IELaunchManageAddOnsUI的地址,然后再加上0x5a9c计算出来的绝对地址
                    正好就是Ext_ApproveFrameAddOn这个函数的地址。我们偷懒下f5看看。如下图:
为BHO开道之异或加花XORObfuscateValue_07
                    
                    顺便说下,有符号就是爽。我们粗读代码,一看就知道,这个断点位置是绝对的找对了的。而代码的内容
                    我们大概意思一看就应该能明白:
                    大概就是:
                            1:打开注册表
                            2:解锁
                            3:写入(当然内容是ObfuscateCLSID)
                            4:锁定
                    到这里我们也基本能明白为上面我们手工写入或者删除或者修改失败呢,因为ie浏览器本身会对这个位置进行锁定。

        B:解决锁定的问题
                我们来看UnLockRegkeyForUserAccess,如下图:
                为BHO开道之异或加花XORObfuscateValue_08

                明白了原来是acl用户权限相关,那这个问题就很简单了,反正我是有现成的代码,当然做法和ie的做法不一样
                我是创建个所有权限的everyone账户即可,当然,也可以扣ie的,反正都一样。那这个写入问题就可以解决了


        C:解决加密算法
                    我们来看ObfuscateCLSID的关键加密函数,如下图:
                    为BHO开道之异或加花XORObfuscateValue_09

                    没意思上面,主要函数还是在XORObfuscateValue里面,我们继续追踪,如下图
                    为BHO开道之异或加花XORObfuscateValue_10
                
                经过对上面的动态跟踪,我们发现加密算法也非常简单,就像函数名称一样就是 异或加花
                也就是:
                一个长度为127的固定字符串 Only Internet Explorer code should.....651 for more details.
                一个是机器的sid
                一个是24位的clsid前面加了8个字节的东西
                进行128次循环,对这三个东西小于24字节的进行异或,大于24字节的要根据第一个固定字符串的位置和前面24字节的异或

                这样就得出结果了。
                这个算法如下图:
                为BHO开道之异或加花XORObfuscateValue_11
                
            D:到现在为止解锁和加密算法都搞定了,所有的难点都已经搞定了,码代码就很简单了,编译,测试,ok,一切正常
                就像标题所说的,到现在为止我们完全可以为BHO开道之异或加花XORObfuscateValue
                
             E:以后安装BHO的流程就变为了,先运算异或加密,然后解锁写入注册表,然后再像普通注册BHO一样就ok了。

最后总结:
              ms还是比较有良心的,尽管加密了,保护了,但是人家提供了符号。
一路研究下来,毫无压力。如果不提供符号的话
              这个问题马上难度就成几倍的增加。

阿门,希望洪水退去,去抗洪去了,贡献点微薄的力量。
              
                

CopyRight @2018, Www.LiuLanQiCode.Com, Inc.All Rights Reserved. QQ:8560851 转载请标明来源,否则木有小jj

鲁ICP备18034788号-1

鲁公网安备 37078302000299号