Shrink shellcode a little more
This commit is contained in:
@@ -27,7 +27,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|||||||
- Only run kernel exploit once by checking setuid by @JTAG7371
|
- Only run kernel exploit once by checking setuid by @JTAG7371
|
||||||
- ~~Restore syscall 661 (`sys_aio_submit()`) after patching by @janisslsm~~
|
- ~~Restore syscall 661 (`sys_aio_submit()`) after patching by @janisslsm~~
|
||||||
- Was not actually restoring syscall. Used a different method/rewrote to
|
- Was not actually restoring syscall. Used a different method/rewrote to
|
||||||
restore in kpatch.
|
restore in kpatch. (Shellcode change 4)
|
||||||
- Shellcode from 345 bytes to 444 bytes
|
- Shellcode from 345 bytes to 444 bytes
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
@@ -39,11 +39,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|||||||
- Simplify shellcode a little bit more
|
- Simplify shellcode a little bit more
|
||||||
- No external headers
|
- No external headers
|
||||||
- Added `-fcf-protection=none` flag to skip added "endbr64" instructions
|
- Added `-fcf-protection=none` flag to skip added "endbr64" instructions
|
||||||
|
(Shellcode change 1)
|
||||||
- 307 bytes to 295 bytes
|
- 307 bytes to 295 bytes
|
||||||
- Changed `restore` and `do_patch` to be inlined
|
- Changed `restore` and `do_patch` to be inlined (Shellcode change 2)
|
||||||
- 307 bytes to 282 bytes
|
- 307 bytes to 282 bytes
|
||||||
- Changed to `-03` for execution speed optimization
|
- Changed to `-03` for execution speed optimization (Shellcode change 3)
|
||||||
- 282 bytes to 345 bytes
|
- 282 bytes to 345 bytes
|
||||||
|
- Move kbase calc to main function (Shellcode change 5)
|
||||||
|
- 444 bytes to 418 bytes
|
||||||
|
|
||||||
## [1.5.1] - 2025-05-12
|
## [1.5.1] - 2025-05-12
|
||||||
|
|
||||||
|
|||||||
@@ -29,18 +29,22 @@ struct kexec_args {
|
|||||||
u64 arg5;
|
u64 arg5;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline void restore(struct kexec_args *uap);
|
static inline void restore(void *kbase, struct kexec_args *uap);
|
||||||
static inline void do_patch(void);
|
static inline void do_patch(void *kbase);
|
||||||
|
|
||||||
__attribute__((section (".text.start")))
|
__attribute__((section (".text.start")))
|
||||||
int kpatch(void *td, struct kexec_args *uap) {
|
int kpatch(void *td, struct kexec_args *uap) {
|
||||||
do_patch();
|
const u64 xfast_syscall_off = 0x1c0;
|
||||||
restore(uap);
|
void * const kbase = (void *)rdmsr(0xc0000082) - xfast_syscall_off;
|
||||||
|
|
||||||
|
do_patch(kbase);
|
||||||
|
restore(kbase, uap);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((always_inline))
|
__attribute__((always_inline))
|
||||||
static inline void restore(struct kexec_args *uap) {
|
static inline void restore(void *kbase, struct kexec_args *uap) {
|
||||||
u8 *pipe = uap->arg1;
|
u8 *pipe = uap->arg1;
|
||||||
u8 *pipebuf = uap->arg2;
|
u8 *pipebuf = uap->arg2;
|
||||||
for (int i = 0; i < 0x18; i++) {
|
for (int i = 0; i < 0x18; i++) {
|
||||||
@@ -51,10 +55,6 @@ static inline void restore(struct kexec_args *uap) {
|
|||||||
u64 *pktinfo_field2 = uap->arg4;
|
u64 *pktinfo_field2 = uap->arg4;
|
||||||
*pktinfo_field2 = 0;
|
*pktinfo_field2 = 0;
|
||||||
|
|
||||||
// get kernel base
|
|
||||||
const u64 xfast_syscall_off = 0x1c0;
|
|
||||||
void * const kbase = (void *)rdmsr(0xc0000082) - xfast_syscall_off;
|
|
||||||
|
|
||||||
u64 *sysent_661_save = uap->arg5;
|
u64 *sysent_661_save = uap->arg5;
|
||||||
for (int i = 0; i < 0x30; i += 8) {
|
for (int i = 0; i < 0x30; i += 8) {
|
||||||
write64(kbase, 0x112d250 + i, sysent_661_save[i / 8]);
|
write64(kbase, 0x112d250 + i, sysent_661_save[i / 8]);
|
||||||
@@ -62,11 +62,7 @@ static inline void restore(struct kexec_args *uap) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((always_inline))
|
__attribute__((always_inline))
|
||||||
static inline void do_patch(void) {
|
static inline void do_patch(void *kbase) {
|
||||||
// get kernel base
|
|
||||||
const u64 xfast_syscall_off = 0x1c0;
|
|
||||||
void * const kbase = (void *)rdmsr(0xc0000082) - xfast_syscall_off;
|
|
||||||
|
|
||||||
disable_cr0_wp();
|
disable_cr0_wp();
|
||||||
|
|
||||||
// ChendoChap's patches from pOOBs4
|
// ChendoChap's patches from pOOBs4
|
||||||
|
|||||||
@@ -29,18 +29,22 @@ struct kexec_args {
|
|||||||
u64 arg5;
|
u64 arg5;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline void restore(struct kexec_args *uap);
|
static inline void restore(void *kbase, struct kexec_args *uap);
|
||||||
static inline void do_patch(void);
|
static inline void do_patch(void *kbase);
|
||||||
|
|
||||||
__attribute__((section (".text.start")))
|
__attribute__((section (".text.start")))
|
||||||
int kpatch(void *td, struct kexec_args *uap) {
|
int kpatch(void *td, struct kexec_args *uap) {
|
||||||
do_patch();
|
const u64 xfast_syscall_off = 0x1c0;
|
||||||
restore(uap);
|
void * const kbase = (void *)rdmsr(0xc0000082) - xfast_syscall_off;
|
||||||
|
|
||||||
|
do_patch(kbase);
|
||||||
|
restore(kbase, uap);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((always_inline))
|
__attribute__((always_inline))
|
||||||
static inline void restore(struct kexec_args *uap) {
|
static inline void restore(void *kbase, struct kexec_args *uap) {
|
||||||
u8 *pipe = uap->arg1;
|
u8 *pipe = uap->arg1;
|
||||||
u8 *pipebuf = uap->arg2;
|
u8 *pipebuf = uap->arg2;
|
||||||
for (int i = 0; i < 0x18; i++) {
|
for (int i = 0; i < 0x18; i++) {
|
||||||
@@ -51,10 +55,6 @@ static inline void restore(struct kexec_args *uap) {
|
|||||||
u64 *pktinfo_field2 = uap->arg4;
|
u64 *pktinfo_field2 = uap->arg4;
|
||||||
*pktinfo_field2 = 0;
|
*pktinfo_field2 = 0;
|
||||||
|
|
||||||
// get kernel base
|
|
||||||
const u64 xfast_syscall_off = 0x1c0;
|
|
||||||
void * const kbase = (void *)rdmsr(0xc0000082) - xfast_syscall_off;
|
|
||||||
|
|
||||||
u64 *sysent_661_save = uap->arg5;
|
u64 *sysent_661_save = uap->arg5;
|
||||||
for (int i = 0; i < 0x30; i += 8) {
|
for (int i = 0; i < 0x30; i += 8) {
|
||||||
write64(kbase, 0x1129f30 + i, sysent_661_save[i / 8]);
|
write64(kbase, 0x1129f30 + i, sysent_661_save[i / 8]);
|
||||||
@@ -62,11 +62,7 @@ static inline void restore(struct kexec_args *uap) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((always_inline))
|
__attribute__((always_inline))
|
||||||
static inline void do_patch(void) {
|
static inline void do_patch(void *kbase) {
|
||||||
// get kernel base
|
|
||||||
const u64 xfast_syscall_off = 0x1c0;
|
|
||||||
void * const kbase = (void *)rdmsr(0xc0000082) - xfast_syscall_off;
|
|
||||||
|
|
||||||
disable_cr0_wp();
|
disable_cr0_wp();
|
||||||
|
|
||||||
// ChendoChap's patches from pOOBs4
|
// ChendoChap's patches from pOOBs4
|
||||||
|
|||||||
@@ -29,18 +29,22 @@ struct kexec_args {
|
|||||||
u64 arg5;
|
u64 arg5;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline void restore(struct kexec_args *uap);
|
static inline void restore(void *kbase, struct kexec_args *uap);
|
||||||
static inline void do_patch(void);
|
static inline void do_patch(void *kbase);
|
||||||
|
|
||||||
__attribute__((section (".text.start")))
|
__attribute__((section (".text.start")))
|
||||||
int kpatch(void *td, struct kexec_args *uap) {
|
int kpatch(void *td, struct kexec_args *uap) {
|
||||||
do_patch();
|
const u64 xfast_syscall_off = 0x1c0;
|
||||||
restore(uap);
|
void * const kbase = (void *)rdmsr(0xc0000082) - xfast_syscall_off;
|
||||||
|
|
||||||
|
do_patch(kbase);
|
||||||
|
restore(kbase, uap);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((always_inline))
|
__attribute__((always_inline))
|
||||||
static inline void restore(struct kexec_args *uap) {
|
static inline void restore(void *kbase, struct kexec_args *uap) {
|
||||||
u8 *pipe = uap->arg1;
|
u8 *pipe = uap->arg1;
|
||||||
u8 *pipebuf = uap->arg2;
|
u8 *pipebuf = uap->arg2;
|
||||||
for (int i = 0; i < 0x18; i++) {
|
for (int i = 0; i < 0x18; i++) {
|
||||||
@@ -51,10 +55,6 @@ static inline void restore(struct kexec_args *uap) {
|
|||||||
u64 *pktinfo_field2 = uap->arg4;
|
u64 *pktinfo_field2 = uap->arg4;
|
||||||
*pktinfo_field2 = 0;
|
*pktinfo_field2 = 0;
|
||||||
|
|
||||||
// get kernel base
|
|
||||||
const u64 xfast_syscall_off = 0x1c0;
|
|
||||||
void * const kbase = (void *)rdmsr(0xc0000082) - xfast_syscall_off;
|
|
||||||
|
|
||||||
u64 *sysent_661_save = uap->arg5;
|
u64 *sysent_661_save = uap->arg5;
|
||||||
for (int i = 0; i < 0x30; i += 8) {
|
for (int i = 0; i < 0x30; i += 8) {
|
||||||
write64(kbase, 0x11040c0 + i, sysent_661_save[i / 8]);
|
write64(kbase, 0x11040c0 + i, sysent_661_save[i / 8]);
|
||||||
@@ -62,11 +62,7 @@ static inline void restore(struct kexec_args *uap) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((always_inline))
|
__attribute__((always_inline))
|
||||||
static inline void do_patch(void) {
|
static inline void do_patch(void *kbase) {
|
||||||
// get kernel base
|
|
||||||
const u64 xfast_syscall_off = 0x1c0;
|
|
||||||
void * const kbase = (void *)rdmsr(0xc0000082) - xfast_syscall_off;
|
|
||||||
|
|
||||||
disable_cr0_wp();
|
disable_cr0_wp();
|
||||||
|
|
||||||
// ChendoChap's patches from pOOBs4
|
// ChendoChap's patches from pOOBs4
|
||||||
|
|||||||
@@ -29,18 +29,22 @@ struct kexec_args {
|
|||||||
u64 arg5;
|
u64 arg5;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline void restore(struct kexec_args *uap);
|
static inline void restore(void *kbase, struct kexec_args *uap);
|
||||||
static inline void do_patch(void);
|
static inline void do_patch(void *kbase);
|
||||||
|
|
||||||
__attribute__((section (".text.start")))
|
__attribute__((section (".text.start")))
|
||||||
int kpatch(void *td, struct kexec_args *uap) {
|
int kpatch(void *td, struct kexec_args *uap) {
|
||||||
do_patch();
|
const u64 xfast_syscall_off = 0x1c0;
|
||||||
restore(uap);
|
void * const kbase = (void *)rdmsr(0xc0000082) - xfast_syscall_off;
|
||||||
|
|
||||||
|
do_patch(kbase);
|
||||||
|
restore(kbase, uap);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((always_inline))
|
__attribute__((always_inline))
|
||||||
static inline void restore(struct kexec_args *uap) {
|
static inline void restore(void *kbase, struct kexec_args *uap) {
|
||||||
u8 *pipe = uap->arg1;
|
u8 *pipe = uap->arg1;
|
||||||
u8 *pipebuf = uap->arg2;
|
u8 *pipebuf = uap->arg2;
|
||||||
for (int i = 0; i < 0x18; i++) {
|
for (int i = 0; i < 0x18; i++) {
|
||||||
@@ -51,11 +55,6 @@ static inline void restore(struct kexec_args *uap) {
|
|||||||
u64 *pktinfo_field2 = uap->arg4;
|
u64 *pktinfo_field2 = uap->arg4;
|
||||||
*pktinfo_field2 = 0;
|
*pktinfo_field2 = 0;
|
||||||
|
|
||||||
// get kernel base
|
|
||||||
const u64 xfast_syscall_off = 0x1c0;
|
|
||||||
void * const kbase = (void *)rdmsr(0xc0000082) - xfast_syscall_off;
|
|
||||||
|
|
||||||
|
|
||||||
u64 *sysent_661_save = uap->arg5;
|
u64 *sysent_661_save = uap->arg5;
|
||||||
for (int i = 0; i < 0x30; i += 8) {
|
for (int i = 0; i < 0x30; i += 8) {
|
||||||
write64(kbase, 0x11041b0 + i, sysent_661_save[i / 8]);
|
write64(kbase, 0x11041b0 + i, sysent_661_save[i / 8]);
|
||||||
@@ -63,11 +62,7 @@ static inline void restore(struct kexec_args *uap) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((always_inline))
|
__attribute__((always_inline))
|
||||||
static inline void do_patch(void) {
|
static inline void do_patch(void *kbase) {
|
||||||
// get kernel base
|
|
||||||
const u64 xfast_syscall_off = 0x1c0;
|
|
||||||
void * const kbase = (void *)rdmsr(0xc0000082) - xfast_syscall_off;
|
|
||||||
|
|
||||||
disable_cr0_wp();
|
disable_cr0_wp();
|
||||||
|
|
||||||
// ChendoChap's patches from pOOBs4
|
// ChendoChap's patches from pOOBs4
|
||||||
|
|||||||
@@ -29,18 +29,22 @@ struct kexec_args {
|
|||||||
u64 arg5;
|
u64 arg5;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline void restore(struct kexec_args *uap);
|
static inline void restore(void *kbase, struct kexec_args *uap);
|
||||||
static inline void do_patch(void);
|
static inline void do_patch(void *kbase);
|
||||||
|
|
||||||
__attribute__((section (".text.start")))
|
__attribute__((section (".text.start")))
|
||||||
int kpatch(void *td, struct kexec_args *uap) {
|
int kpatch(void *td, struct kexec_args *uap) {
|
||||||
do_patch();
|
const u64 xfast_syscall_off = 0x1c0;
|
||||||
restore(uap);
|
void * const kbase = (void *)rdmsr(0xc0000082) - xfast_syscall_off;
|
||||||
|
|
||||||
|
do_patch(kbase);
|
||||||
|
restore(kbase, uap);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((always_inline))
|
__attribute__((always_inline))
|
||||||
static inline void restore(struct kexec_args *uap) {
|
static inline void restore(void *kbase, struct kexec_args *uap) {
|
||||||
u8 *pipe = uap->arg1;
|
u8 *pipe = uap->arg1;
|
||||||
u8 *pipebuf = uap->arg2;
|
u8 *pipebuf = uap->arg2;
|
||||||
for (int i = 0; i < 0x18; i++) {
|
for (int i = 0; i < 0x18; i++) {
|
||||||
@@ -51,10 +55,6 @@ static inline void restore(struct kexec_args *uap) {
|
|||||||
u64 *pktinfo_field2 = uap->arg4;
|
u64 *pktinfo_field2 = uap->arg4;
|
||||||
*pktinfo_field2 = 0;
|
*pktinfo_field2 = 0;
|
||||||
|
|
||||||
// get kernel base
|
|
||||||
const u64 xfast_syscall_off = 0x1c0;
|
|
||||||
void * const kbase = (void *)rdmsr(0xc0000082) - xfast_syscall_off;
|
|
||||||
|
|
||||||
u64 *sysent_661_save = uap->arg5;
|
u64 *sysent_661_save = uap->arg5;
|
||||||
for (int i = 0; i < 0x30; i += 8) {
|
for (int i = 0; i < 0x30; i += 8) {
|
||||||
write64(kbase, 0x1107f00 + i, sysent_661_save[i / 8]);
|
write64(kbase, 0x1107f00 + i, sysent_661_save[i / 8]);
|
||||||
@@ -62,11 +62,7 @@ static inline void restore(struct kexec_args *uap) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((always_inline))
|
__attribute__((always_inline))
|
||||||
static inline void do_patch(void) {
|
static inline void do_patch(void *kbase) {
|
||||||
// get kernel base
|
|
||||||
const u64 xfast_syscall_off = 0x1c0;
|
|
||||||
void * const kbase = (void *)rdmsr(0xc0000082) - xfast_syscall_off;
|
|
||||||
|
|
||||||
disable_cr0_wp();
|
disable_cr0_wp();
|
||||||
|
|
||||||
// ChendoChap's patches from pOOBs4
|
// ChendoChap's patches from pOOBs4
|
||||||
|
|||||||
@@ -29,18 +29,22 @@ struct kexec_args {
|
|||||||
u64 arg5;
|
u64 arg5;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline void restore(struct kexec_args *uap);
|
static inline void restore(void *kbase, struct kexec_args *uap);
|
||||||
static inline void do_patch(void);
|
static inline void do_patch(void *kbase);
|
||||||
|
|
||||||
__attribute__((section (".text.start")))
|
__attribute__((section (".text.start")))
|
||||||
int kpatch(void *td, struct kexec_args *uap) {
|
int kpatch(void *td, struct kexec_args *uap) {
|
||||||
do_patch();
|
const u64 xfast_syscall_off = 0x1c0;
|
||||||
restore(uap);
|
void * const kbase = (void *)rdmsr(0xc0000082) - xfast_syscall_off;
|
||||||
|
|
||||||
|
do_patch(kbase);
|
||||||
|
restore(kbase, uap);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((always_inline))
|
__attribute__((always_inline))
|
||||||
static inline void restore(struct kexec_args *uap) {
|
static inline void restore(void *kbase, struct kexec_args *uap) {
|
||||||
u8 *pipe = uap->arg1;
|
u8 *pipe = uap->arg1;
|
||||||
u8 *pipebuf = uap->arg2;
|
u8 *pipebuf = uap->arg2;
|
||||||
for (int i = 0; i < 0x18; i++) {
|
for (int i = 0; i < 0x18; i++) {
|
||||||
@@ -51,10 +55,6 @@ static inline void restore(struct kexec_args *uap) {
|
|||||||
u64 *pktinfo_field2 = uap->arg4;
|
u64 *pktinfo_field2 = uap->arg4;
|
||||||
*pktinfo_field2 = 0;
|
*pktinfo_field2 = 0;
|
||||||
|
|
||||||
// get kernel base
|
|
||||||
const u64 xfast_syscall_off = 0x1c0;
|
|
||||||
void * const kbase = (void *)rdmsr(0xc0000082) - xfast_syscall_off;
|
|
||||||
|
|
||||||
u64 *sysent_661_save = uap->arg5;
|
u64 *sysent_661_save = uap->arg5;
|
||||||
for (int i = 0; i < 0x30; i += 8) {
|
for (int i = 0; i < 0x30; i += 8) {
|
||||||
write64(kbase, 0x1103f00 + i, sysent_661_save[i / 8]);
|
write64(kbase, 0x1103f00 + i, sysent_661_save[i / 8]);
|
||||||
@@ -62,11 +62,7 @@ static inline void restore(struct kexec_args *uap) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((always_inline))
|
__attribute__((always_inline))
|
||||||
static inline void do_patch(void) {
|
static inline void do_patch(void *kbase) {
|
||||||
// get kernel base
|
|
||||||
const u64 xfast_syscall_off = 0x1c0;
|
|
||||||
void * const kbase = (void *)rdmsr(0xc0000082) - xfast_syscall_off;
|
|
||||||
|
|
||||||
disable_cr0_wp();
|
disable_cr0_wp();
|
||||||
|
|
||||||
// ChendoChap's patches from pOOBs4
|
// ChendoChap's patches from pOOBs4
|
||||||
|
|||||||
@@ -29,18 +29,22 @@ struct kexec_args {
|
|||||||
u64 arg5;
|
u64 arg5;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline void restore(struct kexec_args *uap);
|
static inline void restore(void *kbase, struct kexec_args *uap);
|
||||||
static inline void do_patch(void);
|
static inline void do_patch(void *kbase);
|
||||||
|
|
||||||
__attribute__((section (".text.start")))
|
__attribute__((section (".text.start")))
|
||||||
int kpatch(void *td, struct kexec_args *uap) {
|
int kpatch(void *td, struct kexec_args *uap) {
|
||||||
do_patch();
|
const u64 xfast_syscall_off = 0x1c0;
|
||||||
restore(uap);
|
void * const kbase = (void *)rdmsr(0xc0000082) - xfast_syscall_off;
|
||||||
|
|
||||||
|
do_patch(kbase);
|
||||||
|
restore(kbase, uap);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((always_inline))
|
__attribute__((always_inline))
|
||||||
static inline void restore(struct kexec_args *uap) {
|
static inline void restore(void *kbase, struct kexec_args *uap) {
|
||||||
u8 *pipe = uap->arg1;
|
u8 *pipe = uap->arg1;
|
||||||
u8 *pipebuf = uap->arg2;
|
u8 *pipebuf = uap->arg2;
|
||||||
for (int i = 0; i < 0x18; i++) {
|
for (int i = 0; i < 0x18; i++) {
|
||||||
@@ -51,10 +55,6 @@ static inline void restore(struct kexec_args *uap) {
|
|||||||
u64 *pktinfo_field2 = uap->arg4;
|
u64 *pktinfo_field2 = uap->arg4;
|
||||||
*pktinfo_field2 = 0;
|
*pktinfo_field2 = 0;
|
||||||
|
|
||||||
// get kernel base
|
|
||||||
const u64 xfast_syscall_off = 0x1c0;
|
|
||||||
void * const kbase = (void *)rdmsr(0xc0000082) - xfast_syscall_off;
|
|
||||||
|
|
||||||
u64 *sysent_661_save = uap->arg5;
|
u64 *sysent_661_save = uap->arg5;
|
||||||
for (int i = 0; i < 0x30; i += 8) {
|
for (int i = 0; i < 0x30; i += 8) {
|
||||||
write64(kbase, 0x1100ee0 + i, sysent_661_save[i / 8]);
|
write64(kbase, 0x1100ee0 + i, sysent_661_save[i / 8]);
|
||||||
@@ -62,11 +62,7 @@ static inline void restore(struct kexec_args *uap) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((always_inline))
|
__attribute__((always_inline))
|
||||||
static inline void do_patch(void) {
|
static inline void do_patch(void *kbase) {
|
||||||
// get kernel base
|
|
||||||
const u64 xfast_syscall_off = 0x1c0;
|
|
||||||
void * const kbase = (void *)rdmsr(0xc0000082) - xfast_syscall_off;
|
|
||||||
|
|
||||||
disable_cr0_wp();
|
disable_cr0_wp();
|
||||||
|
|
||||||
// ChendoChap's patches from pOOBs4
|
// ChendoChap's patches from pOOBs4
|
||||||
|
|||||||
Reference in New Issue
Block a user