Pagina 1 di 2

CRC32 exe giochi Teknoparrot

Inviato: 17/05/2020, 23:02
da pucci
Teknoparrot ha un sistema di riconoscimento dei giochi utilizzando il CRC32 degli esegubili dei giochi stessi.
Purtroppo non sembra usare un CRC32 "classico" (come quello che si vede nei programmi di compressione tipo WinZIP, WinRAR, 7Z) ma un qualcosa di diverso che non riesco a comprendere viste le mie scarse competenze in programmazione.

qualcuno dei nostro programmatori (@motoschifo , @Gothrek , altri???) mi può dare una mano a come decodificarli?

qui https://github.com/teknogods/OpenParrot ... Detect.cpp trovate il metodo usato per l'identificazione GameDetect::DetectCurrentGame()
dove viene assegnato un valore alla variabile crcResult e attraverso un costrutto Switch viene identificato il gioco

il problema è che secondo me crcResult non contiene il CRC come noi lo conosciamo

il valore di crcResult viene assegnato attraverso una funzione GetCRC32 che trovate definita qua https://github.com/teknogods/OpenParrot ... /Utils.cpp

a complicare un po' le cose nel case deafult dello switch viene calcolata una variabile newCrcResult che è a sua volta sottoposta ad uno switch
questa nuova variabile è quella alla quale vorrebbero convertire tutti i metodi di identificazione, c'è infatti una nota:
// TODO: move all game detection bound to crcResult immediately below to use the newCrcResult switch at end with its new CRC instead.

riuscite a darmi una mano a risalire ai CRC dei file corretti?

Re: CRC32 exe giochi Teknoparrot

Inviato: 17/05/2020, 23:53
da Gothrek
te lo verifico, amche io uso una mia funzione crc32 nel gotscraper.

partiamo da capire qual'è il reale crc32 del file (mi serve il file), cosi lo compariamo. e da li andiamo a vedere come la calcola lui rispetto a come faccio io per esmpio.

Re: CRC32 exe giochi Teknoparrot

Inviato: 18/05/2020, 7:08
da pucci
Stasera cerco di farti avere uno degli eseguibili che ritengo essere corretti

Inviato dal mio ONEPLUS A5010 utilizzando Tapatalk


Re: CRC32 exe giochi Teknoparrot

Inviato: 18/05/2020, 12:59
da Gothrek
pucci ha scritto: 18/05/2020, 7:08 Stasera cerco di farti avere uno degli eseguibili che ritengo essere corretti

Inviato dal mio ONEPLUS A5010 utilizzando Tapatalk
Ho già un sospetto, vediamo col tuo file cosa vien fuori

Re: CRC32 exe giochi Teknoparrot

Inviato: 18/05/2020, 13:59
da pucci
@Gothrek ho caricato qui https://mega.nz/file/5YpA3YSR#5UhLJsb4b ... cyZS5xvnqg alcuni file exe di test
il nome del file exe è il CRC32 che si dovrebbe ottenere con i metodi di Teknoparrot

Re: CRC32 exe giochi Teknoparrot

Inviato: 18/05/2020, 15:01
da Gothrek
eccoci, riporto la scansione fatta con programma di calcolo crc32 (valore in maiuscolo) e col mio gotscraper (valori in minuscolo). direi che il valore riportato non è un crc32 valido (e questo l'avevi già intuito).

A questo punto si potrebbe andar a vedere perchè da quei valori (il c++ non è il mio forte ma vediamo di uscirne son poche righe di codice):

D:\Personale\ROMS\exe_test_with_teknoparrot_CRC32\0x19ba6a0c.exe - 7A877D2F - 7a877d2f
D:\Personale\ROMS\exe_test_with_teknoparrot_CRC32\0x358ec3ff.exe - D4F7D10A - d4f7d10a
D:\Personale\ROMS\exe_test_with_teknoparrot_CRC32\0x7cc54950.exe - 0CE2E9A3 - 0ce2e9a3
D:\Personale\ROMS\exe_test_with_teknoparrot_CRC32\0x87670e0f.exe - 315E2C2A - 315e2c2a
D:\Personale\ROMS\exe_test_with_teknoparrot_CRC32\0xb8f2836d.exe - 052B44C9 - 052b44c9

Re: CRC32 exe giochi Teknoparrot

Inviato: 18/05/2020, 21:58
da pucci
si, questo lo sapevo, anche perchè il VERO crc32 lo si vede già dai file Zip o RAR delle rom.
Teknoparrot usa una specie di crc32 modificato, o meglio credo che calcoli il vero crc32 ma solo su una parte dell'eseguibile (per capirci, come quello che avviene con certe roms dove si calcola il crc32 escludendo l'header della rom).

