作者:海嘯天鳴(Ansty)
Windows操作系統中的所有文件都有一項屬性,就是“最後修改時間”(LastModified),手工殺毒經常用到這項屬性,用以對比可疑文件。因此,咱們做黑軟的就有必要在這個屬性上面做做手腳瞭,而且我們還可以精確到秒。軟件界面如圖1所示,GUI制作我就不介紹瞭,具體大傢可以看代碼。
圖1
選擇文件
得到目標文件是所有工作的開始,我們用JFileChooser控件新建一個文件選擇對話框,選擇文件就是為瞭得到文件的絕對路徑提供給File類,所以我們要使用getAbsolutePath方法來得到絕對路徑。
public String chooseFile(){
int choice;
String fileName = null;
JFileChooser jfc = new JFileChooser();
//新建一個JFileChooser控件
jfc.setSize(400,400); //設置文件選擇對話框大小
choice = jfc.showOpenDialog(this);
if(choice == JFileChooser.APPROVE_OPTION){
fileName = jfc.getSelectedFile().getAbsolutePath();
//得到選擇的文件的絕對路徑
}
return fileName;//返回文件路徑
}
打印文件最後修改時間
從chooseFile()得到選擇的文件後,新建File實例,使用File類提供的lastModified方法得到最後修改時間,該方法的原型如下。
lastModified
public long lastModified()
//返回此抽象路徑名表示的文件最後一次被修改的時間
為什麼返回的是long類型呢?看過Java doc可以知道,這個long表示的是與歷元(1970 年 1 月 1 日,00:00:00GMT)的時間差來計算此值(以毫秒為單位)。我們可以直接用“new Date(objFile.lastModified()).toLocaleString()”得到我們熟悉的日期格式“yyyy-mm-dd hh:mm:ss”。不過,我們不能用Date獲得具體年月日的getYear()等方法,因為已經過期,再使用的話得到的也是錯誤的值,所以我們要改用Calendar類的方法。
Calendar是抽象方法,不能實例化,需要用Calendar.getInstance()得到一個實例。因為Date的獲得年月日字段已經過期,所以我們使用Calendar.get()方法來獲得年月日的字段c.get(Calendar.Year)。因為Calendar.Month獲得的Month會少一個月,所以我們要“+1”。具體為什麼,我沒有研究,可能是系統時區的問題吧。
public void print(){
Date date = new Date(objFile.lastModified());
Calendar c = Calendar.getInstance();
c.setTimeInMillis(objFile.lastModified());
jtfTime.setText(date.toLocaleString());
jtfYear.setText(c.get(Calendar.YEAR)+””);//打印年份
jtfMonth.setText(c.get(Calendar.MONTH)+1+””);//打印月份jtfDay.setText(c.get(Calendar.DAY_OF_MONTH)+””);//打印日期
jtfHour.setText(c.get(Calendar.HOUR_OF_DAY)+””);//打印小時
jtfMin.setText(c.get(Calendar.MINUTE)+””);//打印分
jtfSec.setText(c.get(Calendar.SECOND)+””);//打印秒
}
修改文件的最後修改時間
因為Calendar類是抽象類,我們不能像一般類那樣用構造方法進行初始化,而要使用Calendar.set()方法來設置其屬性,其原型如下。
set(int year,int month,int date,int hourOfDay, int minute ,int second)
由於我們用set()方法得到的是Calendar類型的,而File類的setLastModified()的形參類型卻是Long,所以我們必須把Calendar轉換成long,此時就要調用Calendar類的getTimeInMillis()方法,如下面的c.getTimeInMillis()。因為我們前面在打印月份的時候是加瞭一個1的,所以我們要保持原有毫秒計數的正確,在jtfMonth.getText()得到的數字再減一個1,就有瞭“Integer.parseInt(jtfMonth.getText())-1”。
public void modifyTime(){
int year = Integer.parseInt(jtfYear.getText());
//因為從文本框裡得到的是String類型,我們需要轉換成int類型。
int month = Integer.parseInt(jtfMonth.getText())-1;
……省略若幹代碼
c.set(year,month,day,hour,min, sec);
file.setLastModified(c.getTimeInMillis());
print();
jbReset.setEnabled(true);
}
還原時間
整個功能的實現其實隻是在一開始載入文件的時候就把文件時間存到一個獨立變量reset裡面,還原的時候直接把reset的值調入到File.setLastModified()裡面就完成瞭。
由於本人的水平原因,所以程序實現的算法上沒有下功夫去優化,還有一些程序異常也沒有去捕獲,不過本文隻是給大傢提供一個思路,用Java也能寫黑軟。雖然這隻是一個小軟件,但足以說明Java也能用來寫黑軟,而且由於Java是跨平臺的,就是說咱們在Windows下寫的東西在*nix、Mac等裝瞭JRE的操作系統下也照樣能用。殺軟現在對Java寫的程序不怎麼感冒,要是我們用Java來寫後門,相信會在一大堆殺軟面前跑得好好的。下次,我就給大傢帶來一些Java寫黑軟的文章,說不定我們中間的朋友手上就會有瞭跨平臺的馬兒瞭