From d3443e9102306e0b9735b760ccb3e9e161c239b1 Mon Sep 17 00:00:00 2001 From: Boris Batteux Date: Thu, 25 Feb 2021 16:19:38 +0100 Subject: [PATCH] Handle cases where constant is accessed by address --- d810/optimizers/instructions/early/mem_read.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/d810/optimizers/instructions/early/mem_read.py b/d810/optimizers/instructions/early/mem_read.py index 43755e5..cb4be1f 100644 --- a/d810/optimizers/instructions/early/mem_read.py +++ b/d810/optimizers/instructions/early/mem_read.py @@ -63,11 +63,18 @@ class SetGlobalVariablesToZeroIfDetectedReadOnly(EarlyRule): return True def check_candidate(self, candidate): - if candidate["ro_dword"].mop.t != mop_v: - return False - mem_read_address = candidate["ro_dword"].mop.g - if not self.is_read_only_inited_var(mem_read_address): + mem_read_address = None + if candidate["ro_dword"].mop.t == mop_v: + mem_read_address = candidate["ro_dword"].mop.g + elif candidate["ro_dword"].mop.t == mop_a: + if candidate["ro_dword"].mop.a.t == mop_v: + mem_read_address = candidate["ro_dword"].mop.a.g + + if mem_read_address is None: return False + if not self.is_read_only_inited_var(mem_read_address): + return False candidate.add_constant_leaf("val_res", 0, candidate["ro_dword"].mop.size) return True +