/* * injector * e.g.: ./injector kp-9000-6hx-x.bin RTLPlayground/rwintercept.hex kp-9000-6hx-x_patched.bin */ #include #include #define OFFSET 2 // Use a 4MB buffer, the same as the flash rom size #define BUFFER_SIZE 0x400000 unsigned char buffer[BUFFER_SIZE]; FILE *inptr, *outptr, *patchptr; int main(int argc, char **argv) { char * line = NULL; size_t len = 0; unsigned int addr, value; if (argc != 4) { printf("I only work with 3 arguments\n"); return 5; } inptr = fopen(argv[1], "rb"); if (inptr == NULL) { printf("Cannot open %s\n", argv[1]); return 5; } fseek(inptr, 0L, SEEK_END); size_t filesize = ftell(inptr); rewind(inptr); printf("Input file size: %ld\n", filesize); if (filesize > BUFFER_SIZE) { printf("File too large.\n"); return 5; } size_t bytes_read = fread(buffer, 1, sizeof(buffer), inptr); printf("Bytes read:: %ld\n", bytes_read); if (bytes_read != filesize) { printf("Error reading input file.\n"); return 5; } fclose(inptr); patchptr = fopen(argv[2], "r"); if (patchptr == NULL) { printf("Cannot open %s\n", argv[1]); return 5; } size_t l; int patches = 0; while ((l = getline(&line, &len, patchptr)) != -1) { // printf("Retrieved line of length %zu:\n", l); sscanf(line, "%x: %x", &addr, &value); if (addr < 0x4000) addr += OFFSET; if (addr < filesize) { patches++; buffer[addr] = value; // printf("%s gives %x <- %x\n", line,addr, value); } else { printf("Cannot patch: %s\n", line); } } printf("Patched %d bytes.\n", patches); fclose(patchptr); if (line) free(line); outptr = fopen(argv[3], "wb"); if (outptr == NULL) { printf("Cannot open %s\n", argv[1]); return 5; } size_t written = fwrite(buffer, 1, filesize, outptr); if (written != filesize) { printf("Error writing output file.\n"); return 5; } fclose(outptr); return 0; }