Questo post l'ho aperto perchè il mio obiettivo è quello di avere un programma che mi calcoli i crc32 "modificati" di Teknoparrot
Mi basterebbe anche una programma con una piccola finestra dove fai drag & drop degli eseguibili e lui ti restituisce in una finestra il CRC32 "modificato" di Teknoparrot
Perchè voglio fare tutto questo? per capire quali eseguibili vuole Teknoparrot (dovrebbero essere quelli originali delle rom) e se si usano CRC32 non originali Teknoparrot non funziona (e questo non è aspetto secondario), mentre GameLoader ALLRH o JConfig funzionano anche con exe modificati

Se poi oltre a questo si potesse capire perché Teknoparrot calcola il crc32 in questo strano modo sarebbe sicuramente utile per recuperare romset "puliti"

Pensi che sia possibile realizzare il programma che ti ho detto?

Re: CRC32 exe giochi Teknoparrot

Inviato: 18/05/2020, 22:05
da pucci
si potrebbe iniziare traducendo questo codice C++ in qualcosa di più usabile per chi non mastica troppo questo linguaggio

Codice: Seleziona tutto

uint32_t GetCRC32(const void* pData, int length)
{
	uint32_t _crc = 0xFFFFFFFF;
	unsigned char* pCur = (unsigned char*)pData;
	int remaining = length;
	for (; remaining--; ++pCur)
		_crc = (_crc >> 8) ^ kCrc32Table[(_crc ^ *pCur) & 0xff];

	return _crc ^ 0xFFFFFFFF;
}

static DWORD crc_32_tab[] = {
	0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
	0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
	0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
	0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
	0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
	0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
	0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
	0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
	0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
	0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
	0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
	0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
	0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
	0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
	0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
	0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
	0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
	0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
	0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
	0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
	0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
	0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
	0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
	0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
	0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
	0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
	0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
	0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
	0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
	0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
	0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
	0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
	0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
	0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
	0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
	0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
	0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
	0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
	0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
	0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
	0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
	0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
	0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d };

Re: CRC32 exe giochi Teknoparrot

Inviato: 18/05/2020, 22:28
da pucci
visto che la funzione GetCRC32 viene chiamata in questo modo

Codice: Seleziona tutto

uint32_t crcResult = GetCRC32(GetModuleHandle(nullptr), 0x400);
penso che venga calcolato il crc32 solo sui primi 1024 (400 in esadecimale) byte dell'eseguibile
forse è fatto in questo strano modo per risparmiare tempo?

Re: CRC32 exe giochi Teknoparrot

Inviato: 18/05/2020, 22:32
da pucci
questo invece è come viene calcolato il newcrc32

Codice: Seleziona tutto

// Craft CRC detection without virtual address
		memcpy(newCrc, GetModuleHandle(nullptr), 0x400);
		DWORD pePTR = *(DWORD*)(newCrc + 0x3C);

		// Overwrite ImageBase with 8 bytes of 0
		*(DWORD*)(newCrc + pePTR + 0x18) = 0x00000000;
		*(DWORD*)(newCrc + pePTR + 0x18 + 4) = 0x00000000;
#ifdef _AMD64_
		* (DWORD*)(newCrc + pePTR + 50) = 0x00000000;
#endif
		* (DWORD*)(newCrc + pePTR + 54) = 0x00000000;
		uint32_t newCrcResult = GetCRC32(newCrc, 0x400);

Re: CRC32 exe giochi Teknoparrot

Inviato: 19/05/2020, 9:04
da Gothrek
@pucci
tradurre la funzione crc32 dal c++ non è un problema son poche righe di codice e portarlo in c# o altro sarà facile.
Ho provato a calcolarlo sui primi 1024 byte ma non torna, quindi meglio procedere a capire come lo fa. Non credo che sia per risparmiare tempo in quanto già il crc32 è un controllo sul file abbastanza blando per via del numero di collisioni e farlo solo una porzione di file aumenterebbe esponenzialmente tale rischio.

una volta capito come e su cosa lo calcola fare un programmino che chiedi non c'è nessun problema

Re: CRC32 exe giochi Teknoparrot

Inviato: 19/05/2020, 11:21
da Gothrek
@pucci

ho convertito la funzione, a prescindere dal buffer (1024 o 4K che sia, parametro passato nella funzione) il risultato non cambia.

Questa la funzione convertita in c# che da il risultato in decimale (ma convertito in HEX continua a dare il crc32 giusto), quindi il problema non credo sia legato alla funzione:

