>From 25cde23d4533e8a82a14f480ffe6c7ac16cf0751 Mon Sep 17 00:00:00 2001 From: Richard Jones Date: Mon, 27 Jul 2009 16:26:08 +0100 Subject: [PATCH] New command 'file-arch' to show architecture of binaries and libraries. This command can be pointed at just about any binary, library, kernel module or initrd, and will return the architecture of that binary. Also works with Windows binaries. --- .gitignore | 6 +- TODO | 16 -- daemon/Makefile.am | 1 + daemon/arch.c | 563 +++++++++++++++++++++++++++++++++++++++++++++ daemon/daemon.h | 2 +- images/Makefile.am | 63 ++++- images/README-binfiles | 13 + images/bin-i586-dynamic | Bin 0 -> 4616 bytes images/bin-sparc-dynamic | Bin 0 -> 5060 bytes images/bin-win32.exe | Bin 0 -> 21617 bytes images/bin-win64.exe | Bin 0 -> 44557 bytes images/bin-x86_64-dynamic | Bin 0 -> 6484 bytes images/lib-i586.so | Bin 0 -> 3834 bytes images/lib-sparc.so | Bin 0 -> 4536 bytes images/lib-win32.dll | Bin 0 -> 16402 bytes images/lib-win64.dll | Bin 0 -> 34777 bytes images/lib-x86_64.so | Bin 0 -> 5467 bytes po/POTFILES.in | 1 + src/MAX_PROC_NR | 2 +- src/generator.ml | 46 ++++ 20 files changed, 681 insertions(+), 32 deletions(-) create mode 100644 daemon/arch.c create mode 100644 images/README-binfiles create mode 100755 images/bin-i586-dynamic create mode 100755 images/bin-sparc-dynamic create mode 100755 images/bin-win32.exe create mode 100755 images/bin-win64.exe create mode 100755 images/bin-x86_64-dynamic create mode 100755 images/lib-i586.so create mode 100755 images/lib-sparc.so create mode 100755 images/lib-win32.dll create mode 100755 images/lib-win64.dll create mode 100755 images/lib-x86_64.so diff --git a/.gitignore b/.gitignore index d66ed99..f2064a3 100644 --- a/.gitignore +++ b/.gitignore @@ -81,6 +81,8 @@ images/100kallzeroes images/100krandom images/10klines images/initrd +images/initrd-x86_64.img +images/initrd-x86_64.img.gz images/test.sqsh initramfs initramfs.timestamp @@ -123,6 +125,7 @@ missing *.o ocaml/bindtests ocaml/bindtests.ml +ocaml/dllmlguestfs.so ocaml/examples/lvs ocaml/guestfs_c_actions.c ocaml/guestfs.ml @@ -156,9 +159,9 @@ python/guestfs.pyc ruby/bindtests.rb ruby/ext/guestfs/extconf.h ruby/ext/guestfs/_guestfs.c +ruby/ext/guestfs/_guestfs.so ruby/ext/guestfs/mkmf.log ruby/Rakefile -*.so src/guestfs-actions.c src/guestfs-actions.h src/guestfs-bindtests.c @@ -166,6 +169,7 @@ src/guestfs_protocol.c src/guestfs_protocol.h src/guestfs_protocol.x src/guestfs-structs.h +src/.libs/libguestfs.so src/.pod2text.data src/stamp-generator stamp-h1 diff --git a/TODO b/TODO index 291d220..dbfc3c8 100644 --- a/TODO +++ b/TODO @@ -182,22 +182,6 @@ Swap space Allow swap space from the guest to be used. Is it a good idea? -Query guest architecture ------------------------- - -Need a way to query a binary or library file for its architecture. -Using objdump or readelf? -What about non-ELF files (eg. Windows, BSD). - -To do this properly requires some serious logic, eg. to cover Linux -and Windows we'd need objdump and i686-pc-mingw32-objdump, and more to -cover a.out, COFF and 64 bit Windows. Therefore this cannot be done -inside the daemon, and should be done by a separate, external program -similar to virt-inspector. - -Probably we should go all the way and have virt-inspector able to -determine kernel and userspace architectures of guests. - Other initrd-* commands ----------------------- diff --git a/daemon/Makefile.am b/daemon/Makefile.am index 7b8a87e..f238659 100644 --- a/daemon/Makefile.am +++ b/daemon/Makefile.am @@ -20,6 +20,7 @@ ACLOCAL_AMFLAGS = -I m4 noinst_PROGRAMS = guestfsd guestfsd_SOURCES = \ actions.h \ + arch.c \ augeas.c \ blockdev.c \ checksum.c \ diff --git a/daemon/arch.c b/daemon/arch.c new file mode 100644 index 0000000..bacd6c6 --- /dev/null +++ b/daemon/arch.c @@ -0,0 +1,563 @@ +/* libguestfs - the guestfsd daemon + * Copyright (C) 2009 Red Hat Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "daemon.h" +#include "actions.h" + +/* This file implements the 'file_arch' command, which goes further + * than 'file' in trying to determine the architecture of a specific + * binary, library, kernel or initrd. + * + * We use a series of heuristics (see do_file_arch below) to + * determine this, falling back to using the actual /usr/bin/file + * command at the end. + */ + +/* List of supported compression formats, straight out of the kernel. */ +static const struct compress_format { + unsigned char magic[2]; + const char *name; +} compressed_formats[] = { + { {037, 0213}, "gzip" }, + { {037, 0236}, "gzip" }, + { {0x42, 0x5a}, "bzip2" }, + /* { {0x5d, 0x00}, "lzma" }, - we don't support this yet, would need + * to add 7zip to the appliance. + */ + { {0, 0}, NULL } +}; + +/* In the end, vmlinuz/x86 detection just doesn't work well enough to + * include it. Hence this next bit is commented out. + */ +#if 0 + +/* http://weichong78.blogspot.com/2008/08/vmlinuz-parts-in-memory-and-file.html + * was very helpful. + * + * So was http://lxr.linux.no/linux+v2.6.30/arch/x86/boot/header.S + * + * Nevertheless, vmlinuz images are almost impossible to decode + * because they contain 16 bit code followed by the kernel itself, + * compressed, with no indication of architecture. Instead let's + * just use the kernel version string. + */ + +struct setup_header { + uint8_t setup_sects; /* Number of sectors in the setup section */ + uint16_t root_flags; + uint32_t syssize; + uint16_t ram_size; + uint16_t vid_mode; + uint16_t root_dev; + uint8_t boot_flag[2]; /* 0x55, 0xAA */ + uint8_t short_jmp[2]; /* 0xEB, offset */ + char header[4]; /* "HdrS" */ + uint16_t version; + uint16_t default_switch; + uint16_t setupseg; + uint16_t sysseg; + uint16_t kernel_version; /* Offset of kernel version - 512 */ +} __attribute__((packed)); + +static char * +check_vmlinuz_x86 (int fd, const unsigned char *first512) +{ + struct setup_header *hdr; + unsigned char *setup; + int setup_len, r, len; + char *kernel, *arch, *ret; + + /* Get setup_sects. */ + hdr = (struct setup_header *) &first512[0x1f1]; + /* This shouldn't fail because it was checked before this + * function was called. + */ + assert (hdr->boot_flag[0] == 0x55); + assert (hdr->boot_flag[1] == 0xAA); + + /* We'll read up to 255 more sectors, which seems reasonable even + * if setup_sects was chosen maliciously. + */ + setup_len = (hdr->setup_sects + 1) * 512; + setup = malloc (setup_len); + if (setup == NULL) { + reply_with_perror ("malloc"); + close (fd); + return NULL; + } + + memcpy (setup, first512, 512); + r = read (fd, setup + 512, setup_len - 512); + if (r == -1) { + reply_with_perror ("read"); + close (fd); + free (setup); + return NULL; + } + if (r < setup_len - 512) { + reply_with_error ("file-arch: vmlinuz: ancient (pre-bzImage) vmlinuz"); + close (fd); + free (setup); + return NULL; + } + + close (fd); + + hdr = (struct setup_header *) &setup[0x1f1]; + assert (hdr->boot_flag[0] == 0x55); + assert (hdr->boot_flag[1] == 0xAA); + + /* Is it a setup header? */ + if (strncmp (&hdr->header[0], "HdrS", 4) != 0) { + reply_with_error ("file-arch: vmlinuz: no setup header found"); + free (setup); + return NULL; + } + + /* Try to get the kernel version. Remember that this value + * may have been chosen maliciously, so we have to check it + * carefully. + */ + kernel = (char *) &setup[hdr->kernel_version + 512]; + if (hdr->kernel_version + 512 >= setup_len || + hdr->kernel_version + 512 + (len = strlen (kernel)) >= setup_len) { + reply_with_error ("file-arch: vmlinuz: no kernel version string found"); + free (setup); + return NULL; + } + + if (verbose) + printf ("kernel = %s (len = %d)\n", kernel, len); + + /* The kernel version is formatted as: + * "version[.-]arch otherstuff" + */ + len = strcspn (kernel, " "); + if (len <= 0) { + parse_error: + reply_with_error ("file-arch: vmlinuz: could not parse kernel string"); + free (setup); + return NULL; + } + kernel[len] = '\0'; + + arch = strrchr (kernel, '.'); + if (arch == NULL) + goto parse_error; + + char *dash = strrchr (kernel, '-'); + if (dash && arch < dash) arch = dash; + + arch++; + if (strcmp (arch, "amd64") == 0) + arch = "x86_64"; + + /* XXX We should check this looks like a reasonable arch. */ + ret = strdup (arch); + free (setup); + return ret; +} + +#endif /* end of non-working vmlinuz detection */ + +static char * +check_elf (const unsigned char *first /* need first ~20 bytes */) +{ + uint16_t machine; + const char *s_machine; + + switch (first[EI_CLASS]) { + case ELFCLASS32: { + Elf32_Ehdr *hdr = (Elf32_Ehdr *) first; + machine = hdr->e_machine; + } + break; + + case ELFCLASS64: { + Elf64_Ehdr *hdr = (Elf64_Ehdr *) first; + machine = hdr->e_machine; + } + break; + + default: + reply_with_error ("file-arch: ELF: invalid class"); + return NULL; + } + + /* Swap endian? */ + switch (first[EI_DATA]) { + case ELFDATA2LSB: /* file is little endian */ + machine = le16toh (machine); + break; + case ELFDATA2MSB: /* file is big endian */ + machine = be16toh (machine); + break; + default: + reply_with_error ("file-arch: ELF: invalid endianness"); + return NULL; + } + + /* Our policy here is we'll only return strings for architectures + * where we know the undisputed canonical arch string. For others, + * we'll add them on demand. + */ + switch (machine) { + case EM_NONE: + reply_with_error ("file-arch: ELF: no machine defined for binary"); + return NULL; + + case EM_SPARC: + case EM_SPARC32PLUS: + s_machine = "sparc"; + break; + + case EM_386: + s_machine = "i386"; + break; + + case EM_PPC: + s_machine = "ppc"; + break; + + case EM_PPC64: + s_machine = "ppc64"; + break; + + case EM_S390: + s_machine = "s390"; + break; + + case EM_ARM: + s_machine = "arm"; + break; + + case EM_SPARCV9: + s_machine = "sparc64"; + break; + + case EM_IA_64: + s_machine = "ia64"; + break; + + case EM_X86_64: + s_machine = "x86_64"; + break; + + default: + reply_with_error ("file-arch: ELF: unknown architecture %d", machine); + return NULL; + } + + return strdup (s_machine); /* caller frees */ +} + +/* There's a potential DoS attack here which is very hard to solve (XXX) + * + * A malicious guest could create an initrd which contains a huge + * bin/nash file. When we tried to unpack this, it would consume + * all space in /tmp (ie. physical memory, because this is an initramfs) + * and cause the appliance kernel to panic. AFAICS this is just a + * DoS, not an exploit into the appliance, so it would just cause + * libguestfs to stop with an error. + */ + +#define INITRD_BINARIES "bin/nash bin/sh bin/bash bin/modprobe" + +static char * +check_initrd (char *unpack_cmd) +{ + int r; + DIR *dir; + struct dirent *d; + int fd; + unsigned char first[256]; + char path[256]; + char *ret = NULL; + + if (verbose) + fprintf (stderr, "unpack with: %s\n", unpack_cmd); + + command (NULL, NULL, "rm", "-rf", "/tmp/bin", NULL); + + /* Unpack the initrd into /tmp. This will create /tmp/bin containing + * hopefully one of the INITRD_BINARIES. + */ + chdir ("/tmp"); + r = system (unpack_cmd); + chdir ("/"); + + if (r == -1) { + reply_with_perror ("system: %s", unpack_cmd); + free (unpack_cmd); + return NULL; + } + + free (unpack_cmd); + + if (WEXITSTATUS (r) != 0) { + reply_with_error ("cpio: failed with exit code %d", WEXITSTATUS (r)); + return NULL; + } + + /* Did we get any binaries out of that? */ + dir = opendir ("/tmp/bin"); + if (!dir) { + reply_with_error ("cpio: initrd doesn't contain any recognized binaries"); + return NULL; + } + + /* /tmp/bin was created so it must contain at least one binary ... */ + while ((d = readdir (dir)) != NULL) { + if (strcmp (d->d_name, ".") == 0 || strcmp (d->d_name, "..") == 0) + continue; + + snprintf (path, sizeof path, "/tmp/bin/%s", d->d_name); + fd = open (path, O_RDONLY); + if (fd == -1) + continue; + + r = read (fd, first, sizeof first); + if (r == -1) { + reply_with_perror ("read: %s", path); + close (fd); + goto cleanup; + } + close (fd); + if (r < sizeof first) { + reply_with_error ("read: %s: file is smaller than %zu bytes\n", + path, sizeof first); + goto cleanup; + } + + if (first[EI_MAG0] == ELFMAG0 && + first[EI_MAG1] == ELFMAG1 && + first[EI_MAG2] == ELFMAG2 && + first[EI_MAG3] == ELFMAG3) { + ret = check_elf (first); /* either sets ret or calls reply_with_error */ + goto cleanup; + } + } + + reply_with_error ("cpio: initrd doesn't contain any recognized binaries"); + + cleanup: + closedir (dir); + command (NULL, NULL, "rm", "-rf", "/tmp/bin", NULL); + return ret; +} + +static char * +check_initrd_compressed (const char *path, const char *compressed_format) +{ + const char *zcat; + char *cmd; + FILE *fp; + char line[256]; + + if (strcmp (compressed_format, "gzip") == 0) + zcat = "zcat"; + else if (strcmp (compressed_format, "bzip2") == 0) + zcat = "bzcat"; + else { + /* This is an internal error really. */ + reply_with_error ("check_initrd_compressed: unknown compressed format"); + return NULL; + } + + /* Need to check first that it's a compressed cpio file. Old kernels + * had compressed ext2 filesystems which cpio will barf on. + */ + if (asprintf_nowarn (&cmd, "%s %R | file -bsL -", zcat, path) == -1) { + reply_with_perror ("asprintf"); + return NULL; + } + + if (verbose) + fprintf (stderr, "%s\n", cmd); + + fp = popen (cmd, "r"); + if (fp == NULL) { + reply_with_perror ("%s", cmd); + free (cmd); + return NULL; + } + + free (cmd); + + if (fgets (line, sizeof line, fp) == NULL) { + reply_with_perror ("file-arch: cpio: fgets"); + fclose (fp); + return NULL; + } + + if (fclose (fp) == -1) { + reply_with_perror ("file-arch: cpio: fclose"); + return NULL; + } + + if (strstr (line, "ext2 filesystem")) { + reply_with_perror ("file-arch: initrd is an old-style compressed ext2 filesystem, which we don't support"); + return NULL; + } + + /* It's compressed cpio, so make the unpacking command. */ + if (asprintf_nowarn (&cmd, "%s %R | cpio -id " INITRD_BINARIES, zcat, path) + == -1) { + reply_with_perror ("asprintf"); + return NULL; + } + + return check_initrd (cmd); +} + +static char * +check_initrd_uncompressed (const char *path) +{ + char *cmd; + + /* We already know here that it's a cpio file. */ + + if (asprintf_nowarn (&cmd, "cpio -id " INITRD_BINARIES " < %R", path) == -1) { + reply_with_perror ("asprintf"); + return NULL; + } + + return check_initrd (cmd); +} + +char * +do_file_arch (char *path) +{ + int fd; + int r; + int i; + unsigned char first512[512]; /* must always be 512 bytes */ + char *file; + + NEED_ROOT (NULL); + ABS_PATH (path, NULL); + + CHROOT_IN; + fd = open (path, O_RDONLY); + CHROOT_OUT; + + if (fd == -1) { + reply_with_perror ("open: %s", path); + return NULL; + } + + /* Load the first 512 bytes of the file. 512 is chosen because we + * need this in order to determine if the file is a vmlinuz (kernel + * image), since 512 bytes is the size of the obsolete boot sector + * "header" for vmlinuz images on i386 and x86_64 architectures. + */ + r = read (fd, first512, sizeof first512); + if (r == -1) { + reply_with_perror ("read: %s", path); + close (fd); + return NULL; + } + if (r < sizeof first512) { + reply_with_error ("read: %s: file is smaller than %zu bytes\n", + path, sizeof first512); + close (fd); + return NULL; + } + + /* Check for vmlinuz i386/x86_64. EFI vmlinuz are just ELF + * binaries, so we don't need to do anything special for them. But + * there are probably other non-x86 vmlinuz formats that we should + * try to detect in future. + */ + fprintf (stderr, "%x %x\n", first512[0x1fe], first512[0x1ff]); + + if (first512[0x1fe] == 0x55 && first512[0x1ff] == 0xaa) { +#if 0 + return check_vmlinuz_x86 (fd, first512); +#else + close (fd); + reply_with_error ("file-arch: this command does not work on Linux i386/x86-64 vmlinuz files"); + return NULL; +#endif + } + + /* Check for compressed file. The only ones we promise to decode + * are initrd images. + */ + for (i = 0; compressed_formats[i].name != NULL; ++i) { + if (first512[0] == compressed_formats[i].magic[0] && + first512[1] == compressed_formats[i].magic[1]) { + close (fd); + return check_initrd_compressed (path, compressed_formats[i].name); + } + } + + /* Uncompressed initrd (pretty rare). */ + if (strncmp ((char *) first512, "070701", 6) == 0) { + close (fd); + return check_initrd_uncompressed (path); + } + + /* ELF? */ + if (first512[EI_MAG0] == ELFMAG0 && + first512[EI_MAG1] == ELFMAG1 && + first512[EI_MAG2] == ELFMAG2 && + first512[EI_MAG3] == ELFMAG3) { + close (fd); + return check_elf (first512); + } + + /* We could do other checks here (eg. for Windows), but it's easier + * to now run the external 'file' command and decode those strings. + */ + close (fd); + + file = do_file (path); + if (!file) return NULL; /* do_file has already sent an error. */ + + /* Win32 and Win64 binaries and DLLs. */ + if (strstr (file, "PE32 executable")) { + strcpy (file, "i386"); + return file; + } + + if (strstr (file, "PE32+ executable")) { + strcpy (file, "x86_64"); + return file; + } + + /* We don't know what it is. */ + free (file); + reply_with_error ("file-arch: %s: unknown architecture", path); + return NULL; +} diff --git a/daemon/daemon.h b/daemon/daemon.h index 5bf6f35..9aa831a 100644 --- a/daemon/daemon.h +++ b/daemon/daemon.h @@ -62,7 +62,7 @@ extern void udev_settle (void); * printf formatters %Q and %R. See HACKING file for more * info about these. */ -static int +static inline int asprintf_nowarn (char **strp, const char *fmt, ...) { int r; diff --git a/images/Makefile.am b/images/Makefile.am index 256259b..a27e4a2 100644 --- a/images/Makefile.am +++ b/images/Makefile.am @@ -22,7 +22,17 @@ EXTRA_DIST = \ helloworld.tar \ helloworld.tar.gz \ mbr-ext2-empty.img.gz \ - empty known-1 known-2 known-3 + empty known-1 known-2 known-3 \ + bin-i586-dynamic \ + bin-sparc-dynamic \ + bin-win32.exe \ + bin-win64.exe \ + bin-x86_64-dynamic \ + lib-i586.so \ + lib-sparc.so \ + lib-win32.dll \ + lib-win64.dll \ + lib-x86_64.so noinst_DATA = test.sqsh @@ -32,20 +42,32 @@ CLEANFILES = \ initrd squash_files_src = \ - $(srcdir)/helloworld.tar \ - $(srcdir)/helloworld.tar.gz \ - $(srcdir)/empty \ - $(srcdir)/known-1 \ - $(srcdir)/known-2 \ - $(srcdir)/known-3 + $(srcdir)/helloworld.tar \ + $(srcdir)/helloworld.tar.gz \ + $(srcdir)/empty \ + $(srcdir)/known-1 \ + $(srcdir)/known-2 \ + $(srcdir)/known-3 \ + $(srcdir)/bin-i586-dynamic \ + $(srcdir)/bin-sparc-dynamic \ + $(srcdir)/bin-win32.exe \ + $(srcdir)/bin-win64.exe \ + $(srcdir)/bin-x86_64-dynamic \ + $(srcdir)/lib-i586.so \ + $(srcdir)/lib-sparc.so \ + $(srcdir)/lib-win32.dll \ + $(srcdir)/lib-win64.dll \ + $(srcdir)/lib-x86_64.so squash_files_build = \ - $(builddir)/100kallzeroes \ - $(builddir)/100kallnewlines \ - $(builddir)/100kallspaces \ - $(builddir)/100krandom \ - $(builddir)/10klines \ - $(builddir)/initrd + $(builddir)/100kallzeroes \ + $(builddir)/100kallnewlines \ + $(builddir)/100kallspaces \ + $(builddir)/100krandom \ + $(builddir)/10klines \ + $(builddir)/initrd \ + $(builddir)/initrd-x86_64.img \ + $(builddir)/initrd-x86_64.img.gz squash_files = $(squash_files_src) $(squash_files_build) @@ -86,3 +108,18 @@ $(builddir)/initrd: empty known-1 known-2 known-3 rm -f $@ $@-t for f in $^; do echo $$f; done | cpio -o -H newc | gzip --best > $@-t mv $@-t $@ + +# Create a dummy initrd with a single file called 'bin/nash' which +# is used to test the file-arch command. +$(builddir)/initrd-x86_64.img: bin-x86_64-dynamic + rm -rf bin $@ $@-t + mkdir bin + cp $< bin/nash + echo bin/nash | cpio -o -H newc > $@-t + mv $@-t $@ + rm -rf bin $@-t + +$(builddir)/initrd-x86_64.img.gz: initrd-x86_64.img + rm -f $@ $@-t + gzip --best -c $< > $@-t + mv $@-t $@ diff --git a/images/README-binfiles b/images/README-binfiles new file mode 100644 index 0000000..00d568a --- /dev/null +++ b/images/README-binfiles @@ -0,0 +1,13 @@ +The bin-*, lib-* and vmlinuz-* files are used for testing the +guestfs_file_arch API. + +The bin-* files are generated from empty source files (ie. +"main(){}") on the respective architectures. + +The lib-* files are generated from a (really) empty source file called +lib.c which is linked into a library using gcc -shared on the +respective architectures. + +If you are concerned that these binary files "lack source" then you +can just remove them, but you also have to patch out the tests from +the test suite (see src/generator.ml). diff --git a/images/bin-i586-dynamic b/images/bin-i586-dynamic new file mode 100755 index 0000000000000000000000000000000000000000..4f770633b47386ce8ab5a99eb6e35d1ae57b9de1 GIT binary patch literal 4616 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 E4Rlo`%K!iX literal 0 HcmV?d00001 diff --git a/images/bin-sparc-dynamic b/images/bin-sparc-dynamic new file mode 100755 index 0000000000000000000000000000000000000000..138839af7840cc549a02937310df21c799984b7c GIT binary patch literal 5060 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 literal 0 HcmV?d00001 diff --git a/images/bin-win64.exe b/images/bin-win64.exe new file mode 100755 index 0000000000000000000000000000000000000000..98bddc028a5f0f95d155a970813d489265a624a3 GIT binary patch literal 44557 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 literal 0 HcmV?d00001 diff --git a/images/lib-sparc.so b/images/lib-sparc.so new file mode 100755 index 0000000000000000000000000000000000000000..7feec75eb2222139e80c33095d8061bdedc6546b GIT binary patch literal 4536 zcmdT{U2IfE6rQ{7Z3`5vfPhNkN*YrlTo)(=i3ztXOKB-Bl#-w^xxMW!?VA0;-CJyl zk>y7pG{(gEA9}o&1|NF#XwM^CJSy!*`000)--fD|vJk;$NuyD7OktHrS&HOIdej#}V_BDF%Y4Jr!l;clTI+<9h`XMPI(_-P9}PvBxM=NY+Z1(HTdS-!Y_mck z|8cC=Y@87cMc@zy$smNomv^SNgaxYCcu^W$0h}I&xvul$5>#`bl3m z&p|(}^as+%+udRpAeZEia5|m5*(AVR2qgAEF?_4}l zd`t-YV7YvA)Vz3<3+He{?~*aIWE6_MB2*C72Fh$razB8F^vpv=RHMC!iw(G~y_85B2_UGH;5!I)rN}p_DsW~s3) z4UAvTiSA>d4Ot$HAF$oh{@u^d`8fKwP|i>F#+!xW!E(qJbw%jx3*{J2F_zEoD&J&3 z{;mBx$q&}$b23g~os~fdEwrSrh_2j^T=P6T=JL$QmM5=4zYaFB3UTK1Y&0;7Vm3Gp zo&)9{uEIW|9oZMyD}sBd7Q7fHjEs7y0LgRoZ7|QJ`fRy8iSk}Z_RE000^AOH1DL*d zM*L>{M}##LiJU0^$pk@v0=nGK#G*AC-4JfV=VW=f*=n{T;nk7I-ps?S1td4I$QaXwCDB-EAQoeIjFTv)=O9enIWrhD4B|{OvZ&ogKmCMSn-hzYWmX4 z`Ih~OTt1o2Oal&VxkSok1*PpvdBTz(CCf_;LzkZ>D>3No&AI7>u=>4hE|1W@c%~mA z_$6W-E0>jRy6I#;+R36ezD}r;O{WtX?=F|fgYf4X=9)gEn0rGL*EPw)di@KMe%veM zW-yN*68*^Q!Q3zK;~tXx=$Nw6mpS0SXK@r*$D|Y|?)31^n=3H^G&*pjPw`1AY_m16OQ8zvBSN zo$MdZH+jaDfOUJ6?C)1#H4ff0j&aB zpxj`tH0gL62PM}6D{G(Y3afVIo}^vHmwS&ujhXvQ8u2|Og?jl9JLd_+eIqf?4QjF; z>?(h9573`upuHgf{qHGMv!pQ336Na7^skptu2UHw-)E3vj#I!sj}rJY1@JwTz!Ma} z%p36)3SiC&@U(XcG1i5&a~}iCIi>$XiPax4@4`BVNRE7$)FVFjku

