我是玩Java的,在一个局域网里面通常会用到飞秋之类的聊天工具,相信飞秋大家也很熟悉,接下来给大家献上用了一个晚自习时间摸索出来的飞秋修改方案,用Java代码实现的,直接贴代码
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
/**
* 修改飞秋。其实可以修改任何没有经过压缩的文件或程序
* 编译本代码,然后把飞秋程序复制到同一目录,并且更名为4.exe,然后运行本程序
* @author 71934
*
*/
public class Tools1 {
public static void main(String[] args) {
try {
go("自己", "大神");
//这样,当你打开修改后的飞秋的时候你会发现“自己”分组变成“大神”分组了
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
private static void go(String lodField,String newField) throws IOException{
// TODO 自动生成的方法存根
byte[] feiQiu = new byte[1024*64]; //64K的对比空间
FileInputStream in = new FileInputStream(new File("4.exe"));
FileOutputStream out = new FileOutputStream(new File("5.exe"));
String title = lodField; //飞秋(FeiQ) 2013 正式版
for (int i = in.read(feiQiu, 0, feiQiu.length); i > 0; i = in.read(feiQiu, 0, feiQiu.length)) {
String temp = new String(feiQiu);
if(temp.contains(title)){
//锁定二进制位置
int head = temp.indexOf(title);
int foot = title.length();
//字节提取
ArrayList<Byte> headlist = new ArrayList<>();
for(int j = 0 ; j < head ; j++){
//X
headlist.add(feiQiu[j]);
}
byte[] newtitle = newField.getBytes();
for(int j = 0 ; j < foot ; j++){
//Y
headlist.add(newtitle[j]);
}
for(int j = head+foot ; j < feiQiu.length ; j++){
//Z
headlist.add(feiQiu[j]);
}
//移花接木
for(int j = 0 ; j < headlist.size() ; j++){
out.write(headlist.get(j));
}
System.out.println("找到1项匹配,更改");
}else{
out.write(feiQiu, 0, i);
}
}
in.close();
out.close();
}
}
将上面这条代码编译,然后跟飞秋放在同一目录,并且将飞秋更名为4.exe,运行本代码会发现目录中多出了一个5.exe,这个5.exe就是修改后的飞秋
这是通过IO的巧妙复制实现的
原理:在复制的过程中寻找String元素,直接new一个String,把字节放进去,能查到的就是String元素
找到要修改的String后,定位这个String元素对应的二进制所在的位置,找到后,将新的String转换成bate[]数组,替换进去
然后直接write。
理论上可以修改任何文件