Java FileLock:如何从锁定的文件加载动态库?
我有一个从后端服务器检索字节数组的小程序。此字节数组包含一个动态库(DLL左右,取决于小程序运行的操作系统),必须将其写入磁盘,然后通过调用System.load()从磁盘加载 我需要确保文件在写入磁盘后,以及在操作系统通过调用System.load()加载之前未被篡改。在文件写入磁盘时,我获得了该文件的独占锁,但我的测试表明,我必须在调用System.load()之前释放该锁,否则它将无法加载库 有什么方法可以在加载文件时保持文件的锁定 示例代码:Java FileLock:如何从锁定的文件加载动态库?,java,filelock,Java,Filelock,我有一个从后端服务器检索字节数组的小程序。此字节数组包含一个动态库(DLL左右,取决于小程序运行的操作系统),必须将其写入磁盘,然后通过调用System.load()从磁盘加载 我需要确保文件在写入磁盘后,以及在操作系统通过调用System.load()加载之前未被篡改。在文件写入磁盘时,我获得了该文件的独占锁,但我的测试表明,我必须在调用System.load()之前释放该锁,否则它将无法加载库 有什么方法可以在加载文件时保持文件的锁定 示例代码: File f = File.createTe
File f = File.createTempFile("tmp", "");
RandomAccessFile raf = new RandomAccessFile(f, "rwd");
FileChannel channel = raf.getChannel();
FileLock lock = channel.lock(0, Long.MAX_VALUE, false);
// This would be where I write the DLL/SO from a byte array...
raf.write((int)65); // 'A'
raf.write((int)66); // 'B'
raf.write((int)67); // 'C'
System.out.println("Wrote dynamic library to file...");
// Close and release lock
raf.close();
System.out.println("File closed. Lock released.");
// This call fails if the file is still locked.
System.load(f.getAbsolutePath());
非常感谢您的帮助。解决方案(如果有的话)不能是任何操作系统的本机解决方案,而是可以在Java支持的所有平台上工作。解决方案也必须与Java1.4兼容
Java.nio.file.spi.FileSystemProvider
),因此库内容将完全在内存中,从而使攻击者的生命更加艰难Java.nio.file.spi.FileSystemProvider
),因此库内容将完全在内存中,从而使攻击者的生命更加艰难只是出于兴趣-您得到的错误到底是什么?我不确定,但是计算文件的md5/sha会有帮助吗?您可以在执行system.load之前检查签名。@Manishharma同意哈希摘要的想法。没有任何东西可以阻止用户“伪造”操作系统锁并继续修改文件。虽然有人为了这个目的修改文件系统代码会让人印象深刻,但你不能指望没有人会疯狂地尝试。摘要不足以满足以下原因:1)它只会显示文件在操作系统加载之前或之后被篡改过,2)如果攻击者可以在调用System.load()之前替换的内容,他也可以在调用之后和摘要计算之前替换,从而使攻击不可见。谢谢你的建议@PeterVils是代码的最后一行,应该是“System.load(f.getAbsolutePath());”。你的代码对我不起作用。@PeterVils那么这个问题还有待解决吗?或者您面临一些其他问题?我不确定,但是计算文件的md5/sha会有帮助吗?您可以在执行system.load之前检查签名。@Manishharma同意哈希摘要的想法。没有任何东西可以阻止用户“伪造”操作系统锁并继续修改文件。虽然有人为了这个目的修改文件系统代码会让人印象深刻,但你不能指望没有人会疯狂地尝试。摘要不足以满足以下原因:1)它只会显示文件在操作系统加载之前或之后被篡改过,2)如果攻击者可以在调用System.load()之前替换的内容,他也可以在调用之后和摘要计算之前替换,从而使攻击不可见。谢谢你的建议@PeterVils是代码的最后一行,应该是“System.load(f.getAbsolutePath());”。你的代码对我不起作用。@PeterVils那么这个问题还有待解决吗?或者您还面临其他一些问题?(1)肯定是一个有趣的特性,但遗憾的是,这段特定的代码必须与Java1.4兼容!(2) 我曾想过让DLL/SO构造函数在执行时对文件进行自检,但在这种特定的设置中,对于我无法说服自己能够工作的东西来说,这将是太多的工作了。(3)我完全同意这更像是一种理论上的黑客行为,但是权力决定了我要研究这一点,并提供无可辩驳的证据,证明a)这是不可能的,或者b)解决这一问题所需的工作量超过了攻击的实际危险和/或风险。(1)确实是一个有趣的特性,但遗憾的是,这段代码必须与Java 1.4兼容!(2) 我曾想过让DLL/SO构造函数在执行时对文件进行自检,但在这种特定的设置中,对于我无法说服自己能够工作的东西来说,这将是太多的工作了。(3)我完全同意这更像是一种理论上的黑客行为,但权力要求我调查此事,并提供无可辩驳的证据,证明a)这是不可能的,或b)解决这一问题所需的工作量超过了实际的危险和/或风险