1#include <stdio.h> 2#include <sys/types.h> 3#include <sys/stat.h> 4#include <unistd.h> 5#include <string.h> 6#include <stdlib.h> 7 8int main(int argc, char **argv){ 9 unsigned char *buffer = malloc(64 * 1024); 10 struct stat s; 11 unsigned int size_vmlinux = 0, real_size_vmlinux = 0; 12 const unsigned char *magic_str = "ACME_PART_MAGIC"; 13 unsigned int loop; 14 unsigned char *magic; 15 16 if(argc != 3){ 17 printf("%s in out\n", argv[0]); 18 return 1; 19 } 20 21 printf("Generating image\n"); 22 23 FILE *vmlinux = fopen(argv[1], "r"); 24 FILE *vmlinux_out = fopen(argv[2], "w"); 25 if((!vmlinux) || (!vmlinux_out)){ 26 printf("Error opening a file\n"); 27 return 1; 28 } 29 30 stat(argv[1], &s); 31 size_vmlinux = s.st_size; 32 real_size_vmlinux = (size_vmlinux & 0xffff0000) + 0x10000; 33 34 printf("vmlinux = 0x%.08X / 0x%.08X\n", size_vmlinux, real_size_vmlinux); 35 36 unsigned int t = fread(buffer, 1, 64 * 1024, vmlinux); 37 for(loop = 0; loop < (64 * 1024) - sizeof(magic_str); loop++){ 38 if(buffer[loop] == magic_str[0]){ 39 if((magic = strstr(&buffer[loop], magic_str))){ 40 printf("Magic at 0x%.08X %p %p\n", magic - buffer, magic, buffer); 41 printf("Found Magic %X%X%X%X\n", 42 buffer[loop + strlen(magic_str)], 43 buffer[loop + strlen(magic_str) + 2], 44 buffer[loop + strlen(magic_str) + 1], 45 buffer[loop + strlen(magic_str) + 3]); 46 47 buffer[loop + strlen(magic_str)] = real_size_vmlinux >> 24; 48 buffer[loop + strlen(magic_str) + 2] = (real_size_vmlinux >> 16) & 0xff; 49 buffer[loop + strlen(magic_str) + 1] = (real_size_vmlinux >> 8) & 0xff; 50 buffer[loop + strlen(magic_str) + 3] = (real_size_vmlinux) & 0xff; 51 52 printf("Replaced with %.02X%.02X%.02X%.02X\n", 53 buffer[loop + strlen(magic_str)], 54 buffer[loop + strlen(magic_str) + 2], 55 buffer[loop + strlen(magic_str) + 1], 56 buffer[loop + strlen(magic_str) + 3]); 57 58 } 59 } 60 } 61 62 fwrite(buffer, 1, 64 * 1024, vmlinux_out); 63 real_size_vmlinux -= 64 * 1024; 64 do { 65 real_size_vmlinux -= 64 * 1024; 66 memset(buffer, 0, 64 * 1024); 67 fread(buffer, 1, 64 * 1024, vmlinux); 68 fwrite(buffer, 1, 64 * 1024, vmlinux_out); 69 } while (real_size_vmlinux); 70 71 return 0; 72} 73