Advertisement
Al-Azif

dynlib_patch.c

Mar 13th, 2021
3,058
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 0.95 KB | None | 0 0
  1. // Patch sys_dynlib_dlsym: Allow from anywhere
  2. int kpayload_dynlib_patch(struct thread *td, struct kpayload_firmware_args *args) {
  3.   UNUSED(td);
  4.   UNUSED(args);
  5.  
  6.   void *kernel_base;
  7.   uint8_t *kernel_ptr;
  8.  
  9.   uint8_t *kmem;
  10.   uint8_t *dynlib_patch_1;
  11.   uint8_t *dynlib_patch_2;
  12.  
  13.   kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-0x000001C0];
  14.   kernel_ptr = (uint8_t *)kernel_base;
  15.   dynlib_patch_1 = &kernel_ptr[0x004523C4];
  16.   dynlib_patch_2 = &kernel_ptr[0x00029A30];
  17.  
  18.   uint64_t cr0 = readCr0();
  19.   writeCr0(cr0 & ~X86_CR0_WP);
  20.  
  21.   kmem = (uint8_t *)dynlib_patch_1;
  22.   kmem[0] = 0x90;
  23.   kmem[1] = 0xE9;
  24.  
  25.   kmem = (uint8_t *)dynlib_patch_2;
  26.   kmem[0] = 0x48;
  27.   kmem[1] = 0x31;
  28.   kmem[2] = 0xC0;
  29.   kmem[3] = 0xC3;
  30.  
  31.   writeCr0(cr0);
  32.  
  33.   return 0;
  34. }
  35.  
  36. int dynlib_patch() {
  37.   struct kpayload_firmware_info kpayload_firmware_info;
  38.   kpayload_firmware_info.fw_version = 0;
  39.   return kexec(&kpayload_dynlib_patch, &kpayload_firmware_info);
  40. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement