Software per decriptare Kickstart Amiga by Cloanto

Problemi e soluzioni su configurazioni software, firmware
Avatar utente
pucci
Moderatore
Moderatore
Messaggi: 4754
Iscritto il: 19/07/2005, 18:52
Città: San Clemente (RN)
Località: Rimini
Grazie Ricevuti: 62 volte

Software per decriptare Kickstart Amiga by Cloanto

Messaggio da pucci »

grazie alla collaborazione di dR.pRoDiGy abbiamo finalmente del codice java che permette di decriptare i kickstart presenti in Amiga Forever by Cloanto.
purtroppo causa impegni di lavoro (dR.pRoDiGy) e incompetenza (Pucci) il codice è molto "rustico" (per esempio per selezionare la rom da decriptare bisogna modificare all'interno del codice nome e path della rom).
basandosi sul codice che vi riporto sotto, c'è qualcuno che vuole divertirsi a realizzare un bel programmino windows (nel linguaggio che preferisce) che abbia un minimo di interfaccia?

in pratica pensavo un programma al quale dici quale file vuoi decriptare, dove trovare la key (nessun problema! le 3 attualmente esistenti le fornisco io), dove vuoi che venga salvato (e con quale nome) la rom decriptata.
magari si potrebbe anche mettere un controllo CRC32 sulla rom in input in modo che sia il programma stesso a dirti "questa rom è il kickstart 1.3" e suggerirti un nome per il file decriptato (anche qui io vi posso aiutare fornendo i CRC32 delle rom criptate e decriptate)

giusto per informazione (ma un programmatore lo capisce da solo dal codice) vi spiego come funziona il decriptyng:
- alla rom criptata vengono tolti i primi 11 byte (infatti se aprite il file criptato con un hex editor vedrete che questi byte sono sempre uguai alla stringa "AMIROMTYPE1" e servono solo a capire che si tratta di una rom criptata)
- viene eseguito uno xor ripetuto tra il file criptato e il file della chiave ("ripetuto" perchè il file chiave è molto più corto del file criptato e quindi lo si ripete per tutta la lunghezza del file criptato)

una cosa che purtroppo non ho capito è come discriminare quale delle 3 chiavi disponibili usare. forse ogni versione di amigaforever ha delle sue rom criptate e vuole una sola specifica chiave per decriptarle

qualcuno che vuole realizzare questo (credo semplice) software?

p.s.: per completezza vi allego anche il file del programma (che è opera di dR.pRoDiGy e al quel io ho purtroppo solo contribuito con le info tecniche)

Codice: Seleziona tutto

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;


public class myclass {

	private static final String keyPath = "/home/mauri/Desktop/cloanto/testfiles/rom.key";
	//private static final String inFilePath = "/home/mauri/Desktop/cloanto/testfiles/23 - amiga-ext-310-cd32-fmv.rom";
	//private static final String outFilePath = "/home/mauri/Desktop/cloanto/testfiles/decrypted23.rom";
	private static final String inFilePath = "/home/mauri/Desktop/cloanto/testfiles/72 - The Diagnostic 2.0 (Logica).rom";
	private static final String outFilePath = "/home/mauri/Desktop/cloanto/testfiles/decrypted72.rom";
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			File file = new File(keyPath);
			int keySize = (int)file.length();

			file = new File(inFilePath);
			int inFileSize = (int)file.length();
			// dal codice trovato qui:
			// http://www.koders.com/c/fid7D8443C1FE54BD6EB77F952968964B83FCE31515.aspx?s=decode_rom#L889
			// sembra che realSize sia sempre uguale alla dimensione della ROM
			int realSize = inFileSize;

			FileInputStream inpKey = new FileInputStream(keyPath);
			FileInputStream inpRom = new FileInputStream(inFilePath);
			FileOutputStream outRom = new FileOutputStream(outFilePath);

			// legge la chiave
			byte[] key = new byte[keySize];
			inpKey.read(key);
			inpKey.close();

	    	// salta i primi 11 byte (intestazione file)
			for (int loop = 0; loop < 11; loop++)
				inpRom.read();

			// effettua la decrittazione
			int t, cnt;
		    for (t = cnt = 0; cnt < inFileSize - 11; cnt++, t = (t + 1) % keySize) {
		        //mem[cnt] ^= key[t];
		    	outRom.write(inpRom.read() ^ key[t]);
		        if (realSize == cnt + 1)
		        	t = keySize - 1;
		    }

			inpRom.close();
			outRom.close();
			System.out.println("Ok.");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
Non hai i permessi necessari per visualizzare i file allegati in questo messaggio.

Torna a “Miscellanea software”