配合 Bandizip, 改善 Windows 右键新建文件夹操作体验——Windows 右键菜单魔改系列01

查看 78|回复 7
作者:Joe1921567817   
1.引言
Windows 和 Mac 哪个好用永远是大家讨论不休的话题。用 Mac 的可能会嫌 Windows 过于死板没 Mac 优雅,用 Windows 的也可能会嫌 Mac 就是一中看不中用的花瓶。其实在我看来,Mac 还是有很多人性化设计的小心思的。
想要直接看修改过程的朋友,请移步第3部分
1.1 问题描述
从文件夹空白地方右键新建文件夹这个非常常用的功能就可以看得出,如果我们能在 Windows 上借鉴 Mac 系统的一些人性化的设计,用起来确实会舒服很多。Mac 上把这个功能安排在了菜单第一项,我们正常人在用右键菜单的时候最习惯的一定是从上往下找需要的操作。因此最上面的肯定应该放用到最多的功能。反观Windows,要新建,首先得从上到下找到倒数第二个,然后又从下往上找到第一个,真的是效率非常低下。第一个位置安排给了查看,请问谁会一天到晚没事干,改桌面图标的大小,把改桌面图标大小作为最常用的功能?
对于之前没有注意到过这个问题的朋友,我这里特意放了两张图,大家感受一下:


Mac的新建文件夹:右键-从上到下第一个 拷贝.png (860.26 KB, 下载次数: 0)
下载附件
2024-12-17 12:48 上传

