Advertisement
Guest User

Joyetech firmware bruteforce offset

a guest
Dec 7th, 2016
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.63 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define NONE    255
  5.  
  6. // Joyetech APROM
  7. const char signature[] = { 0x0A, 0x0A, 0x4A, 0x6F, 0x79, 0x65, 0x74, 0x65, 0x63, 0x68, 0x20, 0x41, 0x50, 0x52, 0x4F, 0x4D, 0x0A };
  8.  
  9. void displayHelp( char * );
  10. int decryptFile( char *, int  );
  11.  
  12. /**
  13. *   MAIN
  14. */
  15. int main( int argc, char *argv[] ) {
  16.     if ( argc != 2 ) {
  17.         displayHelp( argv[0] );
  18.         return EXIT_SUCCESS;
  19.     }  
  20.    
  21.     int i; int res;
  22.     for ( i=-128; i<=127; i++ ) {
  23.         res = decryptFile( argv[1], i );
  24.         if ( res != NONE ) {
  25.             printf( "Offset found : %d\n", i );
  26.             break;     
  27.         }
  28.     }
  29.     return EXIT_SUCCESS;
  30. }
  31.  
  32. void displayHelp( char *appName ) {
  33.     printf( "Usage : %s firmware\n", appName );
  34.     printf( "%s find offset for decrypt\n", appName );
  35.     printf( "\n" );
  36. }
  37.  
  38. int decryptFile( char *inFirmware, int offset ) {
  39.     // Ouverture du firmware chiffré
  40.     FILE *fpIn = fopen( inFirmware, "rb" );
  41.     if ( fpIn == NULL ) {
  42.         printf( "Unable to open %s\n", inFirmware );
  43.         return NONE;
  44.     }
  45.    
  46.     // Offset de départ, c'est ce que l'on cherche à trouver
  47.     signed char key = (char)offset;
  48.        
  49.     // Lit jusqu'à la fin du fichier, octet par octet
  50.     char c; int i=0; int limit = sizeof( signature );
  51.     size_t sizeOfChar = (size_t)sizeof( char );
  52.     while ( fread( &c, sizeOfChar, sizeOfChar, fpIn) != 0 ) {
  53.         c = c ^ key; // xor
  54.        
  55.         if ( c == signature[i] )
  56.             i++;
  57.         else
  58.             i = 0;
  59.        
  60.         // Si on a trouvé la signature
  61.         if ( i == limit ) {
  62.             fclose( fpIn );
  63.             return 1;
  64.         }
  65.        
  66.         /* Incremente la clé */
  67.         if ( (key >= -128) && (key < 127) )
  68.             key++;         
  69.         else
  70.             key = -128;
  71.     }
  72.        
  73.     fclose( fpIn );
  74.     return NONE;    // valeur arbitraire
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement