月度归档:2015年02月

从C到Java的小贴士

这学期又要给网工同学上Java课了,先在这里写一点tips要点。

  1. public static void main(String []args) 是死规定,没有为什么。
  2. [  ]是一种对象,自带.length
  3. 所有方法都写成static的,可以在java的对象里面写过程式程序。
  4. String不是char[],汉字也不是两个字节,”中文”.length()==2
  5. java.util.*是入门的必经之路,熟悉里面的List/Vector/Collections等常用工具类可以顺利解决大部分问题。
  6. switch在1.7之后可以用String类型(学校OJ是1.6,不支持)
  7. Integer.parseInt()   Double.parseDouble()  String.valueOf() 是常见数据类型转换工具。
  8. System.out.format System.out.printf 用起来跟stdio.h的printf是一样的。
  9. String.format()可以快速高效的拼接字符串。
  10. String是个final类,不能继承,这是有意为之。
  11. OJ上做题只有Main这个类可以是public,其他类不能用public。
  12. new Scanner(System.in)这个操作只能做一次。
  13. scanner.next()之后如果当前输入位置在行尾,nextLine()将只能得到一个””。
  14. 有的题用Scanner.nextLine()+String.split(” “)处理起来编码效率最高

 

如何理解NSA新型硬盘病毒?

卡巴斯基实验室发现一种来自于NSA的新型病毒的痕迹。

这里写一下个人对该项技术的理解,转载请留出处。

http://www.hustoj.com/?p=87

硬盘病毒,首先让人联想到的是MBR引导区病毒,但是这种东西自从NTLDR广泛使用以来就不能兴风作浪了。所以,这里的硬盘病毒不是指MBR中的异常代码。

新闻中提到,这个病毒的实现是一种技术飞跃,很有可能是在参考了硬盘厂商的源代码之后制造出来的。这就表明,该病毒并非一般意义上的Intelx86/AMDx64病毒,而是运行在硬盘控制器(firmware固件)中的特殊代码。当然,firmware中的可能仅仅是一个运载关键组件,在上位系统(Windows/Linux)中应该还有一部分实际运作的有效载荷。

我们都知道,硬盘是以逻辑扇区、磁道、柱面等方式划分空间的,这些地址数据由操作系统通过接口总线(SATA/SAS/IDE)发送给硬盘,在硬盘控制器中转换为物理地址,驱动盘片、磁头访问实际位置。

假如在fireware中对数据进行监控,发现常见操作系统的程序文件被读取时,可以认为其正在加载该代码进入上位系统内存,这个时候,用事先存放在硬盘备用扇区中的恶意代码进行替换,上位系统完全无法识别,进而被感染。被感染的进程可以是任何进程,包括操作系统核心。

而新闻中还提到,fireware因为通常只做升级硬盘性能使用,并且受知识产权保护,通常是只写而不可读取的,这就使得病毒隐藏至深,无法被扫描。

如果前述猜想是正确的,那么通过一个未感染系统启动并热插拔挂载被感染的硬盘,然后向其中写入一个常见操作系统的文件系统,然后用一个虚拟机模拟启动操作,读取该硬盘中的文件,再从中截取读到的数据,跟之前写入的数据进行对比,应该会发现关键数据被改写的痕迹。

假如真的是这样,那么该病毒成功的将恶意代码的领域扩展至MCU,通过跨平台的两种运行机制的紧密合作,变成了一种几乎无法杀死的程序。

更进一步,报道提到,该病毒可以通过移动存储介质,从物理隔离的计算机系统中窃取数据。可以这样理解,假设一个军事机密网络,它跟互联网是物理隔离的,但是其中某块硬盘上感染了该恶意代码,进而感染了整个网络。只要物理隔离,窃取到的机密数据无法通过互联网返回NSA。但是,假如有人使用了移动存储设备,比如一个U盘或移动硬盘,那么该病毒可以将机密数据保存到该设备的可用空间中,而不以文件形式列入文件分配表。当这个移动存储设备再次连接到另一台与互联网有直接连接的系统上时,假如这个系统也同样感染了该病毒(这是很有可能的),那么病毒就有机会读取隐藏在移动存储设备中的机密数据,发送给NSA。

联想最近经常遇到U盘无法弹出,真是细思极恐。

那么怎样才能杀死这个病毒呢?

首先,你得有个“可靠”的系统,比如古老发行版的Linux LiveCD。

然后,刷写“可信”的fireware,比如来自硬盘厂商的最新更新,当然我们假设硬盘厂商没有被迫为虎作伥。

最后,对整个硬盘做置零操作,低级格式化,重新分区,