#include #include #include #include #include #include #include // TODO: allow for non-native-bitness ELF parsing #include "manip-exe.h" int main(int argc, char* argv[]) { if (argc < 4) { fprintf(stderr,"usage: %s \n", argv[0]); return 0; } const char* symname = argv[3]; FILE* f = fopen(argv[1], "rb"); if (f == NULL) { fprintf(stderr, "%s: can't open input file '%s'\n", argv[0], argv[1]); return 1; } fseek(f, 0, SEEK_END); long s = ftell(f); fseek(f, 0, SEEK_SET); fprintf(stderr, "s=%zu\n", s); void* blob = calloc(1, (size_t)s); if (fread(blob, 1, (size_t)s, f) != (size_t)s) { fprintf(stderr, "%s: can't read input file '%s'\n", argv[0], argv[1]); free(blob); fclose(f); return 1; } fclose(f); if (manip_elf(blob, symname)) { fprintf(stderr, "%s: ELF patching failed\n", argv[0]); free(blob); return 1; } f = fopen(argv[2], "wb"); if (f == NULL) { fprintf(stderr, "%s: can't open output file '%s'\n", argv[0], argv[2]); return 1; } if (fwrite(blob, 1, (size_t)s, f) != (size_t)s) { fprintf(stderr, "%s: can't write output file '%s'\n", argv[0], argv[2]); free(blob); fclose(f); return 1; } fclose(f); free(blob); return 0; }