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

金山&Q管win10|金山&Q管win10 锁定Edge算法分析
文章图片

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管win10|金山&Q管win10 锁定Edge算法分析
文章图片
并不是明文,发现金山和Q管可以锁定Edge,于是来了兴趣搞下。
那关键代码怎么定位?
既然是写注册表 ,那么直接注册表写入.于是有了下面的代码
金山&Q管win10|金山&Q管win10 锁定Edge算法分析
文章图片
写入ProtectedHomepages时断下.
安装好金山后,点开浏览器保护,点击主页锁定。
此时Windbg断下
金山&Q管win10|金山&Q管win10 锁定Edge算法分析
文章图片
可以知道9号是开始设置了,返回地址6c4f753.
看下模块信息
金山&Q管win10|金山&Q管win10 锁定Edge算法分析
文章图片
可以发现在dedendmon.dll
打开IDA,重置基地址
跳动9号call返回地址06c4f753
金山&Q管win10|金山&Q管win10 锁定Edge算法分析
文章图片
那么接下来就可以找找Data是怎么计算出来的了
看下谁调用这个函数
金山&Q管win10|金山&Q管win10 锁定Edge算法分析
文章图片
Windbg对这个调用的地方下断,看参数是什么
金山&Q管win10|金山&Q管win10 锁定Edge算法分析
文章图片
Bp 06BDC908
方便调试 我们设置主页为www.12.com 点击锁定 此时Windbg断下
查看esp
得到第三个参数为我们设置的主页url字符串
金山&Q管win10|金山&Q管win10 锁定Edge算法分析
文章图片
那么这个函数
取名为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得到
金山&Q管win10|金山&Q管win10 锁定Edge算法分析
文章图片
首先会判断是否开启保护和是否是支持的系统 由于跟算法无关 这里不做详细分析
接着会去判断当前是不是admin登陆(非内置管理员 如果是内置管理员没有这个主页的这个Key)
接着去打开Key
如果dwDisposition = 1 则做一些处理 这里不管
如果打开成功 则进行下一步操作
Sub_6b5bdb7是在初始化数据结构(待考证)
接着开始跟算法有关
QbGetTempBuff
发现实在填充数据
金山&Q管win10|金山&Q管win10 锁定Edge算法分析
文章图片
这里sub_6b90c0e里面调用很多sub函数
于是找了Q管的看下
金山&Q管win10|金山&Q管win10 锁定Edge算法分析
文章图片
发现是url.....
金山在这里就直接返回了 可以看下返回的数据
这个函数被优化过 参数分别为eax和ecx
两个都是out参数 一个是buff缓冲区指针 一个是接收buff长度的指针
金山&Q管win10|金山&Q管win10 锁定Edge算法分析
文章图片
其中接收缓冲区指针的是ecx
调用前:
金山&Q管win10|金山&Q管win10 锁定Edge算法分析
文章图片
调用后:
金山&Q管win10|金山&Q管win10 锁定Edge算法分析
文章图片
接着调用QbGetHashData:
金山&Q管win10|金山&Q管win10 锁定Edge算法分析
文章图片

具体参数确定跟前面方法一致 断下 dd esp看就可以了
参数为:
1.刚才得到的buff地址
2.buff长度
3.接收计算后的数据指针
4.接收数据长度指针
金山&Q管win10|金山&Q管win10 锁定Edge算法分析
文章图片
进入后判断是不是SystemUser
如果是则使用WTSGetActiveConsoleSessionId获取Sid
否则使用标准方法获取Sid
金山&Q管win10|金山&Q管win10 锁定Edge算法分析
文章图片
接着去获取MiachneGuid
金山&Q管win10|金山&Q管win10 锁定Edge算法分析
文章图片
接着调用QbGetHashDataSub组合数据
金山&Q管win10|金山&Q管win10 锁定Edge算法分析
文章图片
有几个参数不确定 不过不影响分析
金山&Q管win10|金山&Q管win10 锁定Edge算法分析
文章图片
这里的操作是将Sid,Guid连接起来在家前面填充的数据后面(有url那个)
金山&Q管win10|金山&Q管win10 锁定Edge算法分析
文章图片
Eax 是这块数据的长度
剩下的一个参数是传出buff
金山&Q管win10|金山&Q管win10 锁定Edge算法分析
文章图片
不言而喻 md5计算
接着进行WordSwap和Reversible计算
这个跟IE11是一样的。
接着低位与低位 高位与高位进行^运算
接着调用sub_6c4394a
这个函数是纯c代码 可以直接抄
金山&Q管win10|金山&Q管win10 锁定Edge算法分析
文章图片
Sub_6c48e6b是替换函数
将计算出来的”尾巴”进行替换
没替换前:
金山&Q管win10|金山&Q管win10 锁定Edge算法分析
文章图片
替换后:
金山&Q管win10|金山&Q管win10 锁定Edge算法分析
文章图片
实现:
金山&Q管win10|金山&Q管win10 锁定Edge算法分析
文章图片
没错 这个就是QbGetHashDataSub的功能 就是计算“尾巴”
接着调用QbGetRegData
金山&Q管win10|金山&Q管win10 锁定Edge算法分析
文章图片
dwAboutUrllen = wcslen(url) * 2 + 0x22;
Hash = 尾巴
lpTempBuff = 没有sid和Guid的那个buff
后面两个是返回buff
金山&Q管win10|金山&Q管win10 锁定Edge算法分析
文章图片
所有的数据都知道了
这里关注下v12的数据就可以了
金山&Q管win10|金山&Q管win10 锁定Edge算法分析
文章图片
接着调用DbObfuscateData
这个函数就不多说了~跟IE11一致
金山&Q管win10|金山&Q管win10 锁定Edge算法分析
文章图片
接着就是填充数据返回~
返回的数据:
金山&Q管win10|金山&Q管win10 锁定Edge算法分析
文章图片
长度是5c
到此写入注册表
金山&Q管win10|金山&Q管win10 锁定Edge算法分析
文章图片
最后:
金山&Q管win10|金山&Q管win10 锁定Edge算法分析
文章图片
写个小程序测试下:
金山&Q管win10|金山&Q管win10 锁定Edge算法分析
文章图片
我不知道我坚持的是不是就是正确的,我不知道我看到的是不是就是真实的,我不知道我向往的是不是就是美好的,我不知道我依赖的是海岸还是浮木,我不知道我选择的是千钧一发还是沧海一粟,可我没有时间思考这些问题,也没有资格犹豫,我只知道在黑暗里的人,看到光,就得走下去.
【金山&Q管win10|金山&Q管win10 锁定Edge算法分析】本文由看雪论坛 放学打我不 原创转载请注明来自看雪社区

    推荐阅读