hash算法_Win10_64 默认应用的UserChoice Hash算法学习
本文为看雪论坛优秀文章
看雪论坛作者ID:DlyWtF700
一、项目准备
目标:利用注册表设置指定文件类型的默认应用程序
环境:win10 64位,win7 32位 sp1,xp 32位 sp3
做任何项目,先查询资料,博客。避免重复造轮子,感谢这些博主:1、如何通过注册表修改默认程序https://blog.csdn.net/baidu_31492511/article/details/835730612、如何绕过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呢?猜测:注册表的本质是文件,难道校验时会利用该文件的最后修改时间?出于某些原因,这里仅提供思路用作技术交流,就不贴出详细代码了~顺着这个思路,自己花些时间就能把完整算法逆出来~
- End -
看雪ID:DlyWtF700
https://bbs.pediy.com/user-852140.htm
*本文由看雪论坛 DlyWtF700 原创,转载请注明来自看雪社区
推荐文章++++
* 密码学基础:AES加密算法
* 微型加密算法实现及逆向分析
* iOS LLDB中反反调试分析与实现
* 代码混淆之我见(四)
* Windows Search远程代码执行漏洞简单分析及流量侧检测防御思路
进阶安全圈,不得不读的一本书
﹀
﹀
﹀
戳
hash算法_Win10_64 默认应用的UserChoice Hash算法学习相关推荐
- python dict hash算法_2020年3月26日python学习笔记——hash
什么是哈希? hash,一般翻译做散列.杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是,散列 ...
- 【字符串算法1】 再谈字符串Hash(优雅的暴力)
[字符串算法1] 字符串Hash(优雅的暴力) [字符串算法2]Manacher算法 [字符串算法3]KMP算法 这里将讲述 [字符串算法1] 字符串Hash 老版原文: RK哈希(Rabin_Ka ...
- SCU4438 Censor(审查员) (KMP算法与模拟栈的应用 || HASH表与模拟栈的结合)
Censor frog is now a editor to censor so-called sensitive words (敏感词). She has a long text pp. Her j ...
- 国密算法:利用python进行sm3 hash算法,计算hash值,国密算法库gmssl的使用
本篇介绍利用gmssl算法库中的sm3模块来进行hash值的计算. 一 sm3 hash算法的特点: sm3用于计算一个消息的hash值: 几乎无法被逆向,即通过hash值无法推断出原始消息: sm3 ...
- mysql 字符串的hash函数_【转载】字符串Hash函数比较
常用的字符串Hash函数还有ELFHash,APHash等等,都是十分简单有效的方法.这些函数使用位运算使得每一个字符都对最后的函数值产生影响.另外还有以MD5和SHA1为代表的杂凑函数,这些函数几乎 ...
- mysql hash索引 btree索引_B-Tree索引与Hash索引的比较
B-Tree索引与Hash索引的比较 理解B-Tree和Hash的数据结构能够帮助我们预测不同存储引擎下的查询性能差异.存储引擎在索引中使用这些数据结构,尤其是MEMORY 同时提供了B-Tree和H ...
- HASH和HMAC(1):HASH和HMAC概述
HASH(哈希)函数是信息安全中一个非常重要的工具,它对一个任意长度的消息m施加运算,返回一个固定长度的HASH值h(m),HASH函数h是公开的,对处理过程不用保密.HASH值又被称为哈希值.杂凑值 ...
- ruby hash方法_Ruby中带有示例的Hash.invert方法
ruby hash方法 Hash.invert方法 (Hash.invert Method) In this article, we will study about Hash.invert Meth ...
- ruby hash方法_Ruby中带有示例的Hash.select方法
ruby hash方法 哈希选择方法 (Hash.select Method) In this article, we will study about Hash.select Method. The ...
- ruby hash方法_Ruby中带有示例的Hash.length方法
ruby hash方法 哈希长度方法 (Hash.length Method) In this article, we will study about Hash.length Method. The ...
最新文章
- 关于机房有八台计算出现E盘无法更改盘符的问题
- postman指定User-Agent的header无效
- 比特币现金诞生一周年,未来发展瞄上了IPFS技术
- C#语法浮点型字面量
- 系统调优一之内存子系统
- script的加载方式与执行
- express细节点注意
- ubuntu18.10 cosmic更换阿里云的源
- 信息学奥赛C++语言:社会实践任务
- Vant-UI 表单组件(Field组件):验证表单元素表单提交 - 踩坑篇
- 使用控制结构——循环语句——基本循环
- exp imp 及参数
- 服务器30hz显示器240hz,显示器刷新率上不去,这锅到底让谁背
- 15个经典面试问题及回答思路,经典好文
- android 平板 不支持apk,平板电脑上怎么无法打开apk文件
- java中如何插入表格_Java如何向Word文档中添加表格?
- 军工品质32位超低功耗MCU
- 七夕节来用python表白吧!爱情病毒浸染你的心!
- 手机控制电脑之手机端模拟鼠标滑动处理
- url跳转http不携带referer方法