Windows操作系统中的所有文件都有一项属性,就是“最后修改时间”(LastModified),手工杀毒经常用到这项属性,用以对比可疑文件。因此,咱们做黑软的就有必要在这个属性上面做做手脚了,而且我们还可以精确到秒。软件界面如图1所示,GUI制作我就不介绍了,具体大家可以看代码。

Java 中 更改文件路径 java如何修改文件数据_绝对路径


图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写黑软的文章,说不定我们中间的朋友手上就会有了跨平台的马儿了。