Codice: Seleziona tutto

public static UInt32 GetCRC32_4(string FileName)
        {
            UInt32 _crc;
            long StreamLength;
            int BufferSize;
            byte[] Buffer;
            UInt32[] pTable = {
                0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
                0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
                0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
                0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
                0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
                0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
                0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
                0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
                0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
                0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
                0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
                0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
                0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
                0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
                0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
                0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
                0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
                0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
                0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
                0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
                0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
                0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
                0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
                0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
                0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
                0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
                0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
                0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
                0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
                0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
                0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
                0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
                0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
                0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
                0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
                0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
                0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
                0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
                0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
                0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
                0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
                0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
                0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d };

            //1KB Buffer
            BufferSize = 0x0400; //in teoria parametro passato quanto è richiamata la funzione

            FileStream fs = new FileStream(FileName, FileMode.Open);
            StreamLength = fs.Length;

            _crc = 0xFFFFFFFF;
            while (StreamLength > 0)
            {
                if (StreamLength < BufferSize)
                {
                    BufferSize = (int)StreamLength;
                }
                Buffer = new byte[BufferSize];

                fs.Read(Buffer, 0, BufferSize);

                for (int i = 0; i < BufferSize; i++)
                {                    
                    _crc = (_crc >> 8) ^ pTable[(_crc ^ Buffer[i]) & 0xFF]; // alternativa _crc = ((_crc & 0xFFFFFF00) / 0x100) & 0xFFFFFF ^ pTable[Buffer[i] ^ _crc & 0xFF];
                }

                StreamLength -= - BufferSize;

            }

            fs.Close();

            _crc ^= 0xFFFFFFFF; //alternativa _crc = (-(_crc)) - 1; // !(_crc)
            return (UInt32)_crc;
        }

Re: CRC32 exe giochi Teknoparrot

Inviato: 19/05/2020, 14:11
da pucci
Cercherò di capire meglio cosa non torna in questa funzione

Inviato dal mio ONEPLUS A5010 utilizzando Tapatalk


Re: CRC32 exe giochi Teknoparrot

Inviato: 19/05/2020, 14:12
da pucci
Il problema è che su Discord di Teknoparrot sono simpatici come la sabbia nelle mutande

Inviato dal mio ONEPLUS A5010 utilizzando Tapatalk


Re: CRC32 exe giochi Teknoparrot

Inviato: 19/05/2020, 14:25
da Gothrek
pucci ha scritto: 19/05/2020, 14:11 Cercherò di capire meglio cosa non torna in questa funzione

Inviato dal mio ONEPLUS A5010 utilizzando Tapatalk
secondo me la funzione va bene cosi come è, non so da dove prendi il valore con cui hai rinominato il file.

tu mi hai passato 5 file che NON andavano bene mi è parso di capire, puoi passarmene uno o due che invece vanno bene? vediamo se riesco ad aiutarti nell'analisi.

per la sabbia nelle mutande mi astgengo :D

Re: CRC32 exe giochi Teknoparrot

Inviato: 19/05/2020, 19:58
da pucci
No, quelli che ti ho mandato andavano bene. È proprio questo il problema.

Sono convinto che il loro sistema di calcolo dei crc32 non usa il file normalmente calcolandone direttamente il crc32 ma prima ma lo manipola in qualche modo

Inviato dal mio ONEPLUS A5010 utilizzando Tapatalk


Re: CRC32 exe giochi Teknoparrot

Inviato: 19/05/2020, 20:45
da Gothrek
allora devo poter vedere tutto il programma per capire cosa mandano "in pasto" al crc32. Una delle poche certezze che la funzione Getcrc32 fa regolarmente il suo dovere.

Re: CRC32 exe giochi Teknoparrot

Inviato: 19/05/2020, 21:02
da pucci
il programma completo è qui: https://github.com/teknogods/OpenParrot

Re: CRC32 exe giochi Teknoparrot

Inviato: 20/05/2020, 8:14
da alucard
Scusate, solo per capire.

Diciamo che TP accetta o respinge un file in base ad un suo criterio.

Se si decodifica il suo criterio e lo si implementa in un tool, questo a sua volta darà gli stessi esiti di TP.

Se l’ok lo da un tool anziché TP, che comodità in più ci sarebbe? Il gioco va comunque scaricato.

Re: CRC32 exe giochi Teknoparrot

Inviato: 20/05/2020, 14:14
da pucci
Ho una certa riluttanza ad usare Teknoparrot

Inviato dal mio ONEPLUS A5010 utilizzando Tapatalk