CRC32 exe giochi Teknoparrot

Tutti gli emulatori che ci possono servire sul nostro cab con SO Windows
Avatar utente
pucci
Moderatore
Moderatore
Messaggi: 4772
Iscritto il: 19/07/2005, 18:52
Città: San Clemente (RN)
Località: Rimini
Grazie Ricevuti: 62 volte

CRC32 exe giochi Teknoparrot

Messaggio 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?
Avatar utente
Gothrek
Moderatore
Moderatore
Messaggi: 4905
Iscritto il: 13/07/2017, 13:30
Città: Roma
Grazie Inviati: 17 volte
Grazie Ricevuti: 272 volte

Re: CRC32 exe giochi Teknoparrot

Messaggio 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.
Avatar utente
pucci
Moderatore
Moderatore
Messaggi: 4772
Iscritto il: 19/07/2005, 18:52
Città: San Clemente (RN)
Località: Rimini
Grazie Ricevuti: 62 volte

Re: CRC32 exe giochi Teknoparrot

Messaggio da pucci »

Stasera cerco di farti avere uno degli eseguibili che ritengo essere corretti

Inviato dal mio ONEPLUS A5010 utilizzando Tapatalk

Pucci - The Bastard Son of Arcade Italia
"MODerrare humanum est"
tutte le copertine di The Games Machine
non combatto guerre di intelligenza con gente disarmata
Avatar utente
Gothrek
Moderatore
Moderatore
Messaggi: 4905
Iscritto il: 13/07/2017, 13:30
Città: Roma
Grazie Inviati: 17 volte
Grazie Ricevuti: 272 volte

Re: CRC32 exe giochi Teknoparrot

Messaggio 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
Avatar utente
pucci
Moderatore
Moderatore
Messaggi: 4772
Iscritto il: 19/07/2005, 18:52
Città: San Clemente (RN)
Località: Rimini
Grazie Ricevuti: 62 volte

Re: CRC32 exe giochi Teknoparrot

Messaggio 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
Avatar utente
Gothrek
Moderatore
Moderatore
Messaggi: 4905
Iscritto il: 13/07/2017, 13:30
Città: Roma
Grazie Inviati: 17 volte
Grazie Ricevuti: 272 volte

Re: CRC32 exe giochi Teknoparrot

Messaggio 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
Avatar utente
pucci
Moderatore
Moderatore
Messaggi: 4772
Iscritto il: 19/07/2005, 18:52
Città: San Clemente (RN)
Località: Rimini
Grazie Ricevuti: 62 volte

Re: CRC32 exe giochi Teknoparrot

Messaggio 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?
Avatar utente
pucci
Moderatore
Moderatore
Messaggi: 4772
Iscritto il: 19/07/2005, 18:52
Città: San Clemente (RN)
Località: Rimini
Grazie Ricevuti: 62 volte

Re: CRC32 exe giochi Teknoparrot

Messaggio 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 };
Avatar utente
pucci
Moderatore
Moderatore
Messaggi: 4772
Iscritto il: 19/07/2005, 18:52
Città: San Clemente (RN)
Località: Rimini
Grazie Ricevuti: 62 volte

Re: CRC32 exe giochi Teknoparrot

Messaggio 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?
Avatar utente
pucci
Moderatore
Moderatore
Messaggi: 4772
Iscritto il: 19/07/2005, 18:52
Città: San Clemente (RN)
Località: Rimini
Grazie Ricevuti: 62 volte

Re: CRC32 exe giochi Teknoparrot

Messaggio 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);
Rispondi

Torna a “Emulatori Windows”