From 138d456785a35c02a9dd9370ca662fb9d5698e91 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Thu, 14 Jul 2022 14:51:45 +0200 Subject: [vmware16] ADD MISSING FILE --- core/modules/vmware16/usb-patcher.c | 57 +++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 core/modules/vmware16/usb-patcher.c (limited to 'core/modules/vmware16') diff --git a/core/modules/vmware16/usb-patcher.c b/core/modules/vmware16/usb-patcher.c new file mode 100644 index 00000000..b9faaf71 --- /dev/null +++ b/core/modules/vmware16/usb-patcher.c @@ -0,0 +1,57 @@ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include + +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 ) + 19 ) != NULL ) { + printf( "Found more than one match\n" ); + return 5; + } + printf( "Mapped at %p, instruction at %p\n", exe, offset ); + offset[8] = '\xfd'; + 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, + "\x41\x56\x41\x55\x41\x54\x41\x89\xf5\x55\x53\x48\x89\xfd\xbf\x0d\x00\x00\x00", 19 ); +} -- cgit v1.2.3-55-g7522