diff --git a/crc.c b/crc.c index 9f49530..8d158e9 100644 --- a/crc.c +++ b/crc.c @@ -5,12 +5,12 @@ #include #include "CRCLib.h" -const int png_signature[8] = { 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a }; -const int idat_signature = 1229209940; -const int iend_signature = 1229278788; +const long png_signature[8] = { 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a }; +const long idat_signature = 1229209940; +const long iend_signature = 1229278788; const int working = 1; -int check_file_header(int *addr) { +int check_file_header(char *addr) { int signature_match = 0; for( int i = 0; i < 8; i++ ) { if (addr[i] != png_signature[i]) { @@ -23,7 +23,7 @@ int check_file_header(int *addr) { } -int check_header_length(int *addr, int offset) { +int check_header_length(unsigned char *addr, long offset) { unsigned int res = 0; for( int i = 0; i < 4; i++ ) { res |= addr[offset+i]; @@ -34,9 +34,9 @@ int check_header_length(int *addr, int offset) { return res; } -int first_idat(int *addr) { +unsigned long first_idat(char *addr) { int idat_found = 0; - int offset = 8; + unsigned long offset = 8; int jump_offset = 0; int header_type = 0; while(idat_found == 0) { @@ -51,10 +51,10 @@ int first_idat(int *addr) { return offset; } -int total_idat(int *addr) { +int total_idat(char *addr) { int iend_found = 0; int found_idat = 0; - int offset = 8; + unsigned long offset = 8; int jump_offset = 0; int header_type = 0; while(iend_found == 0) { @@ -72,8 +72,8 @@ int total_idat(int *addr) { return found_idat; } -int change_idat_content(int *addr, char *message, int accuracy, int offset) { - printf("Starting IDAT Tranform"); +int change_idat_content(unsigned char *addr, char *message, int accuracy, unsigned long offset) { + printf("Starting IDAT Tranform\n"); if(accuracy > 4) { printf("Warning, accuracy cannot be larger than 4"); return EXIT_FAILURE; @@ -86,36 +86,47 @@ int change_idat_content(int *addr, char *message, int accuracy, int offset) { return EXIT_FAILURE; } - // Comment - int i = total_idat(addr); - printf("Total IDAT %d\n", i); - int idat_length = check_header_length(addr, offset); + printf("IDAT: %d\n", idat_length); + int prop_found = 0; - int size = 1; - int* idat_data = malloc(size * sizeof(int)); + long size = 1; + long rounds = 0; + unsigned int* idat_data = malloc(size * sizeof(unsigned int)); + for(int i = 0; i < idat_length; i++) { + idat_data[i] = addr[i+offset+8]; + size++; + int* new_idat_data = realloc(idat_data, size * sizeof(unsigned int)); + } + unsigned int temp_idat_data[size]; while(prop_found == 0) { - for(i = 0; i < idat_length; i++) { - idat_data[i] = addr[i+offset+8]; - size++; - int* new_idat_data = realloc(idat_data, size * sizeof(int)); + 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); - idat_data[j] = (idat_data[j] + r) % 255; + temp_idat_data[j] = (temp_idat_data[j] + r) % 255; unsigned char crc_check[size+4]; - int idat_header[] = { 0x49, 0x44, 0x41, 0x54 }; - for(i = 0; i < 4; i++) { + unsigned int idat_header[] = { 0x49, 0x44, 0x41, 0x54 }; + for(int i = 0; i < 4; i++) { crc_check[i] = idat_header[i]; } - for(i = 0; i < size; i++) { - crc_check[i] = idat_data[i+4]; + for(int i = 0; i < size; i++) { + crc_check[i] = temp_idat_data[i+4]; + } + unsigned int crcnum = crc(crc_check, idat_length); + //printf("New CRC: %08X\n", crcnum); + //printf("Test: %X\n", crcnum >> (8*3)); + unsigned int checked_crc = crcnum >> (8*3); + rounds++; + if(checked_crc == 61) { + 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]); + prop_found = 1; } - int crcnum = crc(crc_check, idat_length); - printf("New CRC: %08X\n", crcnum); - printf("Test: %X\n", crcnum >> (8*3)); - prop_found = 1; } return 0; @@ -123,10 +134,12 @@ int change_idat_content(int *addr, char *message, int accuracy, int offset) { int main() { FILE *fp; - int c; - int myArray[255] = {}; - int i = 0; - int offset = 0; + unsigned int c; + //unsigned char myArray[838860]; + unsigned char * myArray = NULL; + myArray = calloc(880388560, sizeof(char)); + unsigned long i = 0; + unsigned long offset = 0; char message[1]; if(sodium_init() == -1) { return EXIT_FAILURE;