金山&Q管win10 锁定Edge算法分析

发布于:2017-09-01 10:04:34 阅读:388 回帖:0


Edge主页设置保存在

当前用户:

Software\\Classes\\LocalSettings\\Software\\Microsoft\\Windows\\CurrentVersion\\AppContainer\\Storage\\microsoft.microsoftedge_8wekyb3d8bbwe\\MicrosoftEdge\\Protected - It is a violation of Windows Policy to modify. See aka.ms/browserpolicy



并不是明文,发现金山和Q管可以锁定Edge,于是来了兴趣搞下。

那关键代码怎么定位?

既然是写注册表 ,那么直接注册表写入.于是有了下面的代码



写入ProtectedHomepages时断下.
安装好金山后,点开浏览器保护,点击主页锁定。

此时Windbg断下



可以知道9号是开始设置了,返回地址6c4f753.

看下模块信息



可以发现在dedendmon.dll
打开IDA,重置基地址

跳动9号call返回地址06c4f753



那么接下来就可以找找Data是怎么计算出来的了

看下谁调用这个函数



Windbg对这个调用的地方下断,看参数是什么



Bp 06BDC908
方便调试 我们设置主页为www.12.com 点击锁定 此时Windbg断下
查看esp

得到第三个参数为我们设置的主页url字符串



那么这个函数
取名为QbSetEdgeHomePage
此时调用
ObSetEdgeHomePage(
L"Software\\Classes\\Local Settings\\Software\\Microsoft\\Windows\\CurrentVersion\\AppContainer\\Storage\\microsoft."
     "microsoftedge_8wekyb3d8bbwe\\MicrosoftEdge\\Protected - It is a violation of Windows Policy to modify. See aka.ms/browserpolicy",
L"ProtectedHomepages",
url
);

函数内部IDA F5得到



首先会判断是否开启保护和是否是支持的系统 由于跟算法无关 这里不做详细分析
接着会去判断当前是不是admin登陆(非内置管理员 如果是内置管理员没有这个主页的这个Key)
接着去打开Key
如果dwDisposition = 1 则做一些处理 这里不管
如果打开成功 则进行下一步操作
Sub_6b5bdb7是在初始化数据结构(待考证)
接着开始跟算法有关
QbGetTempBuff

发现实在填充数据



这里sub_6b90c0e里面调用很多sub函数

于是找了Q管的看下



发现是url.....
金山在这里就直接返回了 可以看下返回的数据
这个函数被优化过 参数分别为eax和ecx

两个都是out参数 一个是buff缓冲区指针 一个是接收buff长度的指针



其中接收缓冲区指针的是ecx

调用前:



调用后:



接着调用QbGetHashData:



具体参数确定跟前面方法一致 断下 dd esp看就可以了
参数为:
1.刚才得到的buff地址
2.buff长度
3.接收计算后的数据指针

4.接收数据长度指针



进入后判断是不是SystemUser
如果是则使用WTSGetActiveConsoleSessionId获取Sid

否则使用标准方法获取Sid



接着去获取MiachneGuid

接着调用QbGetHashDataSub组合数据


有几个参数不确定 不过不影响分析



这里的操作是将Sid,Guid连接起来在家前面填充的数据后面(有url那个)



Eax 是这块数据的长度

剩下的一个参数是传出buff



不言而喻 md5计算
接着进行WordSwap和Reversible计算
这个跟IE11是一样的。
接着低位与低位 高位与高位进行^运算
接着调用sub_6c4394a

这个函数是纯c代码 可以直接抄



Sub_6c48e6b是替换函数
将计算出来的”尾巴”进行替换

没替换前:



替换后:



实现:



没错 这个就是QbGetHashDataSub的功能 就是计算“尾巴”

接着调用QbGetRegData



dwAboutUrllen = wcslen(url) * 2 + 0x22;
Hash = 尾巴
lpTempBuff = 没有sid和Guid的那个buff

后面两个是返回buff



所有的数据都知道了

这里关注下v12的数据就可以了



接着调用DbObfuscateData

这个函数就不多说了~跟IE11一致



接着就是填充数据返回~

返回的数据:



长度是5c

到此写入注册表



最后:



写个小程序测试下:



我不知道我坚持的是不是就是正确的,我不知道我看到的是不是就是真实的,我不知道我向往的是不是就是美好的,我不知道我依赖的是海岸还是浮木,我不知道我选择的是千钧一发还是沧海一粟,可我没有时间思考这些问题,也没有资格犹豫,我只知道在黑暗里的人,看到光,就得走下去.




返回