summaryrefslogtreecommitdiffstats
path: root/core/modules/vmware17/usb-patcher.c
diff options
context:
space:
mode:
authorSimon Rettberg2023-01-05 13:37:00 +0100
committerSimon Rettberg2023-01-05 13:37:00 +0100
commitedd9020372ae5deae8406cebfd163b4450100ff8 (patch)
tree497632e93ebcf2ac1fc2dd4630df0c23185b2c2b /core/modules/vmware17/usb-patcher.c
parent[virt-manager] Fix build on newer setuptools versions (diff)
downloadmltk-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.c57
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 );
+}