4*-uV%>Ln? z?)MKB*}t`DsYpAL&-=tS)t&)6+j|OF&bz{cn1%w%wf_;|VgSE}d=Y9ps`;e)S48`A zd@!(oAM5-AGrwQV=pWX%X)}WA-!H&LK#k?vAy)Axbv}&{^IUKKXcJ=VZ=xm;b+M@weJnIakvVCsK zk>6*>9U2z+`tD05yhPkuyKc>TL4%Ww4+AwvM8BI#IgWF?dh&bk#D~)95#KFXp!yW+ z+$_7arMqQ&%+ZKl()v_nd2#T2G_%nu6CSu6acf7{rj`z;Ys;2hu^y+VWm89tBai2^ z&Y+u#r|>%V)1aE!(cKk|ZQk7-LzX(XwY0`6bv8fQ*|NPY3jgWv?%O=B^(%bFi@NgC P4!+K9JNVG{U-AC{m?pQ; literal 0 HcmV?d00001 diff --git a/images/lib-win32.dll b/images/lib-win32.dll new file mode 100755 index 0000000000000000000000000000000000000000..e1a2d2e6d30ec35ae4ada8fe0473ed603ca99e2f GIT binary patch literal 16402 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 StOFUr<4dVbQ|%II#s2_!9zG}l literal 0 HcmV?d00001 diff --git a/images/lib-win64.dll b/images/lib-win64.dll new file mode 100755 index 0000000000000000000000000000000000000000..ca94485c04b7663aef4b64976ca34609a1b790f0 GIT binary patch literal 34777 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 literal 0 HcmV?d00001 diff --git a/images/lib-x86_64.so b/images/lib-x86_64.so new file mode 100755 index 0000000000000000000000000000000000000000..8cee4d202fc167f5cb2809048577b7c130dd0567 GIT binary patch literal 5467 zcmdT|U5pe(5U#ytVO3-i0TD4wKoih7ZV>P^LHAe=2DAJKcLsxInA_ds*6fe&%#p(w zB{@hGa)}y$9(>UFqS2V}pb3%~fA9}|xkOF;&ly5;iiz@|;tOk4Pk+Zu?_M+}KG>U` z>iVjxtGc_or>7t3Eo|&cBnTx*w~^vzgh);cK2Ae}C`a9t;^$(zLg}V1h}vpPv=EfY zQaa*eCjTuhw^AVvI;lfCrzz~ZwB2@Xw_V$T9?<%r2wS=%|6N*c(rZ{I1yppU+<7`E zNu2+*ME%WYqa^<~ZSAN0@sr2it{p0#uRTy$_{`z&zj7{W6E)X-kr=K9+_fMcTI_JgV1EgD+ux z8I&UQ9tH~-#!gKm+^TW;#{ck*_77v%WPO&cWQyTbmdU+ipSz>Hx8euoX1?nAe%YsLWuR#L4SOxQ<&qb8Y%}2d zVQUQ4OSGx5d41kpWv{Z=z$H-^&kKGbD%|Z{mH4F$FRt(ub&(gcizZ)@R>o3iIK2vE*M7^yIkMml)+wxKjY z?EeuKoa||x$}FXmC&GyPS#PKAR8C?UJ=Y4ZbjGf}i5b>&M$e?Vk4KUs7(OeV-7U6i z{4#1lc+`|@^i_muepQ{oDCgL!blN5NZFiP7=u%DaW+@ z;*h19rk7~CNYkXIlRAHNGX%NpNm3+#q+AgaI;stUZ`VBXc#qbT{YVPhJKqZ9&uV=h zAJrd>!>^iOsO5he^02l4{)zX4>FIYJ7j4StZ?#tNR=v_%ZLhYo)~amwmh77BT5H9Q za>;VMAjEH2y^?qI|Dm$&@2>^k0NH-f4CxSR^+r&(_tuB)f#FKEbVH>?iW~C$A+k&R z>ued)pczW`m79L0QI9b$%bMk?CkDE9e>EUmZPa#99^ty$uI=)WJJ|GUWwMJwqv>w!6;|B}Co?IicHUZy)Ap!w+D zE11py-#NEokM#`NtqqZGSXUb66BUuHW!PiAgZ`=&#johV9_uj2n6wRh>>r@mFIYtt ztWWR`S7hzN9_tkp`v&5N9%w(?%U%E;`vIt>9ZCG+8}VzHN?bwT1jGIVx<^1R@DF?R zzs|C#{ZXw53O#{k4>j#a7?ZfL-{SlP3VT*jMSMkz&rH;QLi-1`qRL!{J-A@tnD#>i}Z^K)YLcmr?frh$4XhMX`JuPcrpG;i677L zU%CkUthUeUIR4K5MZ-R)?Q`1R^k?!f8TNReJO9xBb+(t>LHu~%;5+4joVdzK+3Wa^_%W_>uIc3e+~uKt(Qs(6 zq0%(ZBu9()NmM1t5hE|+cyj8z7sqE1_VYNNBJ9&~d?sZ(bSlYjI_#@){q)p1Fpjr> zPl`OrJLyEn_W4bQM2|F-!kEV= z6y84X&nvt={#Ui%al`MsjCUHhkEEThvn_MJzEgO6KK!Kc40RiE{-N7x%M%_bi)CiX zOoK0Hd|rqAU&;6~vk~Td8JBw&Gq3K{xOx9_*EIU~GT!N)g^FIa8o5%TVl(iA;lV+> z$af?8zHK|)!seZQa?|2&h;eu1Bcf8n-CJ!8cvV-O;azWdg!o{7f3+NxOZM7T-D^k$ zZlyFL+|8s8{%&cwR@)Chy<0aZHyd~KZ0U8ui5t`}cu^k=$_wA, this function is limited in the total size of file that can be handled."); + ("file_arch", (RString "arch", [String "path"]), 151, [], + [InitSquashFS, Always, TestOutput ( + [["file_arch"; "/bin-i586-dynamic"]], "i386"); + InitSquashFS, Always, TestOutput ( + [["file_arch"; "/bin-sparc-dynamic"]], "sparc"); + InitSquashFS, Always, TestOutput ( + [["file_arch"; "/bin-win32.exe"]], "i386"); + InitSquashFS, Always, TestOutput ( + [["file_arch"; "/bin-win64.exe"]], "x86_64"); + InitSquashFS, Always, TestOutput ( + [["file_arch"; "/bin-x86_64-dynamic"]], "x86_64"); + InitSquashFS, Always, TestOutput ( + [["file_arch"; "/lib-i586.so"]], "i386"); + InitSquashFS, Always, TestOutput ( + [["file_arch"; "/lib-sparc.so"]], "sparc"); + InitSquashFS, Always, TestOutput ( + [["file_arch"; "/lib-win32.dll"]], "i386"); + InitSquashFS, Always, TestOutput ( + [["file_arch"; "/lib-win64.dll"]], "x86_64"); + InitSquashFS, Always, TestOutput ( + [["file_arch"; "/lib-x86_64.so"]], "x86_64"); + InitSquashFS, Always, TestOutput ( + [["file_arch"; "/initrd-x86_64.img"]], "x86_64"); + InitSquashFS, Always, TestOutput ( + [["file_arch"; "/initrd-x86_64.img.gz"]], "x86_64")], + "detect architecture of a binary", + "\ +This call returns the architecture string for the binary, +library, Linux kernel module, or Linux initrd named C. + +The call contains a wide range of heuristics, and can look +deep inside files such as initrd to try to get an answer. +It should give a better result than using C. + +Note that this command does not work on Linux i386 or x86_64 +vmlinuz files. The reason is that these files are not +readily reversible. Instead, use this command on the +associated initrd or kernel module(s). + +The returned string is one of the canonical architecture strings, +such as C, C, C etc. For Win32 +binaries and DLLs it returns C and for Win64 it returns +C. + +If the architecture detection fails, this call returns an error."); + ] let all_functions = non_daemon_functions @ daemon_functions -- 1.6.2.5