出处 仅转载!!!!!!!!!!!!!!!!!!!!!1 http://www.gebi1.com/thread-300043-1-1.html 9、制作补丁 DSM6以上没有任何方法设置支持NFS索引,因为在系统代码里已经把这个限制死了,系统如果发现路径是NFS之类的远程路径,就直接拒绝建立索引,所以只能通过非常规手段来解决这个问题,通过逆向分析绕过这部分代码。 另外,如果DSM运行在虚拟机里,系统无法读取硬盘的SMART信息,就会丧心病狂的向/var/log/messages输出日志,最终可能会塞爆磁盘空间!!所以我们也需要绕过这部分代码。 经过逆向分析,只需要修改如下函数的返回值即可 IndexIsPathRemoteMount return 0LL; IndexIsPathSupportEAWrite return 1LL; SYNOFSIsRemoteFS return edi == 6; SYNOGetFSType return 2LL; SmartDataRead return -1; SYNODiskTemperatureGet return -1; SYNODiskExceedUncThrCache return -1; 这些函数分别位于/lib/libsynoindex.so、/lib/libsynosdk.so.6和/lib/libhwcontrol.so.1这三个文件中,至于如何提取这三个文件,方法比较简单,这里不再赘述。 使用IDA对这些函数进行修改 注意:此示例只针对ds918+的DSM6.2.3-25426版本。其他版本方法一样,但是反汇编的地址可能有所不同!!! 载入libsynoindex.so,点击Exports页,找到IndexIsPathRemoteMount函数 双击上面找到的IndexIsPathRemoteMount函数,进入到汇编代码,并把光标定位到xor esi, esi这一行 选择菜单Edit->Keypatch->Patcher 选择菜单后将弹出Patcher窗口,把xor esi, esi修改为xor eax, eax,然后点击Patch按钮 Patch后如下图所示 接着把mov rbp,rdi修改为jmp 0xAAA2,然后点击Patch按钮 Patch后如下图所示 找到IndexIsPathSupportEAWrite函数,并把光标定位到xor esi, esi这一行 按照前面说的方法,Patch成下面这样 选择菜单Edit->Patchprogram->Apply patches to input file... 点击OK保存修改后的文件 载入libsynosdk.so.6,找到SYNOFSIsRemoteFS,定位到cmp edi, 0Eh这一行 按前面的方法进行Patch,Patch成如图所示 找到SYNOGetFSType函数,把光标定位到test rdi, rdi这一行 Patch后 选择菜单Edit->Patchprogram->Apply patches to input file...,打开Apply patches to input file窗口,点击OK保存修改后的文件 载入libhwcontrol.so.1文件,找到SmartDataRead函数,并把光标定位到test rdi, rdi这一行 Patch后 找到SYNODiskTemperatureGet函数,并把光标定位到jz short loc_3964D Patch后 找到SYNODiskExceedUncThrCache函数,并把光标定位到mov [rsp+0B8h+var_A8], 0这一行 Patch后 保存修改后的文件 至此总共获得3个Patch后的补丁文件,然后按前面所说的方法打补丁即可 写在最后 DSM6系统没有提供任何设置选项开启NFS索引支持,反而在代码里刻意屏蔽了对远程目录的索引,所以只能使用非常规手段来解决这个问题。本文使用的方法改变了DSM系统的部分行为,虽然暂时没发现有什么问题,但并不排除可能会引起不可预料的问题发生!!!