From 98e1607604f435c086c57684ba89b86aa4ddb4c6 Mon Sep 17 00:00:00 2001 From: Pin Date: Mon, 11 Oct 2021 22:10:11 -0400 Subject: [PATCH] wip --- crc.c | 95 +++++++++++++++++++----------------------------------- crc_util.c | 2 +- crc_util.h | 1 + 3 files changed, 35 insertions(+), 63 deletions(-) diff --git a/crc.c b/crc.c index 8ee9803..50f3b8b 100644 --- a/crc.c +++ b/crc.c @@ -14,18 +14,16 @@ const long idat_signature = 1229209940; const long iend_signature = 1229278788; -FILE *zlib_decompress_data(unsigned char *data_chunk, size_t file_length, char *buff) { +void zlib_decompress_data(unsigned char *data_chunk, size_t file_length, unsigned char **buff, size_t *sz) { int ret; unsigned int have; z_stream strm; unsigned char out[CHUNK]; unsigned char in[CHUNK]; - size_t sz; errno=0; FILE *data_stream = fmemopen(data_chunk, file_length, "r"); - FILE *of = NULL; - of = open_memstream(&buff, &sz); + FILE *of = open_memstream((char**)buff, sz); if(data_stream == NULL) { perror("F MEM OPEN"); } @@ -37,14 +35,14 @@ FILE *zlib_decompress_data(unsigned char *data_chunk, size_t file_length, char * strm.next_in = Z_NULL; ret = inflateInit(&strm); if(ret != Z_OK) { - return NULL; + return; } do { strm.avail_in = fread(in, 1, CHUNK, data_stream); if(ferror(data_stream)) { (void)inflateEnd(&strm); - return NULL; + return; } if(strm.avail_in == 0) { break; @@ -64,7 +62,7 @@ FILE *zlib_decompress_data(unsigned char *data_chunk, size_t file_length, char * (void)inflateEnd(&strm); printf("Error: %d\n", ret); printf("MSG: %s\n", (char*)strm.msg); - return NULL; + return; } have = CHUNK - strm.avail_out; fwrite(out, 1, have, of); @@ -74,11 +72,10 @@ FILE *zlib_decompress_data(unsigned char *data_chunk, size_t file_length, char * (void)inflateEnd(&strm); fclose(data_stream); - - return of; + fclose(of); } -FILE *zlib_compress_data(unsigned char *data_chunk, size_t file_length, char *buff) { +void zlib_compress_data(unsigned char *data_chunk, size_t file_length, unsigned char **buff, size_t *sz) { int ret, flush; unsigned int have; z_stream strm; @@ -90,25 +87,24 @@ FILE *zlib_compress_data(unsigned char *data_chunk, size_t file_length, char *bu int memLevel = 9; //int strategy = Z_DEFAULT_STRATEGY; int strategy = Z_FILTERED; - size_t sz; FILE *data_stream = fmemopen(data_chunk, file_length, "r"); FILE *out_data_stream = NULL; - out_data_stream = open_memstream(&buff, &sz); + out_data_stream = open_memstream((char**)buff, sz); strm.zalloc = Z_NULL; strm.zfree = Z_NULL; strm.opaque = Z_NULL; ret = deflateInit2(&strm, level, method, windowBits, memLevel, strategy); if (ret != Z_OK) { - return NULL; + return; } do { strm.avail_in = fread(in, 1, CHUNK, data_stream); if (ferror(data_stream)) { (void)deflateEnd(&strm); - return NULL; + return; } flush = feof(data_stream) ? Z_FINISH : Z_NO_FLUSH; strm.next_in = in; @@ -122,7 +118,7 @@ FILE *zlib_compress_data(unsigned char *data_chunk, size_t file_length, char *bu have = CHUNK - strm.avail_out; if(fwrite(out, 1, have, out_data_stream) != have || ferror(out_data_stream)) { (void)deflateEnd(&strm); - return NULL; + return; } } while(strm.avail_out == 0); assert(strm.avail_in == 0); @@ -131,9 +127,9 @@ FILE *zlib_compress_data(unsigned char *data_chunk, size_t file_length, char *bu assert(ret == Z_STREAM_END); fclose(data_stream); + fclose(out_data_stream); (void)deflateEnd(&strm); - return out_data_stream; } unsigned long first_idat(unsigned char *addr) { @@ -205,14 +201,9 @@ void random_data_change(unsigned char *color_data, int width, int length) { } else { temp_color_data[random_num]++; } - char *check_data_buff = NULL; - FILE *check_data = zlib_compress_data(temp_color_data, length, check_data_buff); + unsigned char *check_data_buff = NULL; size_t check_data_length = 0; - - unsigned char *check_data_array = file_to_char_array(check_data, &check_data_length); - - fclose(check_data); - free(check_data_buff); + zlib_compress_data(temp_color_data, length, &check_data_buff, &check_data_length); unsigned char full_data[check_data_length+4]; full_data[0] = 0x49; @@ -220,15 +211,14 @@ void random_data_change(unsigned char *color_data, int width, int length) { full_data[2] = 0x41; full_data[3] = 0x54; for(int i = 0; i < check_data_length; i++) { - full_data[i+4] = check_data_array[i]; + full_data[i+4] = check_data_buff[i]; } unsigned int temp_crc = crc(full_data, check_data_length); if ((temp_crc >> (8*3)) == 10 ) { printf("Found in %zu rounds!\n", rounds); searching = 0; } - free(check_data_array); - + free(check_data_buff); } } while(searching == 1); @@ -269,47 +259,26 @@ int change_idat_content(unsigned char *addr, char *message, int accuracy, unsign for(int i = 0; i <= idat_length; i++) { temp_idat_data[i] = idat_data[i]; } - //int r = randombytes_uniform(5) + 1; - //int j = randombytes_uniform(idat_length); - - //temp_idat_data[j] = (temp_idat_data[j] + r) % 255; - //unsigned char crc_check[size+4]; - //unsigned int idat_header[] = { 0x49, 0x44, 0x41, 0x54 }; - //for(int i = 0; i < 4; i++) { - // crc_check[i] = idat_header[i]; - //} - //for(int i = 0; i < idat_byte_length; i++) { - // crc_check[i] = temp_idat_data[i+4]; - //} - //unsigned int crcnum = crc(crc_check, idat_length); - //unsigned int checked_crc = crcnum >> (8*3); - //rounds++; - //if(checked_crc == 61) { - // Setting TEMP IDAT DATA BACK TO ORIGINAL - // TO STOP DECOMPRESSION CORRUPTION - //temp_idat_data[j] = addr[offset+8+j]; - // Decompressing Data - char *uncom_data_buff = NULL; - FILE *uncom_data = zlib_decompress_data(temp_idat_data, idat_byte_length, uncom_data_buff); - size_t uncom_data_size = 0; + // Decompressing Data + unsigned char *uncom_data_buff = NULL; + size_t uncom_data_size = 0; + zlib_decompress_data(temp_idat_data, idat_byte_length, &uncom_data_buff, &uncom_data_size); - unsigned char *uncom_data_array = file_to_char_array(uncom_data, &uncom_data_size); + random_data_change(uncom_data_buff, 16, uncom_data_size); - random_data_change(uncom_data_array, 16, uncom_data_size); + free(uncom_data_buff); - fclose(uncom_data); - free(uncom_data_buff); - - //printf("Found %d in %d rounds\n", checked_crc ,rounds); - //printf("Full CRC: %08X\n", crcnum); - //printf("Original: %02X\n", idat_data[j]); - //printf("Change offset: %d to hex: %02X\n", j, temp_idat_data[j]); - //addr[offset+8+j] = temp_idat_data[j]; - //update_file_crc(addr, offset, crcnum); - prop_found = 1; - //} + //printf("Found %d in %d rounds\n", checked_crc ,rounds); + //printf("Full CRC: %08X\n", crcnum); + //printf("Original: %02X\n", idat_data[j]); + //printf("Change offset: %d to hex: %02X\n", j, temp_idat_data[j]); + //addr[offset+8+j] = temp_idat_data[j]; + //update_file_crc(addr, offset, crcnum); + prop_found = 1; } + free(idat_data); + return 0; } @@ -330,5 +299,7 @@ int main() { offset = first_idat(file_data); change_idat_content(file_data, message, 1, offset); + free(file_data); + free(message); //create_cc_file(file_data, i); } diff --git a/crc_util.c b/crc_util.c index 91fc57a..037578c 100644 --- a/crc_util.c +++ b/crc_util.c @@ -4,7 +4,6 @@ const long png_signature[8] = { 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a }; - int check_header_length(unsigned char *addr, long offset) { unsigned int res = 0; for( int i = 0; i < 4; i++ ) { @@ -61,3 +60,4 @@ unsigned char* file_to_char_array(FILE *in_file, size_t* size) { } return file_data; } + diff --git a/crc_util.h b/crc_util.h index 03f2ae9..7afe70a 100644 --- a/crc_util.h +++ b/crc_util.h @@ -1,3 +1,4 @@ +#include extern const long png_signature[8];