hash算法_Win10_64 默认应用的UserChoice Hash算法学习

3b35ff1b6ea0a7e265b8da7b4158dafe.png

本文为看雪论坛优秀文章

看雪论坛作者ID:DlyWtF700

一、项目准备

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

环境: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 可以不用管。 f9106a19b2eff5540e5f7c50fcf40e4a.png 2、HKEY_CLASSES_ROOT目录下新建项 KuaiZip.7z(ProcId),并按 shell\open\command  设置值为 默认程序的完整路径 + "%1" fc67b526a8170be32fa022c0b0bd9467.png 3、设置文件右键关联程序 HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.7z 目录下这么设置就行。 920189277acc048a5fc1150d48db5beb.png ProgId : 947acb9c941841fab4cfaac81f341672.png xp 和win7只要设置ProgId的值就可以了。 而UserChoice下的Hash是win10特有的校验值,win10经常弹出的默认程序出错就是这里的Hash出了问题。 a2e1fc3a08b4898134a438d6235d6b72.png

三、Hash算法

1、尝试逆向windows的设置进程[SystemSettings.exe],发现可以在注册表修改处下断,然后定位到算法模块 shell32.dll 内部。 但是查询资料时了解到,不同的win10版本环境下的Hash算法不同,考虑到代码的兼容性和稳定性。 思路转换: 测试发现: 在xx浏览器在设为默认浏览器时会修改Hash值,因此内部肯定有完整的Hash算法(而xx浏览器内部肯定会保证兼容性)。 5ab2b3baf19ad190fa8362d7ba7985a0.png 2、xx浏览器会以高权限(弹出UAC窗口),参数为--make-default-browser 的方式再启动自身进程。 16b37d96614a3150b5836258210affc9.png 3、查看设置hash的调用栈,发现是模块setdefbrowser.dll模块内调用kernelbase!RegSetValueExW以设置注册表数据的。 dca90f8e95bb71b28541dd700e2a6a75.png 4、静态分析: 用ida打开xx浏览器安装目录下的setdefbrowser.dll,建议复制副本查看。 可以看到导出表中有些关键函数: fbf4ac7d6ba3a13fd1579b9b72d9fac0.png 5、动态调试: 以方式启动windbg,然后调试xx浏览器进程,记得加上参数。 cd8e45ec8c70da396ff734aeb035cc17.png 6、下断: bu KERNELBASE!RegSetValueExW。 步过数次后定位到关键数据,往回查找摘要数据来源: 7b55d60ad4f98c7f67083087f2e18086.png 7、定位: 经过数据回溯,逆向分析,定位到加密函数。 09d3e0f74c0ab0c76807b55012d1f452.png 8、这里的数据拼接方式为 类型(注意这里的类型前面有个".") + sid + ProgId + SystemTime(清零分和秒) + 常量字符串。 b2017d477b5feb443761da5bb36626f8.png 9、发现这里的常量字符串有两个: 34f0e301e15f22048d3a862ff072e8bc.png 10、是根据Shell32.dll的不同版本,拼接不同的字符串。 0cc2c58b4efb5aeb02d453b748f12af0.png 7e97fbc3cb4778d506365692c5a80691.png 11、拼接完成数据后,对它进行摘要.算法内部主要逻辑是: 1) 先用标准md5获得16字节摘要; 2) 然后再利用md5的摘要作为key,用自定义的Hash算法摘要原文,得到8字节的数据; 3) 最后用 base64 转化后的数据即为Hash数据。 a50b179eb9a5c0dcfa977014dee771ab.png

四、正向算法还原和测试

1、还原Hash算法,实现修改注册表设置默认程序,部分代码如下: cb3155ad5b5b3d9f049c1b3e65715c45.png 2、测试: win10 环境下将以下文件格式的默认程序修改为记事本,成功!  ce8895cc1c1427297b05d641a8ab4ba9.png 3、思考 问题: 数据拼接中用到了系统时间,但又没有保存该时间数据的代码。 那么系统怎么校验该Hash呢? 猜测: 注册表的本质是文件,难道校验时会利用该文件的最后修改时间? 出于某些原因,这里仅提供思路用作技术交流,就不贴出详细代码了~ 顺着这个思路,自己花些时间就能把完整算法逆出来~

b8eab716cb08326fd4d9185b870995e9.gif

- End -

38a4b3dae531a3e747a8fa0968a3e8e1.png

看雪ID:DlyWtF700  

https://bbs.pediy.com/user-852140.htm  

*本文由看雪论坛 DlyWtF700 原创,转载请注明来自看雪社区

推荐文章++++

a76252630ce65c337361159122e63863.png

* 密码学基础:AES加密算法

* 微型加密算法实现及逆向分析

* iOS LLDB中反反调试分析与实现

* 代码混淆之我见(四)

* Windows Search远程代码执行漏洞简单分析及流量侧检测防御思路

进阶安全圈,不得不读的一本书5121f063f6b30aad1dc5f4dd574682d8.png

a62000c92dac856c78ce98d1d45f437e.png

77832fa2b154a3271ece1a162d0b6fd7.gif
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值