From 4f0405def62e8cd6a190731de3f854c3ac326286 Mon Sep 17 00:00:00 2001 From: comex Date: Sat, 4 Jun 2011 18:17:21 -0400 Subject: [PATCH] update and add nm --- Makefile | 4 ++-- apply_patchfile.c | 7 +++---- check_sanity.c | 9 ++++----- dump_range.c | 7 +++---- make_kernel_patchfile.c | 10 +++++----- nm.c | 39 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 56 insertions(+), 20 deletions(-) create mode 100644 nm.c diff --git a/Makefile b/Makefile index 84f5926..27a6f52 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ DATA = $(word 1,$(wildcard ./data ../data)) CFLAGS += -I$(DATA) include $(DATA)/Makefile.common -BINS := $(OUTDIR)/check_sanity $(OUTDIR)/make_kernel_patchfile $(OUTDIR)/apply_patchfile $(OUTDIR)/dump_range sandboxc.c +BINS := $(OUTDIR)/check_sanity $(OUTDIR)/make_kernel_patchfile $(OUTDIR)/apply_patchfile $(OUTDIR)/dump_range $(OUTDIR)/nm sandboxc.c all: .data $(OUTDIR) $(BINS) @@ -22,7 +22,7 @@ $(OUTDIR)/make_kernel_patchfile: $(OUTDIR)/make_kernel_patchfile.o $(OUTDIR)/san $(GCC) -o $@ $^ $(OUTDIR)/dump_range: $(OUTDIR)/dump_range.o $(DATA)/$(OUTDIR)/libdata.a $(GCC) -o $@ $^ -$(OUTDIR)/fakesym: $(OUTDIR)/fakesym.o $(DATA)/$(OUTDIR)/libdata.a +$(OUTDIR)/nm: $(OUTDIR)/nm.o $(DATA)/$(OUTDIR)/libdata.a $(GCC) -o $@ $^ clean: .clean diff --git a/apply_patchfile.c b/apply_patchfile.c index f98c7e7..ef3802c 100644 --- a/apply_patchfile.c +++ b/apply_patchfile.c @@ -1,5 +1,4 @@ -#include -#include +#include #include int main(int argc, char **argv) { @@ -8,7 +7,7 @@ int main(int argc, char **argv) { b_init(&binary); mode_t mode; prange_t kernel = load_file(argv[1], true, &mode); - b_prange_load_macho(&binary, kernel, argv[1]); + b_prange_load_macho(&binary, kernel, 0, argv[1]); int patchfd = open(argv[2], O_RDONLY); if(patchfd == -1) { @@ -55,7 +54,7 @@ int main(int argc, char **argv) { printf("%s (0x%x)\n", name, addr); } - memcpy((char *) kernel.start + range_to_off_range((range_t) {&binary, addr, size}).start, stuff, size); + memcpy((char *) kernel.start + range_to_off_range((range_t) {&binary, addr, size}, MUST_FIND).start, stuff, size); skip: diff --git a/check_sanity.c b/check_sanity.c index df40817..cd1d654 100644 --- a/check_sanity.c +++ b/check_sanity.c @@ -1,6 +1,5 @@ -#include -#include -#include +#include +#include #include #include @@ -11,9 +10,9 @@ int main(int argc, char **argv) { } struct binary binary; b_init(&binary); - b_load_macho(&binary, argv[1], false); + b_prange_load_macho(&binary, load_file(argv[1], false, NULL), 0, argv[1]); int result = 0; - CMD_ITERATE(binary.mach_hdr, cmd) { + CMD_ITERATE(binary.mach->hdr, cmd) { if(cmd->cmd == LC_SEGMENT) { struct segment_command *seg = (void *) cmd; uint32_t start = seg->vmaddr; diff --git a/dump_range.c b/dump_range.c index a90d21d..5165819 100644 --- a/dump_range.c +++ b/dump_range.c @@ -1,5 +1,4 @@ -#include -#include +#include int main(int argc, char **argv) { if(argc != 4) { @@ -8,8 +7,8 @@ int main(int argc, char **argv) { } struct binary binary; b_init(&binary); - b_load_macho(&binary, argv[1], false); - prange_t pr = rangeconv((range_t) {&binary, parse_hex_uint32(argv[2]), parse_hex_uint32(argv[3])}); + b_load_macho(&binary, argv[1]); + prange_t pr = rangeconv((range_t) {&binary, parse_hex_uint32(argv[2]), parse_hex_uint32(argv[3])}, MUST_FIND); write(1, pr.start, pr.size); return 0; } diff --git a/make_kernel_patchfile.c b/make_kernel_patchfile.c index faa0f41..375218f 100644 --- a/make_kernel_patchfile.c +++ b/make_kernel_patchfile.c @@ -1,7 +1,7 @@ #include #include -#include -#include +#include +#include #include "lambda.h" extern unsigned char sandbox_o[]; @@ -118,7 +118,7 @@ void do_kernel(struct binary *binary, struct binary *sandbox) { die("? %s", name); }) b_relocate(sandbox, (void *) l.arg, (void *) l.func, 0); - prange_t sandbox_pr = rangeconv(b_nth_segment(sandbox, 0)); + prange_t sandbox_pr = rangeconv_off(sandbox->segments[0].file_range, MUST_FIND); patch_with_range("sb_evaluate hook", scratch, sandbox_pr); @@ -139,8 +139,8 @@ int main(int argc, char **argv) { struct binary kernel, sandbox; b_init(&kernel); b_init(&sandbox); - b_load_macho(&kernel, argv[1], false); - b_prange_load_macho(&sandbox, (prange_t) {&sandbox_o, sandbox_o_len}, "sandbox.o"); + b_load_macho(&kernel, argv[1]); + b_prange_load_macho(&sandbox, (prange_t) {&sandbox_o, sandbox_o_len}, 0, "sandbox.o"); patchfd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0644); if(patchfd == -1) { diff --git a/nm.c b/nm.c new file mode 100644 index 0000000..d08f118 --- /dev/null +++ b/nm.c @@ -0,0 +1,39 @@ +#include +#include +#include + +static void usage() { + fprintf(stderr, "Usage: nm [-exp] binary [symbol]\n"); + exit(1); +} + +int main(int argc, char **argv) { + int flags = 0; + + int c; + while((c = getopt(argc, argv, "ixp")) != -1) switch(c) { + case 'i': flags |= IMPORTED_SYM; break; + case 'x': flags |= TO_EXECUTE; break; + case 'p': flags |= PRIVATE_SYM; break; + default: usage(); + } + + if(!argv[optind] || (argv[optind + 1] && argv[optind + 2])) usage(); + + struct binary binary; + b_init(&binary); + b_load_macho(&binary, argv[optind]); + + if(argv[optind + 1]) { + printf("%8x\n", b_sym(&binary, argv[optind + 1], flags)); + } else { + struct data_sym *syms; + uint32_t nsyms; + b_copy_syms(&binary, &syms, &nsyms, flags); + while(nsyms--) { + printf("%8x %s\n", syms->address, syms->name); + syms++; + } + } + return 0; +}