Move patcher code to DecrypterType

This commit is contained in:
de4dot 2011-12-21 16:56:12 +01:00
parent ceca34e12c
commit 1fd7319b19
3 changed files with 44 additions and 44 deletions

View File

@ -22,6 +22,7 @@ using System.Collections.Generic;
using System.Text; using System.Text;
using Mono.Cecil; using Mono.Cecil;
using de4dot.blocks; using de4dot.blocks;
using de4dot.code.PE;
namespace de4dot.code.deobfuscators.dotNET_Reactor3 { namespace de4dot.code.deobfuscators.dotNET_Reactor3 {
// Find the type that decrypts strings and calls the native lib // Find the type that decrypts strings and calls the native lib
@ -133,5 +134,46 @@ namespace de4dot.code.deobfuscators.dotNET_Reactor3 {
public string decrypt2(string s) { public string decrypt2(string s) {
return Encoding.Unicode.GetString(Convert.FromBase64String(s)); return Encoding.Unicode.GetString(Convert.FromBase64String(s));
} }
public bool patch(PeImage peImage) {
try {
return patch2(peImage);
}
catch {
Log.w("Could not patch the file");
return false;
}
}
bool patch2(PeImage peImage) {
uint numPatches = peImage.offsetReadUInt32(peImage.ImageLength - 4);
uint offset = checked(peImage.ImageLength - 4 - numPatches * 8);
for (uint i = 0; i < numPatches; i++, offset += 8) {
uint rva = getValue(peImage.offsetReadUInt32(offset));
var value = peImage.offsetReadUInt32(offset + 4);
if (value == 4) {
i++;
offset += 8;
rva = getValue(peImage.offsetReadUInt32(offset));
value = peImage.offsetReadUInt32(offset + 4);
}
else
value = getValue(value);
peImage.dotNetSafeWrite(rva, BitConverter.GetBytes(value));
}
return true;
}
static uint getValue(uint value) {
const uint magic = 2749;
value = checked(value - magic);
if (value % 3 != 0)
throw new Exception();
return value / 3;
}
} }
} }

View File

@ -136,12 +136,12 @@ namespace de4dot.code.deobfuscators.dotNET_Reactor3 {
} }
public override bool getDecryptedModule(ref byte[] newFileData, ref Dictionary<uint, DumpedMethod> dumpedMethods) { public override bool getDecryptedModule(ref byte[] newFileData, ref Dictionary<uint, DumpedMethod> dumpedMethods) {
if (!nativeLibSaver.Detected) if (!decrypterType.Detected)
return false; return false;
var fileData = ModuleBytes ?? DeobUtils.readModule(module); var fileData = ModuleBytes ?? DeobUtils.readModule(module);
var peImage = new PeImage(fileData); var peImage = new PeImage(fileData);
if (!nativeLibSaver.patch(peImage)) if (!decrypterType.patch(peImage))
return false; return false;
newFileData = fileData; newFileData = fileData;

View File

@ -20,7 +20,6 @@
using System; using System;
using Mono.Cecil; using Mono.Cecil;
using de4dot.blocks; using de4dot.blocks;
using de4dot.code.PE;
namespace de4dot.code.deobfuscators.dotNET_Reactor3 { namespace de4dot.code.deobfuscators.dotNET_Reactor3 {
// Finds the type that saves the native lib (if in resources) to disk // Finds the type that saves the native lib (if in resources) to disk
@ -82,46 +81,5 @@ namespace de4dot.code.deobfuscators.dotNET_Reactor3 {
return; return;
} }
} }
public bool patch(PeImage peImage) {
try {
return patch2(peImage);
}
catch {
Log.w("Could not patch the file");
return false;
}
}
bool patch2(PeImage peImage) {
uint numPatches = peImage.offsetReadUInt32(peImage.ImageLength - 4);
uint offset = checked(peImage.ImageLength - 4 - numPatches * 8);
for (uint i = 0; i < numPatches; i++, offset += 8) {
uint rva = getValue(peImage.offsetReadUInt32(offset));
var value = peImage.offsetReadUInt32(offset + 4);
if (value == 4) {
i++;
offset += 8;
rva = getValue(peImage.offsetReadUInt32(offset));
value = peImage.offsetReadUInt32(offset + 4);
}
else
value = getValue(value);
peImage.dotNetSafeWrite(rva, BitConverter.GetBytes(value));
}
return true;
}
static uint getValue(uint value) {
const uint magic = 2749;
value = checked(value - magic);
if (value % 3 != 0)
throw new Exception();
return value / 3;
}
} }
} }