首页
社区
课程
招聘
[原创]win10_64 默认应用的UserChoice Hash算法学习
2019-8-9 11:25 36381

[原创]win10_64 默认应用的UserChoice Hash算法学习

2019-8-9 11:25
36381

目标:利用注册表设置指定文件类型的默认应用程序

环境:win10 64位,win7 32位 sp1,xp 32位 sp3


一,项目准备

做任何项目,先查询资料,博客。避免重复造轮子,感谢这些博主

1,如何通过注册表修改默认程序

https://blog.csdn.net/baidu_31492511/article/details/83573061

2,如何绕过Win8、Win10的systemsetting与注册表校验设置默认浏览器

https://www.freebuf.com/articles/system/130288.html


二,上手实践

经过查资料和自己动手尝试,发现win7和xp,只要修改注册表中的这几项值就可以了。

以将7z文件的默认程序设置为x压为例:

1,HKEY_CLASSES_ROOT\.7z 的值设置为 KuaiZip.7z(此为Progid,可以为任意字符串,只要保持前后一致就行)

ShellNew可以不用管。



2,HKEY_CLASSES_ROOT目录下新建项 KuaiZip.7z(ProcId),并按 shell\open\command 

设置值为 默认程序的完整路径 + "%1"



3,设置文件右键关联程序

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.7z

目录下这么设置就行



ProgId



xp和win7只要设置ProgId的值就可以了。

而UserChoice下的Hash是win10特有的校验值,win10经常弹出的默认程序出错就是这里的Hash出了问题。




三,Hash算法

1, 尝试逆向windows的设置进程[SystemSettings.exe],发现可以在注册表修改处下断,然后定位到算法模块 shell32.dll 内部.

但是查询资料时了解到,不同的win10版本环境下的Hash算法不同,考虑到代码的兼容性和稳定性.

思路转换:

测试发现:在xx浏览器在设为默认浏览器时会修改Hash值,因此内部肯定有完整的Hash算法(而xx浏览器内部肯定会保证兼容性)



2,xx浏览器会以高权限(弹出UAC窗口),参数为 --make-default-browser 的方式再启动自身进程。



3,查看设置hash的调用栈,发现是模块setdefbrowser.dll模块内调用kernelbase!RegSetValueExW以设置注册表数据的。



4,静态分析:用ida打开xx浏览器安装目录下的setdefbrowser.dll,建议复制副本查看。可以看到导出表中有些关键函数



5,动态调试:以<管理员权限>方式启动windbg,然后调试xx浏览器进程,记得加上参数。



6,下断:bu KERNELBASE!RegSetValueExW.步过数次后定位到关键数据,往回查找摘要数据来源



7,定位:经过数据回溯,逆向分析,定位到加密函数



8,这里的数据拼接方式为 类型(注意这里的类型前面有个".") + sid + ProgId + SystemTime(清零分和秒) + 常量字符串



9,发现这里的常量字符串有两个



10,是根据Shell32.dll的不同版本,拼接不同的字符串




11,拼接完成数据后,对它进行摘要.算法内部主要逻辑是:

1, 先用标准md5获得16字节摘要,

2,然后再利用md5的摘要作为key,用自定义的Hash算法摘要原文,得到8字节的数据

3,最后用base64转化后的数据即为Hash数据




四,正向算法还原和测试

1,还原Hash算法,实现修改注册表设置默认程序,部分代码如下



2,测试:win10环境下将以下文件格式的默认程序修改为记事本,成功!


3,思考

问题:数据拼接中用到了系统时间,但又没有保存该时间数据的代码。那么系统怎么校验该Hash呢?

猜测:注册表的本质是文件,难道校验时会利用该文件的最后修改时间?


plus:

出于某些原因,这里仅提供思路用作技术交流,就不贴出详细代码了

顺着这个思路,自己花些时间就能把完整算法逆出来



[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2019-8-9 11:28 被DlyWtF700编辑 ,原因:
收藏
点赞4
打赏
分享
最新回复 (16)
雪    币: 1645
活跃值: (619)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
Am0rf4tx 3 2019-8-9 11:33
2
0

隐藏的逆向大佬!
图片描述

雪    币: 30
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
GoLwhy 2019-8-9 11:39
3
0
优秀啊
雪    币: 5618
活跃值: (1157)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
从黎明到衰落 1 2019-8-9 12:17
4
0
大佬666
雪    币: 1006
活跃值: (3255)
能力值: (RANK:15 )
在线值:
发帖
回帖
粉丝
bkhumor 2019-8-9 13:40
5
0
雪    币: 429
活跃值: (368)
能力值: ( LV6,RANK:81 )
在线值:
发帖
回帖
粉丝
mlgbwoai 1 2019-8-9 16:10
6
0
提点建议:
    其中   时间戳和盐  是只有win10下才有的,而win8下是没有 时间戳和盐的。所以:以上代码的兼容性上还得处理下,需要判断是否为win10.其他正确。
雪    币: 2392
活跃值: (9220)
能力值: ( LV13,RANK:385 )
在线值:
发帖
回帖
粉丝
TkBinary 5 2019-8-9 17:30
7
0
还有360极速跟360安全用的设置默认都是一样的模块.. win10下会有自己算hash. QQ浏览器用的Com接口 还有Com接口在win10下不支持的情况.最根本的原因是看看自己注册表有没有设置对.Com接口设置的时候回根据取注册表值来进行算hash设置. 如果你设置对了.com接口直接设置即可.可以跳过弹框. 
雪    币: 381
活跃值: (165)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
DlyWtF700 2019-8-9 17:38
8
0
mlgbwoai 提点建议: 其中 时间戳和盐 是只有win10下才有的,而win8下是没有 时间戳和盐的。所以:以上代码的兼容性上还得处理下,需要判断是否为win10.其他正确。
感谢建议,因为产品主要兼容xp,win7,win10.而win8用户实在稀有,就没去研究win8环境了
雪    币: 381
活跃值: (165)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
DlyWtF700 2019-8-9 17:41
9
0
张新琪 还有360极速跟360安全用的设置默认都是一样的模块.. win10下会有自己算hash. QQ浏览器用的Com接口 还有Com接口在win10下不支持的情况.最根本的原因是看看自己注册表有没有设置对 ...
是的,同一个模块...只要校验值对了的确可以绕过弹框,com接口比较麻烦,还是自己计算来的快速稳定
雪    币: 12
活跃值: (388)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
MaMy 2019-8-13 15:32
10
0
张新琪 还有360极速跟360安全用的设置默认都是一样的模块.. win10下会有自己算hash. QQ浏览器用的Com接口 还有Com接口在win10下不支持的情况.最根本的原因是看看自己注册表有没有设置对 ...
what?..之前是发现某个版本后那个com的不行了..然后就自己算
雪    币: 12
活跃值: (388)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
MaMy 2019-8-13 15:33
11
0
DlyWtF700 是的,同一个模块...只要校验值对了的确可以绕过弹框,com接口比较麻烦,还是自己计算来的快速稳定
嗯,,其实最核心的就是微软的那2个cs64算法了..
雪    币: 2392
活跃值: (9220)
能力值: ( LV13,RANK:385 )
在线值:
发帖
回帖
粉丝
TkBinary 5 2019-8-13 17:07
12
0
MaMy what?..之前是发现某个版本后那个com的不行了..然后就自己算
NONO 我只是浏览器设置不成功.找BUG.然后分析了一下. 以前的没看.
雪    币: 244
活跃值: (163)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
airbus 2019-8-21 18:31
13
0
囧,刚刚静态分析qq的F1Frame.dll,既然在这看到相识的代码
时间问题的答案:RegQueryInfoKeyA(phkResult, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &ftLastWriteTime);注册表有获取某个键值最后写入时间的函数
最后于 2019-8-23 14:48 被airbus编辑 ,原因:
雪    币: 381
活跃值: (165)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
DlyWtF700 2019-8-23 19:57
14
0
airbus 囧,刚刚静态分析qq的F1Frame.dll,既然在这看到相识的代码时间问题的答案:RegQueryInfoKeyA(phkResult, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...
嗯,这个不错...
雪    币: 33
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
HitIt 2019-8-23 20:27
15
0
几年前就逆透这个了, 微软的逻辑都在shell32.dll里面,     “类型(注意这里的类型前面有个".") + sid + ProgId + SystemTime(清零分和秒) + 常量字符串 ” 这个时候来微软对抗而演变的, 开始的win8和早起的win10版本都很简单,都是类似大概 “类型(注意这里的类型前面有个".") + sid + ProgId”。  后来微软不断对抗演变,变顺序,然后加入SystemTime和字符串, 过一段时间就把字符串改一下。 微软win10直接下发更新这个文件补丁。
雪    币: 200
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
野猪乔治 2022-8-1 16:16
16
0
能否私信getDigest()这个函数?
雪    币: 226
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
ThreadEx 2022-11-2 15:30
17
0

最后于 2023-3-7 16:38 被ThreadEx编辑 ,原因:
游客
登录 | 注册 方可回帖
返回