From c86daacda869395d15f31cc8b2d778186d483e0e Mon Sep 17 00:00:00 2001 From: de4dot Date: Thu, 22 Dec 2011 17:40:21 +0100 Subject: [PATCH] Add workaround for DNR patch bug --- .../deobfuscators/dotNET_Reactor/v3/DecrypterType.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/de4dot.code/deobfuscators/dotNET_Reactor/v3/DecrypterType.cs b/de4dot.code/deobfuscators/dotNET_Reactor/v3/DecrypterType.cs index be2211fd..f0544c3d 100644 --- a/de4dot.code/deobfuscators/dotNET_Reactor/v3/DecrypterType.cs +++ b/de4dot.code/deobfuscators/dotNET_Reactor/v3/DecrypterType.cs @@ -166,6 +166,7 @@ namespace de4dot.code.deobfuscators.dotNET_Reactor.v3 { uint numPatches = peImage.offsetReadUInt32(peImage.ImageLength - 4); uint offset = checked(peImage.ImageLength - 4 - numPatches * 8); + bool startedPatchingBadData = false; for (uint i = 0; i < numPatches; i++, offset += 8) { uint rva = getValue(peImage.offsetReadUInt32(offset)); var value = peImage.offsetReadUInt32(offset + 4); @@ -179,7 +180,12 @@ namespace de4dot.code.deobfuscators.dotNET_Reactor.v3 { else value = getValue(value); - peImage.dotNetSafeWrite(rva, BitConverter.GetBytes(value)); + // Seems there's a bug in their code where they sometimes overwrite valid data + // with invalid data. + if (startedPatchingBadData && value == 0x3115) + continue; + + startedPatchingBadData |= peImage.dotNetSafeWrite(rva, BitConverter.GetBytes(value)); } return true;