是否可以用Java编写防病毒程序,例如它可以拦截程序的执行?我可以对 Java 中的操作系统进行如此深入的控制吗?
更新:c#呢?同样的限制适用还是更好的方法?
对操作系统产生这样的影响是可能的。唯一的问题是,您将失去平台独立性,或者至少必须为每个给定平台编写代码,因为此类操作需要对系统进行相当深入的访问,而这可以通过JNI来实现,这将与您在操作系统中使用它的方法。
我认为 Java 不可能实现这种控制,主要是因为它使用 VM 并且不受操作系统的影响。或者更确切地说,操作系统与 Java VM 隔离。这是设计使然。
为清楚起见,编辑添加:我假设您想用 Java 编写整个解决方案,而不是混合语言。
我不相信它甚至可以与 JNI 一起使用。
在操作系统启动新进程(或写入文件或其他任何内容)时“拦截”的情况下,您需要编写某种挂钩到操作系统的驱动程序或内核模块。该驱动程序/模块肯定是用本机编译代码编写的。所以操作系统是这里的负责人,最终会调用你的本地模块。
因此,正如我所见,Java 甚至没有在这里涉及。
无论如何,这就是基本方法。可以使用类似pam
Linux 的东西,它可以配置为执行与安全性和文件/进程权限相关的几乎任何事情,并且可以调用其他进程来进行投标。尽管为操作系统尝试启动的每个新进程运行一个 JVM 实例似乎有些牵强。
正如 HalloDu 所说,这在技术上可以通过使用 JNI 来实现。但是,IIRC,大多数防病毒程序都使用某种驱动程序来拦截打开的文件并在允许操作系统继续使用文件之前对其进行扫描。在这种情况下,您必须编写的本机代码量(用 C 或可能的 C++ 编写)将是巨大的,并且可能在大小上超过您的 Java 代码。
在编写低级应用程序时,我会坚持使用 C。但是,用高级语言编写诸如 GUI 之类的东西可能是有意义的,尽管 Java 也不是我的选择,因为这有点痛苦与 C 交互。就我个人而言,我会在 C 中做所有该死的事情,只是因为混合语言往往是一种痛苦。如果我必须混合语言,我会选择 C 和 python,因为ctypes使与 C 的交互变得非常容易。
使用JNI是可能的。不过,您主要将 Java 用于 GUI 和 C/C++ 用于任何其他类型的防病毒工作。
制作自己的防病毒软件有什么意义?这是很多工作,但我想如果你把它做成一个便携式的,可以阻挡并移除所有更讨厌的东西,那会很酷。如果你必须坚持,ClamAV,它是一个开源且相当不错的 AV(无实时保护),但使用 C++ 编程。
您最好的选择可能是用 Java 编写 GUI 和大部分逻辑,然后使用 C 或 C++ 后端进行扫描。
然后,您可以跨平台重用前端,并将平台特定的东西保留在较低级别。
通过这种方式,您可以利用这两种语言的优势——Java 的平台独立性和易用性以及 C/C++ 直接访问底层平台的能力。