From d6e7740ad6bab0f5a0d34a96561d80ccbafd6073 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 30 Aug 2023 17:17:55 +0100 Subject: [PATCH] Don't corrupt instruction if map offset is too large --- frida_mode/src/instrument/instrument_arm64.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/frida_mode/src/instrument/instrument_arm64.c b/frida_mode/src/instrument/instrument_arm64.c index 2256f941..a0c66697 100644 --- a/frida_mode/src/instrument/instrument_arm64.c +++ b/frida_mode/src/instrument/instrument_arm64.c @@ -402,6 +402,18 @@ bool instrument_write_inline(GumArm64Writer *cw, GumAddress code_addr, } + /* + * The mov instruction supports up to a 16-bit offset. If our offset is out of + * range, then it can end up clobbering the op-code portion of the instruction + * rather than just the operands. So return false and fall back to the + * alternative instrumentation. + */ + if (area_offset > UINT16_MAX) { + + return false; + + } + code.code.mov_x0_curr_loc |= area_offset << 5; if (!instrument_patch_ardp(