diff options
Diffstat (limited to 'src/export/extract_version_2.c')
-rw-r--r-- | src/export/extract_version_2.c | 65 |
1 files changed, 32 insertions, 33 deletions
diff --git a/src/export/extract_version_2.c b/src/export/extract_version_2.c index 6686dca..c4914a7 100644 --- a/src/export/extract_version_2.c +++ b/src/export/extract_version_2.c | |||
@@ -28,10 +28,9 @@ static uint8_t mantra_in[] = { 0x68, 0x35, 0x2d, 0x6c }; | |||
28 | 28 | ||
29 | int main( int args, char **argv ) | 29 | int main( int args, char **argv ) |
30 | { | 30 | { |
31 | int filenum = 0, run = 1; | 31 | int filenum = 0, run = 1, first_run = 1; |
32 | size_t offset = 0, reported = 0, enc_len = 32; | 32 | size_t offset = 0, old_offset = 0, reported = 0, enc_len = 32; |
33 | ssize_t oldoffset = -1; | 33 | uint8_t mantra[4], id0, id5, *mapped_file; |
34 | uint8_t mantra[4], id0, id5, *mappedfile; | ||
35 | MAP map; | 34 | MAP map; |
36 | 35 | ||
37 | /* For streets we do have a enc_len of 34 */ | 36 | /* For streets we do have a enc_len of 34 */ |
@@ -39,11 +38,11 @@ int main( int args, char **argv ) | |||
39 | switch( getopt( args, argv, ":e:" ) ) { | 38 | switch( getopt( args, argv, ":e:" ) ) { |
40 | case -1 : run = 0; break; | 39 | case -1 : run = 0; break; |
41 | case 'e': | 40 | case 'e': |
42 | enc_len = atol( optarg ); | 41 | enc_len = strtoul( optarg, 0, 0 ); |
43 | break; | 42 | break; |
44 | default: | 43 | default: |
45 | fputs( "Syntax: %s [-e encrypted_length (default: 32, for streets 34 or 0)] path-to-teiln.dat", stderr ); exit( 1 ); | 44 | fputs( "Syntax: %s [-e encrypted_length (default: 32, for streets 34 or 0)] path-to-teiln.dat", stderr ); |
46 | break; | 45 | exit( 1 ); |
47 | } | 46 | } |
48 | } | 47 | } |
49 | run = 1; | 48 | run = 1; |
@@ -52,25 +51,25 @@ int main( int args, char **argv ) | |||
52 | { fputs( "Missing filename.", stderr ); exit( 1 ); } | 51 | { fputs( "Missing filename.", stderr ); exit( 1 ); } |
53 | 52 | ||
54 | map = map_file( argv[optind], 1 ); | 53 | map = map_file( argv[optind], 1 ); |
55 | mappedfile = map->addr; | 54 | mapped_file = map->addr; |
56 | 55 | ||
57 | mantra[0] = mantra_in[0] ^ mappedfile[4]; | 56 | mantra[0] = mantra_in[0] ^ mapped_file[4]; |
58 | mantra[1] = mantra_in[1] ^ mappedfile[5]; | 57 | mantra[1] = mantra_in[1] ^ mapped_file[5]; |
59 | mantra[2] = mantra_in[2] ^ mappedfile[2]; | 58 | mantra[2] = mantra_in[2] ^ mapped_file[2]; |
60 | mantra[3] = mantra_in[3] ^ mappedfile[3]; | 59 | mantra[3] = mantra_in[3] ^ mapped_file[3]; |
61 | 60 | ||
62 | id0 = mappedfile[0]; | 61 | id0 = mapped_file[0]; |
63 | id5 = mappedfile[5]; | 62 | id5 = mapped_file[5]; |
64 | 63 | ||
65 | while( run ) | 64 | while( run ) |
66 | { | 65 | { |
67 | while( ( offset < map->size ) && ( | 66 | while( ( offset < map->size ) && ( |
68 | ( mappedfile[ offset + 0 ] != id0 ) || | 67 | ( mapped_file[ offset + 0 ] != id0 ) || |
69 | ( mappedfile[ offset + 2 ] != ( '-' ^ mantra[2] )) || | 68 | ( mapped_file[ offset + 2 ] != ( '-' ^ mantra[2] )) || |
70 | ( mappedfile[ offset + 3 ] != ( 'l' ^ mantra[3] )) || | 69 | ( mapped_file[ offset + 3 ] != ( 'l' ^ mantra[3] )) || |
71 | ( mappedfile[ offset + 4 ] != ( 'h' ^ mantra[0] )) || | 70 | ( mapped_file[ offset + 4 ] != ( 'h' ^ mantra[0] )) || |
72 | ( mappedfile[ offset + 5 ] != id5 ) || | 71 | ( mapped_file[ offset + 5 ] != id5 ) || |
73 | ( mappedfile[ offset + 6 ] != ( '-' ^ mantra[2] )) | 72 | ( mapped_file[ offset + 6 ] != ( '-' ^ mantra[2] )) |
74 | ) ) offset++; | 73 | ) ) offset++; |
75 | 74 | ||
76 | // printf( "Found an appropriate offset at: %zd\n", offset ); | 75 | // printf( "Found an appropriate offset at: %zd\n", offset ); |
@@ -85,11 +84,12 @@ int main( int args, char **argv ) | |||
85 | if( offset == map->size ) | 84 | if( offset == map->size ) |
86 | run = 0; | 85 | run = 0; |
87 | 86 | ||
88 | if( oldoffset != -1 ) | 87 | if( !first_run ) |
89 | { | 88 | { |
90 | uint8_t *mf = mappedfile + oldoffset, df[128]; | 89 | uint8_t *mf = mapped_file + old_offset, df[128]; |
91 | size_t filename_len, header_len, i; | 90 | size_t filename_len, header_len, i; |
92 | char filename_template[32], filename[32]; | 91 | int fh; |
92 | char filename[32]; | ||
93 | 93 | ||
94 | /* De-"crypt" obfuscation to our header copy */ | 94 | /* De-"crypt" obfuscation to our header copy */ |
95 | for( i=0; i<enc_len; ++i) | 95 | for( i=0; i<enc_len; ++i) |
@@ -104,26 +104,25 @@ int main( int args, char **argv ) | |||
104 | df[i] = mf[i]; | 104 | df[i] = mf[i]; |
105 | 105 | ||
106 | /* Make up new sequental file name */ | 106 | /* Make up new sequental file name */ |
107 | snprintf( filename_template, sizeof(filename_template), "%%0%dd.lha", (int)filename_len ); | 107 | snprintf( filename, sizeof(filename), "%0*d.lha", (int)filename_len, filenum++ ); |
108 | snprintf( filename, sizeof( filename ), filename_template, filenum++ ); | ||
109 | memcpy( ((uint8_t*)df) + 22, filename, filename_len); | 108 | memcpy( ((uint8_t*)df) + 22, filename, filename_len); |
110 | 109 | ||
111 | /* Recalculate checksum with new file name */ | 110 | /* Recalculate checksum with new file name */ |
112 | df[1] = 0; for( i=2; i<header_len; ++i) df[1] += df[i]; | 111 | df[1] = 0; for( i=2; i<header_len; ++i) df[1] += df[i]; |
113 | 112 | ||
114 | /* Open file and dump our de-"crypted" header and then rest of file */ | 113 | /* Open file and dump our de-"crypted" header and then rest of file */ |
115 | i = open( filename, O_CREAT | O_TRUNC | O_WRONLY, 0644 ); | 114 | fh = open( filename, O_CREAT | O_TRUNC | O_WRONLY, 0644 ); |
116 | if( enc_len > header_len ) { | 115 | if( enc_len > header_len ) { |
117 | write( i, df, enc_len ); | 116 | write( fh, df, enc_len ); |
118 | write( i, mf + enc_len, offset - oldoffset - enc_len ); | 117 | write( fh, mf + enc_len, offset - old_offset - enc_len ); |
119 | } else { | 118 | } else { |
120 | write( i, df, header_len ); | 119 | write( fh, df, header_len ); |
121 | write( i, mf + header_len, offset - oldoffset - header_len ); | 120 | write( fh, mf + header_len, offset - old_offset - header_len ); |
122 | } | 121 | } |
123 | close( i ); | 122 | close( fh ); |
124 | } | 123 | } |
125 | oldoffset = offset; | 124 | first_run = 0; |
126 | offset++; | 125 | old_offset = offset++; |
127 | } | 126 | } |
128 | 127 | ||
129 | unmap_file( &map ); | 128 | unmap_file( &map ); |