diff --git a/irdb-libs/ir_builders/fix_calls.cpp b/irdb-libs/ir_builders/fix_calls.cpp index 519810db62da1a44544976240ef4fd7e622bbf37..ff650611c93dcec4287bf2c3b02ae671f3261f6c 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 68bab5b3aa27ff385ba45e3b893c8eac37eaa7cc..a716a283e64e32cbe7632d2b6902c35fd29a467a 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;