Skip to content

Commit b08831c

Browse files
bmax121bmax
andauthored
refix bti (#38)
* refix bti --------- Co-authored-by: bmax <bmax@placeholder.com>
1 parent e21b75d commit b08831c

File tree

5 files changed

+42
-37
lines changed

5 files changed

+42
-37
lines changed

kernel/base/fphook.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -281,8 +281,7 @@ KP_EXPORT_SYMBOL(fp_hook_wrap);
281281

282282
void fp_hook_unwrap(uintptr_t fp_addr, void *before, void *after)
283283
{
284-
uint64_t origin = branch_func_addr(fp_addr);
285-
fp_hook_chain_t *chain = (fp_hook_chain_t *)hook_get_mem_from_origin(origin);
284+
fp_hook_chain_t *chain = (fp_hook_chain_t *)hook_get_mem_from_origin(fp_addr);
286285
if (!chain) return;
287286
for (int i = 0; i < FP_HOOK_CHAIN_NUM; i++) {
288287
if (chain->states[i] == CHAIN_ITEM_STATE_READY)

kernel/base/hook.c

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -280,8 +280,6 @@ int32_t branch_relative(uint32_t *buf, uint64_t src_addr, uint64_t dst_addr)
280280
buf[1] = ARM64_NOP;
281281
return 2;
282282
}
283-
// todo: add bit c or bit cj here
284-
// d503245f bti c
285283
return 0;
286284
}
287285
KP_EXPORT_SYMBOL(branch_relative);
@@ -292,19 +290,28 @@ int32_t branch_absolute(uint32_t *buf, uint64_t addr)
292290
buf[1] = 0xd61f0220; // BR X17
293291
buf[2] = addr & 0xFFFFFFFF;
294292
buf[3] = addr >> 32u;
295-
// todo: add bit c or bit cj here
296-
// d503245f bti c
297293
return 4;
298294
}
299295
KP_EXPORT_SYMBOL(branch_absolute);
300296

297+
int32_t ret_absolute(uint32_t *buf, uint64_t addr)
298+
{
299+
buf[0] = 0x58000051; // LDR X17, #8
300+
buf[1] = 0xd65f0220; // RET X17
301+
buf[2] = addr & 0xFFFFFFFF;
302+
buf[3] = addr >> 32u;
303+
return 4;
304+
}
305+
KP_EXPORT_SYMBOL(ret_absolute);
306+
301307
int32_t branch_from_to(uint32_t *tramp_buf, uint64_t src_addr, uint64_t dst_addr)
302308
{
303-
#if 1
309+
#if 0
304310
uint32_t len = branch_relative(tramp_buf, src_addr, dst_addr);
305311
if (len) return len;
306312
#endif
307-
return branch_absolute(tramp_buf, dst_addr);
313+
// return branch_absolute(tramp_buf, dst_addr);
314+
return ret_absolute(tramp_buf, dst_addr);
308315
}
309316
KP_EXPORT_SYMBOL(branch_from_to);
310317

@@ -571,8 +578,7 @@ void hook_install(hook_t *hook)
571578
*((uint32_t *)hook->origin_addr + i) = hook->tramp_insts[i];
572579
}
573580
flush_icache_all();
574-
// todo: this is temporary fix for bit
575-
*entry = ori_prot & 0xFFFBFFFFFFFFFFFF;
581+
*entry = ori_prot;
576582
flush_tlb_kernel_page(va);
577583
}
578584
KP_EXPORT_SYMBOL(hook_install);

kernel/include/hook.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,7 @@ typedef struct _fphook_chain
232232
int32_t branch_from_to(uint32_t *tramp_buf, uint64_t src_addr, uint64_t dst_addr);
233233
int32_t branch_relative(uint32_t *buf, uint64_t src_addr, uint64_t dst_addr);
234234
int32_t branch_absolute(uint32_t *buf, uint64_t addr);
235+
int32_t ret_absolute(uint32_t *buf, uint64_t addr);
235236

236237
#ifdef HOOK_INTO_BRANCH_FUNC
237238
uint64_t branch_func_addr(uint64_t addr);

kernel/patch/patch.c

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -46,45 +46,45 @@ void before_panic(hook_fargs12_t *args, void *udata)
4646

4747
static void before_rest_init(hook_fargs4_t *args, void *udata)
4848
{
49-
int err = 0;
49+
int rc = 0;
5050
log_boot("entering init ...\n");
5151

52-
if ((err = linux_sybmol_len_init())) goto out;
53-
log_boot("linux_sybmol_len_init done: %d\n", err);
52+
if ((rc = linux_sybmol_len_init())) goto out;
53+
log_boot("linux_sybmol_len_init done: %d\n", rc);
5454

55-
if ((err = linux_libs_symbol_init())) goto out;
56-
log_boot("linux_libs_symbol_init done: %d\n", err);
55+
if ((rc = linux_libs_symbol_init())) goto out;
56+
log_boot("linux_libs_symbol_init done: %d\n", rc);
5757

58-
if ((err = linux_misc_symbol_init())) goto out;
59-
log_boot("linux_misc_symbol_init done: %d\n", err);
58+
if ((rc = linux_misc_symbol_init())) goto out;
59+
log_boot("linux_misc_symbol_init done: %d\n", rc);
6060

61-
if ((err = bypass_kcfi())) goto out;
62-
log_boot("bypass_kcfi done: %d\n", err);
61+
if ((rc = bypass_kcfi())) goto out;
62+
log_boot("bypass_kcfi done: %d\n", rc);
6363

64-
if ((err = syscall_init())) goto out;
65-
log_boot("syscall_init done: %d\n", err);
64+
if ((rc = syscall_init())) goto out;
65+
log_boot("syscall_init done: %d\n", rc);
6666

67-
if ((err = resolve_struct())) goto out;
68-
log_boot("resolve_struct done: %d\n", err);
67+
if ((rc = resolve_struct())) goto out;
68+
log_boot("resolve_struct done: %d\n", rc);
6969

70-
if ((err = task_observer())) goto out;
71-
log_boot("task_observer done: %d\n", err);
70+
if ((rc = task_observer())) goto out;
71+
log_boot("task_observer done: %d\n", rc);
7272

73-
if ((err = selinux_hook_install())) goto out;
74-
log_boot("selinux_hook_install done: %d\n", err);
73+
if ((rc = selinux_hook_install())) goto out;
74+
log_boot("selinux_hook_install done: %d\n", rc);
7575

76-
if ((err = module_init())) goto out;
77-
log_boot("module_init done: %d\n", err);
76+
if ((rc = module_init())) goto out;
77+
log_boot("module_init done: %d\n", rc);
7878

79-
if ((err = supercall_install())) goto out;
80-
log_boot("supercall_install done: %d\n", err);
79+
if ((rc = supercall_install())) goto out;
80+
log_boot("supercall_install done: %d\n", rc);
8181

8282
#ifdef ANDROID
83-
if ((err = kpuserd_init())) goto out;
84-
log_boot("kpuserd_init done: %d\n", err);
83+
if ((rc = kpuserd_init())) goto out;
84+
log_boot("kpuserd_init done: %d\n", rc);
8585

86-
if ((err = su_compat_init())) goto out;
87-
log_boot("su_compat_init done: %d\n", err);
86+
if ((rc = su_compat_init())) goto out;
87+
log_boot("su_compat_init done: %d\n", rc);
8888
#endif
8989

9090
out:
@@ -106,7 +106,6 @@ int patch()
106106
int rc = 0;
107107

108108
unsigned long panic_addr = get_preset_patch_sym()->panic;
109-
logkd("panic: %llx\n", panic_addr);
110109
if (panic_addr) {
111110
hook_err_t err = hook_wrap12((void *)panic_addr, before_panic, 0, 0);
112111
if (err) {

version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
#define MAJOR 0
22
#define MINOR 8
3-
#define PATCH 3
3+
#define PATCH 4

0 commit comments

Comments
 (0)