about summary refs log tree commit diff
path: root/frida_mode/util/bin2c.c
diff options
context:
space:
mode:
Diffstat (limited to 'frida_mode/util/bin2c.c')
-rw-r--r--frida_mode/util/bin2c.c117
1 files changed, 117 insertions, 0 deletions
diff --git a/frida_mode/util/bin2c.c b/frida_mode/util/bin2c.c
new file mode 100644
index 00000000..899d0101
--- /dev/null
+++ b/frida_mode/util/bin2c.c
@@ -0,0 +1,117 @@
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+void fatal(char *msg) {
+
+  perror(msg);
+  exit(1);
+
+}
+
+void bin2c_write(char *name, char *output, unsigned char *buff, size_t size) {
+
+  int fd = open(output, O_CREAT | O_WRONLY | O_TRUNC, 00660);
+  if (fd < 0) { fatal("open"); }
+
+  /* Write the array definition */
+  dprintf(fd, "unsigned char %s[] = {\n", name);
+
+  /* 12 bytes per row, just like xxd means we fit an 80 character width */
+  for (size_t i = 0; i < size; i += 12) {
+
+    for (size_t j = 0; j < 12; j++) {
+
+      size_t idx = i + j;
+
+      /* If we get to the end of the input, then break */
+      if (idx >= size) { break; }
+
+      /* If we are writing the first column, then we need a leading indent */
+      if (j == 0) { dprintf(fd, "  "); }
+
+      /* Write the hexadecimal byte value */
+      dprintf(fd, "0x%02x", buff[idx]);
+
+      /* If we have just written the last byte, then stop */
+      if (idx == size - 1) { break; }
+
+      /*
+       * If we have written the last byte in a row, then follow with a comma
+       * and a newline
+       */
+      if (j == 11) {
+
+        dprintf(fd, ",\n");
+
+        /*
+         * Otherwise, follow with a command and a space
+         */
+
+      } else {
+
+        dprintf(fd, ", ");
+
+      }
+
+    }
+
+  }
+
+  /* Write the closing brace for the array */
+  dprintf(fd, "\n};\n");
+
+  /* Write a parameter describing the length of the array */
+  dprintf(fd, "unsigned int %s_len = %lu;\n", name, size);
+
+  if (close(fd) < 0) { fatal("close"); }
+
+}
+
+void bin2c(char *name, char *input, char *output) {
+
+  int fd = open(input, O_RDONLY);
+  if (fd < 0) { fatal("open(input)"); }
+
+  size_t size = lseek(fd, 0, SEEK_END);
+  if (size < 0) { fatal("lseek(SEEK_END)"); }
+
+  if (lseek(fd, 0, SEEK_SET) < 0) { fatal("lseek(SEEK_SET)"); }
+
+  unsigned char *buff = malloc(size);
+  if (buff == NULL) { fatal("malloc(size)"); }
+
+  if (read(fd, buff, size) != size) { fatal("read(size)"); }
+
+  bin2c_write(name, output, buff, size);
+
+  free(buff);
+  if (close(fd) < 0) { fatal("close(fd_in)"); }
+
+}
+
+int main(int argc, char **argv) {
+
+  if (argc < 4) {
+
+    dprintf(STDERR_FILENO, "%s <name> <input> <output>\n", argv[0]);
+    return 1;
+
+  }
+
+  char *name = argv[1];
+  char *input = argv[2];
+  char *output = argv[3];
+
+  dprintf(STDOUT_FILENO, "bin2c:\n");
+  dprintf(STDOUT_FILENO, "\tname: %s\n", name);
+  dprintf(STDOUT_FILENO, "\tinput: %s\n", input);
+  dprintf(STDOUT_FILENO, "\toutput: %s\n", output);
+
+  bin2c(name, input, output);
+
+  return 0;
+
+}
+