破解群晖File Station中文未按拼音排序问题
文章《群晖中文未按拼音排序问题排查》找到 File Station 中文未按拼音排序问题的原因。
在这里提供一个破解的方法,把 libsynocore.so.6 中 ucol_open 的 locale 参数改成 zh,以支持按拼音排序。
我的 DSM 版本是 DSM 6.1.7-15284,以下都是针对这个版本的修改。
ucol_open 涉及到以下代码:
LOAD:00000000000164D1 lea rsi, [rsp+28h+var_1C] LOAD:00000000000164D6 lea rdi, aPStartAddress+12h ; "" LOAD:00000000000164DD call _ucol_open
0x164D6 行代码就是加载 locale 参数的,对应的操作码是:
48 8D 3D 8E A8 00 00
48 8D
指的是 lea3D
指的是 lea 第一个参数,是寄存器 rdi8E A8 00 00
指的是 lea 第二个参数,是偏移量
因此,只要修改偏移量指向为其准备好的 zh 字符串就行。
libsynocore.so.6 中有大量为错误处理准备的字符串,我们完全可以修改这些字符串来用。
具体操作:
- 将
48 8D 3D 8E A8 00 00
替换成48 8D 3D 91 AE 00 00
。 - 查找字符串 string_join.c,并替换成 string_joinzh。
替换好后保存,再 SSH 到群晖系统,以管理员身份替换掉原有的 libsynocore.so.6 再重启就可以了。
大佬厉害,解决了大问题!
大神请教一下,DSM7.0.1-42218里libsynocore.so.6的local操作码如何对应修改?
我现在手头是 DMS 7.1-42661,可以将
48 8D 3D 8D B9 00 00
替换成48 8D 3D A2 BE 00 00
,再查找字符串 string_join.c 替换成 string_joinzh。这个每个版本都可能会变,建议稍微学点 IDA 等反汇编工具,再结合我这里说的来自己改。
大神,我没学过语言、代码这些东西,现在了解关于NAS这些东西,都是跟着网上的内容一点一点抠出来的。能否帮个忙?我把DSM7.0.1-42218里libsynocore.so.7文件扒出来了(lib目录和lib64目录下分别有一个),是否可以帮我找找ucol_open 的 locale 参数设置在哪里,偏移量如何替换?十分感谢!文件我可以通过邮箱发给你。
可以发过来看看。
icedream2linxi at qq.com
同样的版本。这个文件能否提供下?
你好大佬,我是小白,是要修改libsynocore.so.6这个文件吗?这个文件的路径能回复一下吗?
位于
/usr/lib/libsynocore.so.6
。你也可以通过搜索来找到它,例如:
sudo find /usr -name "libsynocore.so.*"
。您好,我的版本是DSM 6.2.4-25556 Update 6,因为没有反编译基础,我目前做到了
1. 找到需要修改的文件是/usr/lib/libsynocore.so.6
2. 找到“lea rdi, aPStartAddress+12h ;”这句对应行“171D2”,操作码是“48 8D 3D FA B0 00 00”
3. 找到“aPStartAddress”对应行“222C1”,“aStringJoinC”对应行“228CB”
但是我没太搞明白要替换的那一段操作码是怎么得到的,那个偏移量应该怎么计算?
228CB-222C1=60A
把“FA B0 00 00”替换成“0A 06 00 00”
不好意思,我就是怎么从行数差值为60A到 `把“FA B0 00 00”替换成“0A 06 00 00”` 这一步没搞明白,能详细解释下吗
我也没搞懂,既然有偏移量,那是不是得加上基数?
我以为 新的数值 应该是
B0FA – 12 + (228CB-222C1) = b6f2
感谢楼主定位这个问题,不知道这个计算是否正确
是替换后的字符串“string_joinzh”里“zh”的地址相对于“lea rdi, aPStartAddress+12h”指令的偏移量。而不是相对于原来那个字符串的偏移量。你把 B0FA 加上去就成在原来偏移量的基础上再加偏移量了。
OK,那我的分析应该只是缺少一个segment对应四个字节,并且程序里字节顺序是反过来的这一点
我感觉我明白了,我来总结一下:
1. “lea rdi, aPStartAddress+12h”对应地址”171D2”
2. “aPStartAddress”对应地址”222C1″,”aPStartAddress + 12h”对应地址”222D3″
3. 真正的函数调用”call _ucol_open”对应地址”171D9″
4. 16进制下 222D3 – 171D9 = B0FA, 填充成四字节是”00 00 B0 FA”, 把四个字节顺序反过来就是”FA B0 00 00″
到此为止我们解决了“操作码里的偏移量是如何计算”的问题
那么接下来就是如果把偏移量改成”string_joinzh”里”zh”应该怎么算:
1. “aStringJoinC”对应地址”228CB”
2. “zh”是从”string_joinzh”的第11个字符开始,16进制下对应地址为 228CB + B = 228D6
3. 最后”zh”相对于函数调用”call _ucol_open”的偏移量就是 228D6 – 171D9 = B6FD
4. 所以正确的修改应该是把”FA B0 00 00″改成”FD B6 00 00”
OK, 最后我们来和正文修改前后的偏移量做一下对比:
* 正文中: AE91 – A88E = 603
* 我的分析中: B6FD – B0FA = 603
考虑到程序中存储常量的部分一般不会变,这里一定程度上证明了我分析的正确性
60A 对应四个字节就是 00 00 06 0A。但在程序里字节顺序是反过来的,所以是 0A 06 00 00。
谢谢你的钻研,我也在7.1.1-42962上改好了
感谢楼主定位了这个问题,感谢你的锲而不舍
我也升级到这个版本了,修改后的文件能否提供下? 我邮箱 irenbest at 163.com
7.1.1-42962 这个版本应该是48 8D 3D BE B9 00 00 修改 48 8D 3D CC BE 00 00
把”FA B0 00 00″改成”FD B6 00 00”之后中文终于按照拼音排序了,感谢指点!
好想楼主出一个详细的教程,全网就你这里看到了解决办法