diff --git a/.gitignore b/.gitignore index 961fffd..25b3266 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ *.out *.woo *.wow +*.gch bin/ diff --git a/cmd/crc.c b/cmd/crc.c index dab6025..4c40bc4 100644 --- a/cmd/crc.c +++ b/cmd/crc.c @@ -123,7 +123,6 @@ int change_idat_content(unsigned char *addr, unsigned char *message, int accurac int prop_found = 0; long size = 1; - long rounds = 0; size_t idat_byte_length = 0; unsigned char* idat_data = calloc(size, sizeof(unsigned char)); for(size_t i = 0; i <= idat_length; i++) { @@ -167,6 +166,8 @@ int main() { FILE *fp; size_t i = 0; unsigned long offset = 0; + struct PNG_START_FILE_STRUCT png_start_file_data; + struct PNG_IDAT_FILE_STRUCT png_idat_file_data; unsigned char *message = malloc(sizeof(char)); message[0] = '\0'; @@ -184,7 +185,13 @@ int main() { unsigned char *file_data = file_to_char_array(fp, &i); fclose(fp); + populate_start_png(file_data, &png_start_file_data); + offset = first_idat(file_data); + printf("Off: %ld\n", offset); + + populate_idat_png(file_data, &png_idat_file_data, offset); + change_idat_content(file_data, message, 1, offset); free(file_data); free(message); diff --git a/include/crc_util.h b/include/crc_util.h index 3dfe9c2..f83a534 100644 --- a/include/crc_util.h +++ b/include/crc_util.h @@ -1,15 +1,29 @@ #include // PNG File Struct -struct PNG_FILE_STRUCT { +struct PNG_START_FILE_STRUCT { unsigned char file_sig[8]; - int file_width; - int file_height; - int bit_depth; - int color_type; - int compression_method; - int filter_method; - int interlace_method; + unsigned char ihdr_length[4]; + unsigned char ihdr_header[4]; + unsigned char file_width[4]; + unsigned char file_height[4]; + unsigned char bit_depth[1]; + unsigned char color_type[1]; + unsigned char compression_method[1]; + unsigned char filter_method[1]; + unsigned char interlace_method[1]; + unsigned char ihdr_crc[4]; +}; + +struct PNG_IDAT_FILE_STRUCT { + unsigned char idat_length[4]; + unsigned char idat_header[4]; + unsigned char idat_crc[4]; + unsigned char idat_data[]; +}; + +struct PNG_FILE_STRUCT { + struct PNG_START_FILE_STRUCT png_start_data; }; extern const long png_signature[8]; @@ -18,3 +32,5 @@ int check_header_length(unsigned char *addr, long offset); int check_file_header(char *addr); int create_cc_file(unsigned char *addr, unsigned long file_length); unsigned char* file_to_char_array(FILE *in_file, size_t* size); +void populate_start_png(unsigned char *addr, struct PNG_START_FILE_STRUCT *png_data); +void populate_idat_png(unsigned char *addr, struct PNG_IDAT_FILE_STRUCT *png_data, unsigned long offset); diff --git a/src/crc_util.c b/src/crc_util.c index 5df74ca..271cbed 100644 --- a/src/crc_util.c +++ b/src/crc_util.c @@ -27,6 +27,77 @@ int check_file_header(char *addr) { } +void populate_idat_png(unsigned char *addr, struct PNG_IDAT_FILE_STRUCT *png_data, unsigned long offset) { + unsigned long cur_idat_length = 0; + for(int i = 0; i < 4; i++){ + png_data->idat_length[i] = addr[i+offset]; + } + + for(int i = 0; i < 4; i++){ + cur_idat_length += (png_data->idat_length[i] << (24-(8*i))); + } + + printf("\n%ld\n", cur_idat_length); +} + +void populate_start_png(unsigned char *addr, struct PNG_START_FILE_STRUCT *png_data) { + for(int i = 0; i < 8; i++) { + png_data->file_sig[i] = addr[i]; + printf("%02X ", png_data->file_sig[i]); + } + printf("\n"); + for(int i = 0; i < 4; i++) { + png_data->ihdr_length[i] = addr[i+8]; + printf("%02X ", png_data->ihdr_length[i]); + } + printf("\n"); + for(int i = 0; i < 4; i++) { + png_data->ihdr_header[i] = addr[i+12]; + printf("%02X ", png_data->ihdr_header[i]); + } + printf("\n"); + for(int i = 0; i < 4; i++) { + png_data->file_width[i] = addr[i+16]; + printf("%02X ", png_data->file_width[i]); + } + printf("\n"); + for(int i = 0; i < 4; i++) { + png_data->file_height[i] = addr[i+20]; + printf("%02X ", png_data->file_height[i]); + } + printf("\n"); + for(int i = 0; i < 1; i++) { + png_data->bit_depth[i] = addr[i+24]; + printf("%02X ", png_data->bit_depth[i]); + } + printf("\n"); + for(int i = 0; i < 1; i++) { + png_data->color_type[i] = addr[i+25]; + printf("%02X ", png_data->color_type[i]); + } + printf("\n"); + for(int i = 0; i < 1; i++) { + png_data->compression_method[i] = addr[i+26]; + printf("%02X ", png_data->compression_method[i]); + } + printf("\n"); + for(int i = 0; i < 1; i++) { + png_data->filter_method[i] = addr[i+27]; + printf("%02X ", png_data->filter_method[i]); + } + printf("\n"); + for(int i = 0; i < 1; i++) { + png_data->interlace_method[i] = addr[i+28]; + printf("%02X ", png_data->interlace_method[i]); + } + printf("\n"); + for(int i = 0; i < 4; i++) { + png_data->ihdr_crc[i] = addr[i+29]; + printf("%02X ", png_data->ihdr_crc[i]); + } + printf("\n"); +} + int create_cc_file(unsigned char *addr, unsigned long file_length) { FILE *fp; fp = fopen("png2.png", "w");