#include #include "mystdlib.h" #include #include #include #include int main( int args, char **argv ) { int filenum = 0; size_t offset = 0, oldoffset = -1; uint8_t *mappedfile; MAP map; uint8_t mantra0 = 0x1b, mantra1 = 0x35, mantra2 = 0x2d, mantra3 = 0x6c; /* clean*/ // unsigned char mantra0 = 0x08, mantra1 = 0x57, mantra2 = 0x64, mantra3 = 0x69; /* 98 H */ // unsigned char mantra0 = 0x13, mantra1 = 0xe4, mantra2 = 0x55, mantra3 = 0x05; /* 99 F */ // unsigned char mantra0 = 0x12, mantra1 = 0x08, mantra2 = 0x23, mantra3 = 0x01; /* 99 H */ if( args != 2 ) { fputs( "Missing filenames.", stderr ); exit( 1 ); } map = map_file( argv[1], 1 ); mappedfile = map->addr; mantra0 ^= mappedfile[0]; mantra1 ^= mappedfile[5]; mantra2 ^= mappedfile[2]; mantra3 ^= mappedfile[3]; while( 1 ) { while( ( offset < map->size ) && ( ( mappedfile[ offset + 0 ] != ( 0x1b^ mantra0 )) || ( mappedfile[ offset + 2 ] != ( '-' ^ mantra2 )) || ( mappedfile[ offset + 3 ] != ( 'l' ^ mantra3 )) || ( mappedfile[ offset + 4 ] != ( 'h' ^ mantra0 )) || ( mappedfile[ offset + 5 ] != ( '5' ^ mantra1 )) || ( mappedfile[ offset + 6 ] != ( '-' ^ mantra2 )) ) ) offset++; printf( "Found an appropriate offset at: %zd\n", oldoffset ); if( offset == map->size ) { unmap_file( &map ); exit(0); } if( oldoffset != -1 ) { uint8_t cs = 0, *mf = mappedfile + oldoffset, df[32]; char filename[20]; int i; for( i=0; i<8; ++i) { df[4*i+0] = mf[4*i+0] ^ mantra0; df[4*i+1] = mf[4*i+1] ^ mantra1; df[4*i+2] = mf[4*i+2] ^ mantra2; df[4*i+3] = mf[4*i+3] ^ mantra3; } snprintf( filename, sizeof( filename ), "%05d.lha", filenum++ ); memcpy( ((uint8_t*)df) + 22, filename, 5); for( i=2; i<29; ++i) cs += ((uint8_t*)df)[i]; ((uint8_t*)df)[1] = cs; i = open( filename, O_CREAT | O_TRUNC | O_WRONLY, 0644 ); write( i, df, 32 ); write( i, mf + 32, offset - oldoffset - 32 ); close( i ); } oldoffset = offset; offset++; } return 0; }