From c038638ea899d385db15c4d25e0cdce30350babd Mon Sep 17 00:00:00 2001 From: Jason Hiser <jdhiser@gmail.com> Date: Thu, 23 May 2019 07:13:21 -0400 Subject: [PATCH] minor fixes for instructions that are likely bogus (i.e., pcrel insns that access out-of-bounds memory) --- irdb-libs/ir_builders/fix_calls.cpp | 4 +++- irdb-libs/libIRDB-util/src/params.cpp | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/irdb-libs/ir_builders/fix_calls.cpp b/irdb-libs/ir_builders/fix_calls.cpp index 519810db6..ff650611c 100644 --- a/irdb-libs/ir_builders/fix_calls.cpp +++ b/irdb-libs/ir_builders/fix_calls.cpp @@ -844,7 +844,9 @@ class FixCalls_t : public TransformStep_t switch(size) { case 4: - assert( (uintptr_t)(int)newdisp == (uintptr_t)newdisp); + // if newdisp is negative (or bigger than 32-bit), then the instruction is accessing invalid memory. + // and is likely bogus. we just skip doing any pc-rel for it. + if( (uintptr_t)(int32_t)newdisp != (uintptr_t)newdisp) continue; *(int*)offsetptr=newdisp; break; case 1: diff --git a/irdb-libs/libIRDB-util/src/params.cpp b/irdb-libs/libIRDB-util/src/params.cpp index 68bab5b3a..a716a283e 100644 --- a/irdb-libs/libIRDB-util/src/params.cpp +++ b/irdb-libs/libIRDB-util/src/params.cpp @@ -70,9 +70,14 @@ bool IRDB_SDK::isParameterWrite(const IRDB_SDK::FileIR_t *firp, IRDB_SDK::Instru if(!d.getOperand(0)->isMemory()) return false; + // pcrel instructions aren't to the stack. + if(d.getOperand(0)->isPcrel()) + return false; + // check that base reg is esp. if(!d.getOperand(0)->hasBaseRegister()) return false; + if(d.getOperand(0)->getBaseRegister() != 4) return false; -- GitLab