changeset 357:22c6e39e1789

target-utils/tf-breakin: build embeddable form of the payload
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Thu, 15 May 2014 09:49:30 +0000
parents 4e0aa166baa5
children b39802cd9329
files .hgignore target-utils/tf-breakin/Makefile target-utils/tf-breakin/mkembed.c
diffstat 3 files changed, 85 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/.hgignore	Thu May 15 09:18:23 2014 +0000
+++ b/.hgignore	Thu May 15 09:49:30 2014 +0000
@@ -32,6 +32,8 @@
 ^rvinterf/tmsh/fc-tmsh$
 
 ^target-utils/.*/crt0\.S$
+^target-utils/tf-breakin/embed\.c$
+^target-utils/tf-breakin/mkembed$
 
 ^toolchain/binutils-2\.21\.1/
 ^toolchain/binutils-build/
--- a/target-utils/tf-breakin/Makefile	Thu May 15 09:18:23 2014 +0000
+++ b/target-utils/tf-breakin/Makefile	Thu May 15 09:49:30 2014 +0000
@@ -1,14 +1,20 @@
 CC=	arm-elf-gcc
 OBJCOPY=arm-elf-objcopy
 
-all:	payload.bin
+all:	payload.o payload.bin embed.c
 
 .SUFFIXES: .o .bin
 
 .o.bin:
 	${OBJCOPY} -O binary $< $@
 
+mkembed:	mkembed.c
+	gcc -O2 -o $@ $@.c
+
+embed.c:	payload.bin mkembed
+	./mkembed payload.bin $@
+
 clean:
-	rm -f *.o *errs *core *.bin
+	rm -f *.o *errs *core *.bin mkembed embed.c
 
 FRC:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/target-utils/tf-breakin/mkembed.c	Thu May 15 09:49:30 2014 +0000
@@ -0,0 +1,75 @@
+#include <sys/types.h>
+#include <sys/file.h>
+#include <sys/stat.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#define	PAYLOAD_SIZE	112
+u_char payload_buf[PAYLOAD_SIZE];
+
+read_binary(filename)
+	char *filename;
+{
+	int fd;
+	struct stat st;
+
+	fd = open(filename, O_RDONLY);
+	if (fd < 0) {
+		perror(filename);
+		exit(1);
+	}
+	fstat(fd, &st);
+	if (!S_ISREG(st.st_mode)) {
+		fprintf(stderr, "error: %s is not a regular file\n", filename);
+		exit(1);
+	}
+	if (st.st_size != PAYLOAD_SIZE) {
+		fprintf(stderr, "error: %s size mismatch\n", filename);
+		exit(1);
+	}
+	if (read(fd, payload_buf, PAYLOAD_SIZE) != PAYLOAD_SIZE) {
+		perror("read error");
+		exit(1);
+	}
+	close(fd);
+}
+
+write_output(filename)
+	char *filename;
+{
+	FILE *of;
+	int i, j, idx;
+
+	of = fopen(filename, "w");
+	if (!of) {
+		perror(filename);
+		exit(1);
+	}
+	fprintf(of, "u_char payload[%d] = {\n", PAYLOAD_SIZE);
+	idx = 0;
+	for (i = 0; i < 14; i++) {
+		for (j = 0; j < 8; j++) {
+			if (j)
+				putc(' ', of);
+			else
+				putc('\t', of);
+			fprintf(of, "0x%02X,", payload_buf[idx++]);
+		}
+		putc('\n', of);
+	}
+	fputs("};\n", of);
+	fclose(of);
+}
+
+main(argc, argv)
+	char **argv;
+{
+	if (argc != 3) {
+		fprintf(stderr, "usage: %s payload.bin output.c\n", argv[0]);
+		exit(1);
+	}
+	read_binary(argv[1]);
+	write_output(argv[2]);
+	exit(0);
+}