1.2 该功能现状
虽然 Windows 11 已经通过改为新版右键菜单很大程度上解决了这个问题,但是由于各种原因我们还是会用到旧版菜单,很多朋友甚至已经改成了默认旧版菜单,直接跳过了新版菜单那一步。而一旦用了旧版菜单,那你面对的就还是那个万年不变的右键菜单,仍然具有上面所说的所有问题。
2.寻找解决方案
最开始思考自己写一个右键菜单项,来实现想要的功能,然而随即发现了两个问题:
  • 在桌面上新建文件夹是自动会跑到光标下面的位置的,比较方便,而如果用命令创建的话,就只会跑到左上角。
  • 命令创建完不会自动进入改名的状态,得自己再点一下重命名。这样一来就有点脱裤子放屁的感觉了。遂寻找更合适的方案。

    经过些许研究,发现如果想要解决上面那2个问题,估计需要自己写一个 Context Menu Handler 的程序,来检测显示菜单时的光标位置,同时通过系统消息来让 Explorer 使这个文件进入重命名的编辑状态。挺复杂的,同时也不是很想从头自己写。
    经过一段时间的寻找,发现 Bandizip 有这个功能,并且我也是每台自己的电脑都是默认会装这个软件,约等于系统自带了,遂满心欢喜的打开这个功能,但是用了一段时间又发现两个新的问题:
  • 图标是 Bandizip 的图标(可以理解毕竟是他们开发的)但是天天看会觉得比较丑,主要是和这个功能不太搭,和 Windows 系统本身比较割裂
  • 我想在这个新建文件夹的菜单项下面有一个分隔条,就像 Mac 上面的一样。(/≧▽≦)/

    很显然 Bandizip 本身肯定是没有提供这两个功能,于是只能自己动手咯~
    3.正片开始
    OK! Let's get our hands dirty! IDA,启动!
    咳咳,不多废话了,我们直接来看怎么修改
    3.1 修改菜单图标
    修改菜单图标其实相对来说比较简单。因为 Bandizip 的菜单图标是外挂的,独立文件,在%ProgramFiles%\Bandizip\shellicons(文件图标在同一级的icons文件夹)但我们不能直接替换 Bandizip.ico,因为这会导致原本 Bandizip 的压缩文件菜单图标不对。


    Bandizip原有图标.png (45.7 KB, 下载次数: 0)
    下载附件
    2024-12-17 15:45 上传

    由于我个人用不到右键启动CMD的功能(因为有 Windows Terminal 了),选择的修改思路是把cmd.ico替换成想要的新建文件夹操作的图标。


    2024-12-17-[15-46-43].png (79.37 KB, 下载次数: 0)
    下载附件
    2024-12-17 15:47 上传

    现在文件替换好了,接下来我们需要修改程序让“新建文件夹”菜单项不再显示原本的 Bandizip 图标,转而显示我们的cmd.ico。
    首先启动自己最喜欢的逆向工具。由于这部分完成的比较早,因此用的是 Binary Ninja,大家将就看。
    还记得我们替换的cmd.ico文件吗,由于是从外部加载的图标,我们可以断定程序里某个地方肯定会加载文件,会出现要加载的文件名(非常关键的突破口)于是我们在 Strings 里面去搜索cmd.ico,便可以来到如下的这个位置。各个变量和函数名字为了便于理解我已经改为了中文。很明显,我们已经直捣黄龙了。


    2024-10-30-[18-11-17].png (373.96 KB, 下载次数: 0)
    下载附件
    2024-12-17 15:48 上传

    可以看到,cmd.ico 加载好之后在内存中的位置就是传入的图标地址+0x8F0,而我们不想要的 Bandizip 图标就是图标地址+0x8E8。请记住这两个关键数据。
    随后,我们在函数名上点一下,左下角的交叉引用 (Cross References) 窗口就会显示哪里调用了这个函数。我们双击跟过去看,就会来到下面的位置


    2024-10-30-[18-10-48].png (368.77 KB, 下载次数: 0)
    下载附件
    2024-12-17 15:48 上传

    很容易理解到RSI寄存器此时存的就是图标地址,慢慢往下找用到RSI寄存器的地方,肯定不远。因为寄存器的数据只是临时用,远了就会被别的数据占用。


    2024-10-30-[18-09-27].png (395.73 KB, 下载次数: 0)
    下载附件
    2024-12-17 15:48 上传

    大概在这里可以看到CREATE_NEW_FOLDER字样的字符串,这正是我们想要修改的“新建文件夹”菜单的英文(要注意观察哦)在上面一行就是读取内存里的图标文件,注意RSI+0x8E8,还记得刚才的图标地址+0x8E8么,这正是 Bandizip 图标的位置,要显示 cmd.ico,把此处的RSI+0x8E8改为RSI+0x8F0即可。
    前后对比环节:


    无标题0.png (268.73 KB, 下载次数: 0)
    下载附件
    2024-12-17 15:55 上传

    3.2 添加菜单分隔符
    …且听下回分解
    4.总结
    文中介绍的通过字符串定位关键位置的方法是非常好用的,不过 IDA 貌似找字符串不是很方便,经常找不到。建议可以先用 Binary Ninja 练练手。
    希望大家之后在遇到自己不喜欢的看不惯的东西的时候,都可以自己尝试做做修改,一个是能够在过程中学到很多,另一个也是一个很好的起点,毕竟没有真的像破解软件注册那么复杂(那个毕竟是厂家最厌恶的,一定是严防死守),可以作为接触软件破解的入口和启蒙。再者,能够看到自己的愿望经过自己努力实现了,也是很有成就感的!
    附自己根据 imageres.dll 里的图标制作的cmd.ico如下:

    cmd.zip
    (7.85 KB, 下载次数: 23)
    2024-12-17 16:02 上传
    点击文件名下载附件
    下载积分: 吾爱币 -1 CB

    原文件和修改后的文件,供大家研究:密码52pojie

    bdzshlx64.zip
    (522.94 KB, 下载次数: 41)
    2024-12-17 16:17 上传
    点击文件名下载附件
    下载积分: 吾爱币 -1 CB

    谨以此篇文章纪念人生第一次成功的逆向
    Joe
    2024 年 12 月于成都

    图标, 下载次数

  • JieW_L   

    感谢分享
    用系统自带注册表实现如下:
    reg 文件:https://jey.lanzn.com/irIb42ico83i
    [Shell] 纯文本查看 复制代码Windows Registry Editor Version 5.00
    [HKEY_CLASSES_ROOT\Directory\Background\Shell\Windows.NewFolder]
    "CanonicalName"="{E44616AD-6DF1-4B94-85A4-E465AE8A19DB}"
    "CommandStateHandler"="{3756e7f5-e514-4776-a32b-eb24bc1efe7a}"
    "CommandStateSync"=""
    "Description"="@shell32.dll,-31237"
    "ImpliedSelectionModel"=dword:00000004
    "InvokeCommandOnSelection"=dword:00000000
    "Icon"="shell32.dll,-319"
    "MUIVerb"="@shell32.dll,-31236"
    "Position"="Top"
    bjl1015   

    逆向不懂,不过右键可以用这个https://nilesoft.org/
    zg2600   

    谢谢楼主分享
    Archange   

    感谢分享,楼主分享的内容很赞!
    吖力锅   

    谢谢大神
    Freedou   

    谢谢楼主分享
    ABCYMX   

    谢谢楼主分享
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部