使用dnspy给dnspy做个小手术(资源汉化)
本帖最后由 gksj 于 2024-7-4 00:11 编辑## 前言
自从原dnspy停止维护之后,一直使用第三方维护的dnspy,因为新增的一些功能确实比较受欢迎.
自从2024年2月4日发布了6.5.0版本之后,增加了一个功能
在文件菜单下拉菜单增加了一个"Close All Framework Assemblies"
他的功能是关闭当前所有NET framework运行库自带的运行库文件.
这个功能我感觉挺实用的,因为在分析一些大型软件时调试了一会之后在资源管理器就会多出来好多文件,关闭一下清爽很多.
但是这个功能因为是新增的,还没有人提交pull进行中文语言包支持,所以一直显示的是英文.
## 本文目的
其实这篇文章的目的不只是为了汉化显示字符串,因为对于能用到这个功能的人,是不需要汉化的,更多的意义在于在大家分析net程序的时候如何定位到需要分析的代码位置,话不多说,开工!
## 第一种思路(通用思路)
既然是新增的功能,并且是dnspy自己的主菜单,字符串肯定是在dnspy相关的文件里,那么我们就把Bin文件夹目录所有dnspy自己的调用文件拖进去,查找关键字符串.
### 操作步骤
1.对dnspy的Bin文件夹下面的文件进行按照文件类型进行排序.
2.把所有dnspy开头的文件拖入dnspy的资源管理器
3.Ctrl+Shift+K或者编辑菜单→搜索程序集
4.输入框搜索"Close All Framework Assemblies"
5.在搜索的结果中依次双击定位到目标代码/资源.
## 第二种思路(资源定位法)
既然是多国语言支持,那么肯定是有多国语言资源文件支持(因为Bin目录下有很多个国别码的文件夹)
我们打开zh-CN文件夹,里面有很多以.resources.dll结尾的文件,这个就是net资源文件的特征(标准).
我们这次把所有.resources.dll文件拖入dnspy中,进行查找操作
### 操作步骤(同上3-5步骤)
咦?怎么搜不到?
找不到就对了,因为本来就没有这个资源数据,
那么我们换个思路,既然确定中文字符串肯定在这些文件中,那么我们定位和这个功能菜单相邻的字符串位置.
### 操作步骤
我们输入菜单中相邻的中文菜单字符串位置,比如"Close All Framework Assemblies"的上面的中文字符串是"关闭过时的内存缓存模块"
我们搜索这个字符串
找到了,在dnSpy.AsmEditor.x.resources.dll资源文件中
记录一下这个资源的名称"CloseOldInMemoryModules"
根据这个文件名我们可知是dnSpy.AsmEditor.x这个文件对这个文件进行了读取操作,那么我们就找到这个文件并打开
然后搜索"CloseOldInMemoryModules"
在搜索的结果中依次双击,然后在附近查找,我们就可以发现我们需要的分析的代码或者字符串就在它的附近.
## 特别说明
为什么我不直接说明代码和位置?
因为和版本有关系,
### 我们分析2024/02/04的6.5.0版本
在
dnSpy.AsmEditor.x文件中的 --file
dnSpy.AsmEditor.Commands命名空间下的 --namespace
CloseAllFrameworkAssembliesCommand类--class
的自定义特性代码是
```
[ExportMenuItem(
OwnerGuid = "DC3B8109-21BB-40E8-9999-FC6526C3DD15",
Header = "Close All Framework Assemblies",
Group = "1000,636D9C45-00A9-461F-8947-E01755929A5B",
Order = 55.0)]
```
其中Header属性已经写死了,也就是说要改成中文必须对它进行直接修改,而和它相邻的类
CloseOldInMemoryModulesCommand
和其他类都是使用资源引用
```
Header = "res:CloseOldInMemoryModules",
```
### 分析2024/06/26的6.5.1版本
已经修改并添加了对应的资源文件标识
```
[ExportMenuItem(
OwnerGuid = "DC3B8109-21BB-40E8-9999-FC6526C3DD15",
Header = "res:CloseAllFrameworkAssembliesCommand",
Group = "1000,636D9C45-00A9-461F-8947-E01755929A5B",
Order = 55.0)]
```
同时对文件内对应的资源文件也进行了添加
所以我们只需要对对应的
dnSpy.AsmEditor.x.resources.dll
文件进行添加字符串资源字段即可,无需对
dnSpy.AsmEditor.x.dll文件进行修改
## 重点来喽
对于很多刚接触NET逆向使用dnspy的新同学来说,一直不知道怎么去修改资源文件,那么这次就手把手教学
### 资源文件修改方式(推荐)
1.首先我们将dnSpy.AsmEditor.x.resources.dll复制出来一份放到其他地方(因为dnspy打开后会占用这个资源文件,所以无法替换保存)
2.用dnspy打开这个文件
3.依次展开资源文件,并定位到dnSpy.AsmEditor.Properties.dnSpy.AsmEditor.Resources.zh-CN.resources
4.鼠标右键,选择 创建资源
5.在名称中填写
CloseAllFrameworkAssembliesCommand
6.在值中填写汉化的字符串,比如我填写的是
关闭所有运行库框架程序集
7.然后点 确定
8.然后点击dnspy的文件主菜单,选择保存模块
9.在打开的对话框中直接点击确定
10.关闭dnspy,把修改后的文件复制到原来的文件目录,覆盖即可.
11.重新打开dnspy,就可以看到修改后的效果.
## 注意事项(重点)
在搜索的时候,我们要灵活使用并理解搜索框中的选项作用含义,有时候找关键数据要灵活切换选项
## 总结
撰写本文的目的更多的是给初学NET逆向的小伙伴们提供一个逆向分析的方法和工具的使用方法,希望小伙伴们在吾爱的大家庭中学友所成,逆飞冲天.
撒花~
## Tip
汉化翻译已经pull到Github的仓库,地址:
https://github.com/dnSpyEx/dnSpy/pull/337
如果大家有更好的翻译建议欢迎回帖讨论~ 不错汉化很好
如果6.5.1能支持vs2022.4的反编译就好了,目前打开时是带$的乱码函数名也不对,只能用ilspy来看源代码 不错,很好 谢谢分享,工具不错。 同学最新版软件也发上来多好 学习了,感谢分享! 感谢分享,又学到了新知识。 有步骤有条理的教学,非常好,谢谢楼主{:1_921:} 厉害,这个很不错,收藏了先 没有看完,留着看看 学到了,很详细的介绍