/*
*
* Fabrizio Cornelli
* HT
*
* Credits to: ReDEX.class
* Coded: Timothy Strazzere
*
*/
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.System;
import java.util.Arrays;
import java.util.zip.Adler32;
import java.security.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.math.BigInteger;
public class FixDEX {
public static void main(String[] args) {
if (args.length != 1) {
System.out.println("Invalid parameters");
System.exit(0);
}
try {
//File file = new File(args[0]);
byte[] barr = null;
//barr = getBytesFromFile(file);
barr = Files.readAllBytes(Paths.get(args[0]));
System.out.println("Original Checksum: " + toHex(Arrays.copyOfRange(barr, 8, 12)));
System.out.println("Original Signature: " + toHex(Arrays.copyOfRange(barr, 12, 32)));
calcSignature(barr);
calcChecksum(barr);
System.out.println("New Checksum: " + toHex(Arrays.copyOfRange(barr, 8, 12)));
System.out.println("New Signature: " +toHex(Arrays.copyOfRange(barr, 12, 32)));
Files.write(Paths.get(args[0]), barr);
} catch (Exception e) {
System.err.println("File input error: " + e);
}
}
public static String toHex(byte[] arg) {
return String.format("%X", new BigInteger(1, arg));
}
public static String byteArrayToHexString(final byte[] b) {
final StringBuffer sb = new StringBuffer(b.length * 2);
for (final byte element : b) {
final int v = element & 0xff;
if (v < 16) {
sb.append('0');
}
sb.append(Integer.toHexString(v));
}
return sb.toString().toUpperCase();
}
private static void calcSignature(byte bytes[]) {
MessageDigest md;
try {
md = MessageDigest.getInstance("SHA-1");
} catch (NoSuchAlgorithmException ex) {
throw new RuntimeException(ex);
}
md.update(bytes, 32, bytes.length - 32);
try {
int amt = md.digest(bytes, 12, 20);
if (amt != 20)
throw new RuntimeException((new StringBuilder()).append("unexpected digest write:").append(amt).append("bytes").toString());
} catch (DigestException ex) {
throw new RuntimeException(ex);
}
}
private static void calcChecksum(byte bytes[]) {
Adler32 a32 = new Adler32();
a32.update(bytes, 12, bytes.length - 12);
int sum = (int) a32.getValue();
bytes[8] = (byte) sum;
bytes[9] = (byte) (sum >> 8);
bytes[10] = (byte) (sum >> 16);
bytes[11] = (byte) (sum >> 24);
}
}