bool Deobfuscate2(Block block, int i) { var instrs = block.Instructions; if (i >= instrs.Count - 2) return false; var ldsfld = instrs[i]; if (ldsfld.OpCode.Code != Code.Ldsfld) return false; var info = arrayBlockState.GetFieldInfo(ldsfld.Operand as IField); if (info == null) return false; var ldci4 = instrs[i + 1]; if (!ldci4.IsLdcI4()) return false; var ldelem = instrs[i + 2]; if (!IsLdelem(info, ldelem.OpCode.Code)) return false; block.Remove(i, 3 - 1); instrs[i] = new Instr(Instruction.CreateLdcI4((int)info.ReadArrayElement(ldci4.GetLdcI4Value()))); return true; }
bool Deobfuscate3(Block block, int i) { var instrs = block.Instructions; if (i + 1 >= instrs.Count) return false; int start = i; var ldsfld = instrs[i]; if (ldsfld.OpCode.Code != Code.Ldsfld) return false; var info = arrayBlockState.GetFieldInfo(ldsfld.Operand as IField); if (info == null) return false; if (!instrs[i + 1].IsLdcI4()) return false; var constants = GetConstantsReader(block); int value; i += 2; if (!constants.GetInt32(ref i, out value)) return false; if (i >= instrs.Count) return false; var stelem = instrs[i]; if (!IsStelem(info, stelem.OpCode.Code)) return false; block.Remove(start, i - start + 1); return true; }
bool Deobfuscate1(Block block, int i) { var instrs = block.Instructions; if (i >= instrs.Count - 2) return false; var ldloc = instrs[i]; if (!ldloc.IsLdloc()) return false; var local = ldloc.Instruction.GetLocal(Blocks.Locals); if (local == null) return false; ArrayBlockState.FieldInfo info; if (!localToInfo.TryGetValue(local, out info)) return false; var ldci4 = instrs[i + 1]; if (!ldci4.IsLdcI4()) return false; var ldelem = instrs[i + 2]; if (!IsLdelem(info, ldelem.OpCode.Code)) return false; block.Remove(i, 3 - 1); instrs[i] = new Instr(Instruction.CreateLdcI4((int)info.ReadArrayElement(ldci4.GetLdcI4Value()))); return true; }