Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #define NONE 255
- // Joyetech APROM
- const char signature[] = { 0x0A, 0x0A, 0x4A, 0x6F, 0x79, 0x65, 0x74, 0x65, 0x63, 0x68, 0x20, 0x41, 0x50, 0x52, 0x4F, 0x4D, 0x0A };
- void displayHelp( char * );
- int decryptFile( char *, int );
- /**
- * MAIN
- */
- int main( int argc, char *argv[] ) {
- if ( argc != 2 ) {
- displayHelp( argv[0] );
- return EXIT_SUCCESS;
- }
- int i; int res;
- for ( i=-128; i<=127; i++ ) {
- res = decryptFile( argv[1], i );
- if ( res != NONE ) {
- printf( "Offset found : %d\n", i );
- break;
- }
- }
- return EXIT_SUCCESS;
- }
- void displayHelp( char *appName ) {
- printf( "Usage : %s firmware\n", appName );
- printf( "%s find offset for decrypt\n", appName );
- printf( "\n" );
- }
- int decryptFile( char *inFirmware, int offset ) {
- // Ouverture du firmware chiffré
- FILE *fpIn = fopen( inFirmware, "rb" );
- if ( fpIn == NULL ) {
- printf( "Unable to open %s\n", inFirmware );
- return NONE;
- }
- // Offset de départ, c'est ce que l'on cherche à trouver
- signed char key = (char)offset;
- // Lit jusqu'à la fin du fichier, octet par octet
- char c; int i=0; int limit = sizeof( signature );
- size_t sizeOfChar = (size_t)sizeof( char );
- while ( fread( &c, sizeOfChar, sizeOfChar, fpIn) != 0 ) {
- c = c ^ key; // xor
- if ( c == signature[i] )
- i++;
- else
- i = 0;
- // Si on a trouvé la signature
- if ( i == limit ) {
- fclose( fpIn );
- return 1;
- }
- /* Incremente la clé */
- if ( (key >= -128) && (key < 127) )
- key++;
- else
- key = -128;
- }
- fclose( fpIn );
- return NONE; // valeur arbitraire
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement