Skip to content

Commit 7ec131a

Browse files
committed
added b/bl handling for arm64
1 parent 2c8fa0b commit 7ec131a

4 files changed

Lines changed: 21 additions & 4 deletions

File tree

src/tinyhook.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,13 @@ static inline void save_header(void **src, void **dst, int min_len) {
102102
}
103103
}
104104
}
105+
else if (((insn ^ 0x14000000) & 0xfc000000) == 0 || ((insn ^ 0x94000000) & 0xfc000000) == 0) {
106+
// b or bl
107+
bool link = insn >> 31;
108+
int32_t imm26 = (int32_t)(insn << 6) >> 6; // sign extend
109+
void *addr = *src + (imm26 << 2);
110+
*dst += calc_jump(*dst, *dst, addr, link);
111+
}
105112
else {
106113
*(uint32_t *)*dst = insn;
107114
*dst += 4;

test/hook/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
ARCH ?= $(shell uname -m)
22

33
CC := clang -arch $(ARCH)
4-
CFLAGS := -O0 -Wall -g # -fsanitize=address
4+
CFLAGS := -Os -Wall -g # -fsanitize=address
55
OBJCFLAGS := -framework Cocoa
66

77
OBJ := example.o main.o

test/hook/example.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,10 @@ int printf_interpose(const char *format, ...) {
2727
return res;
2828
}
2929

30+
int (*orig_add)(int a, int b);
3031
int fake_add(int a, int b) {
31-
fprintf(stderr, "=== calling fake_add with: %d, %d\n", a, b);
32+
fprintf(stderr, "=== calling add with: %d, %d\n", a, b);
33+
fprintf(stderr, "=== the return value is: %d\n", orig_add(a, b));
3234
return -1;
3335
}
3436

@@ -48,7 +50,7 @@ __attribute__((constructor(0))) int load() {
4850
// hook a function by symbol (in the SYMTAB)
4951
void *func_add = symtbl_solve(0, "_add");
5052
fprintf(stderr, "=== add() address: %p\n", func_add);
51-
tiny_hook(func_add, fake_add, NULL);
53+
tiny_hook(func_add, fake_add, &orig_add);
5254

5355
// hook system function
5456
fprintf(stderr, "=== Hooking printf\n");

test/hook/main.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,17 @@
11
#include <stdio.h>
22

3-
int add(int a, int b) {
3+
int add2(int a, int b) {
44
return a + b;
55
}
66

7+
__attribute__((naked)) int add(int a, int b) {
8+
#ifdef __arm64__
9+
asm volatile("b _add2");
10+
#elif __x86_64__
11+
asm volatile("call _add2");
12+
#endif
13+
}
14+
715
int main() {
816
int res = add(1, 2);
917
printf("1 + 2 = %d\n", res);

0 commit comments

Comments
 (0)