diff options
author | Simon Rettberg | 2023-01-05 13:37:00 +0100 |
---|---|---|
committer | Simon Rettberg | 2023-01-05 13:37:00 +0100 |
commit | edd9020372ae5deae8406cebfd163b4450100ff8 (patch) | |
tree | 497632e93ebcf2ac1fc2dd4630df0c23185b2c2b /core/modules/vmware17/usb-patcher.c | |
parent | [virt-manager] Fix build on newer setuptools versions (diff) | |
download | mltk-edd9020372ae5deae8406cebfd163b4450100ff8.tar.gz mltk-edd9020372ae5deae8406cebfd163b4450100ff8.tar.xz mltk-edd9020372ae5deae8406cebfd163b4450100ff8.zip |
[vmware17] Switch to VMware 17
Diffstat (limited to 'core/modules/vmware17/usb-patcher.c')
-rw-r--r-- | core/modules/vmware17/usb-patcher.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/core/modules/vmware17/usb-patcher.c b/core/modules/vmware17/usb-patcher.c new file mode 100644 index 00000000..2374f167 --- /dev/null +++ b/core/modules/vmware17/usb-patcher.c @@ -0,0 +1,57 @@ +#define _GNU_SOURCE +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <stdio.h> +#include <string.h> +#include <sys/mman.h> +#include <errno.h> + +char* findSequence(char *buffer, size_t len, size_t offset); + +int main(int argc, char**argv) +{ + int fd; + ssize_t flen; + char *exe, *offset; + fd = open( argv[1], O_RDWR ); + if ( fd == -1 ) { + perror( "Cannot open argv[1]" ); + return 1; + } + flen = lseek( fd, 0, SEEK_END ); + if ( flen < 0 ) { + perror( "File length bad" ); + return 2; + } + flen &= ~( sysconf( _SC_PAGE_SIZE ) - 1 ); + printf( "Mapping %d bytes.\n", (int)flen ); + exe = mmap( NULL, flen, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0 ); + if ( exe == NULL ) { + perror( "mmap failed" ); + return 3; + } + close( fd ); + offset = findSequence( exe, flen, 0 ); + if ( offset == NULL ) { + printf( "Sequence not found\n" ); + return 4; + } + if ( findSequence( exe, flen, ( offset - exe ) + 16 ) != NULL ) { + printf( "Found more than one match\n" ); + return 5; + } + printf( "Mapped at %p, instruction at %p\n", exe, offset ); + offset[2] = '\x34'; + munmap( exe, flen ); + printf( "File patched.\n" ); + return 0; +} + + +char* findSequence(char *buffer, size_t len, size_t offset) +{ + return memmem( buffer + offset, len - offset, + "\x45\x89\x3c\x24\x49\x8d\x7c\x24\x04\x48\x8d\x55\x01\x4c\x89\xf6", 16 ); +} |