Don't remove string decrypter type if there's still code calling it
This commit is contained in:
parent
e18ff9aea1
commit
d7afc66c6d
|
@ -111,7 +111,7 @@ namespace de4dot.code.deobfuscators.Skater_NET {
|
|||
}
|
||||
|
||||
public override void deobfuscateEnd() {
|
||||
if (Operations.DecryptStrings != OpDecryptString.None)
|
||||
if (Operations.DecryptStrings != OpDecryptString.None && stringDecrypter.CanRemoveType)
|
||||
addTypeToBeRemoved(stringDecrypter.Type, "String decrypter type");
|
||||
|
||||
base.deobfuscateEnd();
|
||||
|
|
|
@ -35,11 +35,16 @@ namespace de4dot.code.deobfuscators.Skater_NET {
|
|||
byte[] key;
|
||||
byte[] iv;
|
||||
FieldDefinitionAndDeclaringTypeDict<string> fieldToDecryptedString = new FieldDefinitionAndDeclaringTypeDict<string>();
|
||||
bool canRemoveType;
|
||||
|
||||
public bool Detected {
|
||||
get { return decrypterType != null; }
|
||||
}
|
||||
|
||||
public bool CanRemoveType {
|
||||
get { return canRemoveType; }
|
||||
}
|
||||
|
||||
public TypeDefinition Type {
|
||||
get { return decrypterType; }
|
||||
}
|
||||
|
@ -58,6 +63,7 @@ namespace de4dot.code.deobfuscators.Skater_NET {
|
|||
continue;
|
||||
|
||||
if (checkType(type)) {
|
||||
canRemoveType = true;
|
||||
decrypterType = type;
|
||||
decrypterCctor = cctor;
|
||||
return;
|
||||
|
@ -221,17 +227,27 @@ namespace de4dot.code.deobfuscators.Skater_NET {
|
|||
var instrs = block.Instructions;
|
||||
for (int i = 0; i < instrs.Count; i++) {
|
||||
var instr = instrs[i];
|
||||
if (instr.OpCode.Code != Code.Ldsfld)
|
||||
continue;
|
||||
var field = instr.Operand as FieldReference;
|
||||
if (field == null)
|
||||
continue;
|
||||
var decrypted = fieldToDecryptedString.find(field);
|
||||
if (decrypted == null)
|
||||
continue;
|
||||
|
||||
instrs[i] = new Instr(Instruction.Create(OpCodes.Ldstr, decrypted));
|
||||
Log.v("Decrypted string: {0}", Utils.toCsharpString(decrypted));
|
||||
if (instr.OpCode.Code == Code.Call || instr.OpCode.Code == Code.Callvirt) {
|
||||
if (blocks.Method.DeclaringType == decrypterType)
|
||||
continue;
|
||||
var calledMethod = instr.Operand as MethodReference;
|
||||
if (calledMethod != null && calledMethod.DeclaringType == decrypterType)
|
||||
canRemoveType = false;
|
||||
}
|
||||
else if (instr.OpCode.Code == Code.Ldsfld) {
|
||||
if (instr.OpCode.Code != Code.Ldsfld)
|
||||
continue;
|
||||
var field = instr.Operand as FieldReference;
|
||||
if (field == null)
|
||||
continue;
|
||||
var decrypted = fieldToDecryptedString.find(field);
|
||||
if (decrypted == null)
|
||||
continue;
|
||||
|
||||
instrs[i] = new Instr(Instruction.Create(OpCodes.Ldstr, decrypted));
|
||||
Log.v("Decrypted string: {0}", Utils.toCsharpString(decrypted));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user