Restore original WinForms class and field names

This commit is contained in:
de4dot 2011-11-04 15:39:16 +01:00
parent df507526ba
commit 7486b73da3
2 changed files with 214 additions and 1 deletions

View File

@ -21,6 +21,7 @@ using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using Mono.Cecil;
using Mono.Cecil.Cil;
using de4dot.blocks;
using de4dot.deobfuscators;
@ -286,6 +287,101 @@ namespace de4dot.renamer {
}
class TypeDef : Ref {
static Dictionary<string, bool> windowsFormsControlClasses = new Dictionary<string, bool>(StringComparer.Ordinal);
static TypeDef() {
windowsFormsControlClasses["System.Windows.Forms.Control"] = true;
windowsFormsControlClasses["System.Windows.Forms.AxHost"] = true;
windowsFormsControlClasses["System.Windows.Forms.ButtonBase"] = true;
windowsFormsControlClasses["System.Windows.Forms.Button"] = true;
windowsFormsControlClasses["System.Windows.Forms.CheckBox"] = true;
windowsFormsControlClasses["System.Windows.Forms.RadioButton"] = true;
windowsFormsControlClasses["System.Windows.Forms.DataGrid"] = true;
windowsFormsControlClasses["System.Windows.Forms.DataGridView"] = true;
windowsFormsControlClasses["System.Windows.Forms.DataVisualization.Charting.Chart"] = true;
windowsFormsControlClasses["System.Windows.Forms.DateTimePicker"] = true;
windowsFormsControlClasses["System.Windows.Forms.GroupBox"] = true;
windowsFormsControlClasses["System.Windows.Forms.Integration.ElementHost"] = true;
windowsFormsControlClasses["System.Windows.Forms.Label"] = true;
windowsFormsControlClasses["System.Windows.Forms.LinkLabel"] = true;
windowsFormsControlClasses["System.Windows.Forms.ListControl"] = true;
windowsFormsControlClasses["System.Windows.Forms.ComboBox"] = true;
windowsFormsControlClasses["Microsoft.VisualBasic.Compatibility.VB6.DriveListBox"] = true;
windowsFormsControlClasses["System.Windows.Forms.DataGridViewComboBoxEditingControl"] = true;
windowsFormsControlClasses["System.Windows.Forms.ListBox"] = true;
windowsFormsControlClasses["Microsoft.VisualBasic.Compatibility.VB6.DirListBox"] = true;
windowsFormsControlClasses["Microsoft.VisualBasic.Compatibility.VB6.FileListBox"] = true;
windowsFormsControlClasses["System.Windows.Forms.CheckedListBox"] = true;
windowsFormsControlClasses["System.Windows.Forms.ListView"] = true;
windowsFormsControlClasses["System.Windows.Forms.MdiClient"] = true;
windowsFormsControlClasses["System.Windows.Forms.MonthCalendar"] = true;
windowsFormsControlClasses["System.Windows.Forms.PictureBox"] = true;
windowsFormsControlClasses["System.Windows.Forms.PrintPreviewControl"] = true;
windowsFormsControlClasses["System.Windows.Forms.ProgressBar"] = true;
windowsFormsControlClasses["System.Windows.Forms.ScrollableControl"] = true;
windowsFormsControlClasses["System.Windows.Forms.ContainerControl"] = true;
windowsFormsControlClasses["System.Windows.Forms.Form"] = true;
windowsFormsControlClasses["System.ComponentModel.Design.CollectionEditor.CollectionForm"] = true;
windowsFormsControlClasses["System.Messaging.Design.QueuePathDialog"] = true;
windowsFormsControlClasses["System.ServiceProcess.Design.ServiceInstallerDialog"] = true;
windowsFormsControlClasses["System.Web.UI.Design.WebControls.CalendarAutoFormatDialog"] = true;
windowsFormsControlClasses["System.Web.UI.Design.WebControls.RegexEditorDialog"] = true;
windowsFormsControlClasses["System.Windows.Forms.Design.ComponentEditorForm"] = true;
windowsFormsControlClasses["System.Windows.Forms.PrintPreviewDialog"] = true;
windowsFormsControlClasses["System.Windows.Forms.ThreadExceptionDialog"] = true;
windowsFormsControlClasses["System.Workflow.Activities.Rules.Design.RuleConditionDialog"] = true;
windowsFormsControlClasses["System.Workflow.Activities.Rules.Design.RuleSetDialog"] = true;
windowsFormsControlClasses["System.Workflow.ComponentModel.Design.ThemeConfigurationDialog"] = true;
windowsFormsControlClasses["System.Workflow.ComponentModel.Design.TypeBrowserDialog"] = true;
windowsFormsControlClasses["System.Workflow.ComponentModel.Design.WorkflowPageSetupDialog"] = true;
windowsFormsControlClasses["System.Windows.Forms.PropertyGrid"] = true;
windowsFormsControlClasses["System.Windows.Forms.SplitContainer"] = true;
windowsFormsControlClasses["System.Windows.Forms.ToolStripContainer"] = true;
windowsFormsControlClasses["System.Windows.Forms.ToolStripPanel"] = true;
windowsFormsControlClasses["System.Windows.Forms.UpDownBase"] = true;
windowsFormsControlClasses["System.Windows.Forms.DomainUpDown"] = true;
windowsFormsControlClasses["System.Windows.Forms.NumericUpDown"] = true;
windowsFormsControlClasses["System.Windows.Forms.UserControl"] = true;
windowsFormsControlClasses["Microsoft.VisualBasic.Compatibility.VB6.ADODC"] = true;
windowsFormsControlClasses["System.Web.UI.Design.WebControls.ParameterEditorUserControl"] = true;
windowsFormsControlClasses["System.Workflow.ComponentModel.Design.WorkflowOutline"] = true;
windowsFormsControlClasses["System.Workflow.ComponentModel.Design.WorkflowView"] = true;
windowsFormsControlClasses["System.Windows.Forms.Design.ComponentTray"] = true;
windowsFormsControlClasses["System.Windows.Forms.Panel"] = true;
windowsFormsControlClasses["System.Windows.Forms.Design.ComponentEditorPage"] = true;
windowsFormsControlClasses["System.Windows.Forms.FlowLayoutPanel"] = true;
windowsFormsControlClasses["System.Windows.Forms.SplitterPanel"] = true;
windowsFormsControlClasses["System.Windows.Forms.TableLayoutPanel"] = true;
windowsFormsControlClasses["System.ComponentModel.Design.ByteViewer"] = true;
windowsFormsControlClasses["System.Windows.Forms.TabPage"] = true;
windowsFormsControlClasses["System.Windows.Forms.ToolStripContentPanel"] = true;
windowsFormsControlClasses["System.Windows.Forms.ToolStrip"] = true;
windowsFormsControlClasses["System.Windows.Forms.BindingNavigator"] = true;
windowsFormsControlClasses["System.Windows.Forms.MenuStrip"] = true;
windowsFormsControlClasses["System.Windows.Forms.StatusStrip"] = true;
windowsFormsControlClasses["System.Windows.Forms.ToolStripDropDown"] = true;
windowsFormsControlClasses["System.Windows.Forms.ToolStripDropDownMenu"] = true;
windowsFormsControlClasses["System.Windows.Forms.ContextMenuStrip"] = true;
windowsFormsControlClasses["System.Windows.Forms.ToolStripOverflow"] = true;
windowsFormsControlClasses["System.Windows.Forms.ScrollBar"] = true;
windowsFormsControlClasses["System.Windows.Forms.HScrollBar"] = true;
windowsFormsControlClasses["System.Windows.Forms.VScrollBar"] = true;
windowsFormsControlClasses["System.Windows.Forms.Splitter"] = true;
windowsFormsControlClasses["System.Windows.Forms.StatusBar"] = true;
windowsFormsControlClasses["System.Windows.Forms.TabControl"] = true;
windowsFormsControlClasses["System.Windows.Forms.TextBoxBase"] = true;
windowsFormsControlClasses["System.Windows.Forms.MaskedTextBox"] = true;
windowsFormsControlClasses["System.Windows.Forms.RichTextBox"] = true;
windowsFormsControlClasses["System.Windows.Forms.TextBox"] = true;
windowsFormsControlClasses["System.Windows.Forms.DataGridTextBox"] = true;
windowsFormsControlClasses["System.Windows.Forms.DataGridViewTextBoxEditingControl"] = true;
windowsFormsControlClasses["System.Windows.Forms.ToolBar"] = true;
windowsFormsControlClasses["System.Windows.Forms.TrackBar"] = true;
windowsFormsControlClasses["System.Windows.Forms.TreeView"] = true;
windowsFormsControlClasses["System.ComponentModel.Design.ObjectSelectorEditor.Selector"] = true;
windowsFormsControlClasses["System.Windows.Forms.WebBrowserBase"] = true;
windowsFormsControlClasses["System.Windows.Forms.WebBrowser"] = true;
}
public IDefFinder defFinder;
public TypeInfo baseType = null;
public IList<TypeInfo> interfaces = new List<TypeInfo>(); // directly implemented interfaces
@ -344,6 +440,23 @@ namespace de4dot.renamer {
get { return methods.getAll(); }
}
bool? isWindowsFormsControlDerivedClass_cached;
bool isWindowsFormsControlDerivedClass() {
if (!isWindowsFormsControlDerivedClass_cached.HasValue)
isWindowsFormsControlDerivedClass_cached = isWindowsFormsControlDerivedClassInternal();
return isWindowsFormsControlDerivedClass_cached.Value;
}
bool isWindowsFormsControlDerivedClassInternal() {
if (windowsFormsControlClasses.ContainsKey(OldFullName))
return true;
if (baseType != null)
return baseType.typeDef.isWindowsFormsControlDerivedClass();
if (TypeDefinition.BaseType != null)
return windowsFormsControlClasses.ContainsKey(TypeDefinition.BaseType.FullName);
return false;
}
public void addMembers() {
var type = TypeDefinition;
@ -482,7 +595,13 @@ namespace de4dot.renamer {
if (OldFullName != "<Module>" && !typeNameState.IsValidName(OldName)) {
var newBaseType = baseType != null && baseType.typeDef.Renamed ? baseType.typeDef.NewName : null;
rename(nameCreator.newName(typeDefinition, newBaseType));
string origClassName = null;
if (isWindowsFormsControlDerivedClass())
origClassName = findWindowsFormsClassName();
if (origClassName != null && typeNameState.IsValidName(origClassName))
rename(typeNameState.currentNames.newName(OldName, new NameCreator2(origClassName)));
else
rename(nameCreator.newName(typeDefinition, newBaseType));
}
if (typeDefinition.Namespace != "" && !typeNameState.isValidNamespace(typeDefinition.Namespace))
@ -491,6 +610,49 @@ namespace de4dot.renamer {
prepareRenameGenericParams(genericParams, typeNameState.IsValidName);
}
string findWindowsFormsClassName() {
foreach (var methodDef in methods.getAll()) {
if (methodDef.MethodDefinition.Body == null)
continue;
if (methodDef.MethodDefinition.IsStatic || methodDef.MethodDefinition.IsVirtual)
continue;
var instructions = methodDef.MethodDefinition.Body.Instructions;
for (int i = 2; i < instructions.Count; i++) {
var call = instructions[i];
if (call.OpCode.Code != Code.Call && call.OpCode.Code != Code.Callvirt)
continue;
var calledMethod = call.Operand as MethodReference;
if (!isWindowsFormsSetNameMethod(calledMethod))
continue;
var ldstr = instructions[i - 1];
if (ldstr.OpCode.Code != Code.Ldstr)
continue;
var ldarg = instructions[i - 2];
if (DotNetUtils.getArgIndex(methodDef.MethodDefinition, ldarg) != 0)
continue;
return ldstr.Operand as string;
}
}
return null;
}
static bool isWindowsFormsSetNameMethod(MethodReference method) {
if (method == null)
return false;
if (method.Name != "set_Name")
return false;
if (method.MethodReturnType.ReturnType.FullName != "System.Void")
return false;
if (method.Parameters.Count != 1)
return false;
if (method.Parameters[0].ParameterType.FullName != "System.String")
return false;
if (!method.DeclaringType.FullName.StartsWith("System.Windows.Forms.", StringComparison.Ordinal))
return false;
return true;
}
public void rename() {
var typeDefinition = TypeDefinition;
@ -733,6 +895,9 @@ namespace de4dot.renamer {
void prepareRenameFields() {
var variableNameState = MemberRenameState.variableNameState;
if (isWindowsFormsControlDerivedClass())
initializeWindowsFormsFields();
if (TypeDefinition.IsEnum) {
var instanceFields = new List<FieldDef>(getInstanceFields());
if (instanceFields.Count == 1) {
@ -746,6 +911,8 @@ namespace de4dot.renamer {
int i = 0;
string nameFormat = hasFlagsAttribute() ? "flag_{0}" : "const_{0}";
foreach (var fieldDef in fields.getSorted()) {
if (fieldDef.Renamed)
continue;
if (!fieldDef.FieldDefinition.IsStatic || !fieldDef.FieldDefinition.IsLiteral)
continue;
if (!variableNameState.IsValidName(fieldDef.OldName))
@ -761,6 +928,48 @@ namespace de4dot.renamer {
}
}
void initializeWindowsFormsFields() {
var ourFields = new Dictionary<FieldReferenceAndDeclaringTypeKey, FieldDef>();
foreach (var fieldDef in fields.getAll())
ourFields[new FieldReferenceAndDeclaringTypeKey(fieldDef.FieldDefinition)] = fieldDef;
var variableNameState = MemberRenameState.variableNameState;
foreach (var methodDef in methods.getAll()) {
if (methodDef.MethodDefinition.Body == null)
continue;
if (methodDef.MethodDefinition.IsStatic || methodDef.MethodDefinition.IsVirtual)
continue;
var instructions = methodDef.MethodDefinition.Body.Instructions;
for (int i = 2; i < instructions.Count; i++) {
var call = instructions[i];
if (call.OpCode.Code != Code.Call && call.OpCode.Code != Code.Callvirt)
continue;
var calledMethod = call.Operand as MethodReference;
if (!isWindowsFormsSetNameMethod(calledMethod))
continue;
var ldstr = instructions[i - 1];
if (ldstr.OpCode.Code != Code.Ldstr)
continue;
var ldfld = instructions[i - 2];
var fieldRef = ldfld.Operand as FieldReference;
if (fieldRef == null)
continue;
FieldDef fieldDef;
if (!ourFields.TryGetValue(new FieldReferenceAndDeclaringTypeKey(fieldRef), out fieldDef))
continue;
var fieldName = ldstr.Operand as string;
if (fieldName == null || !variableNameState.IsValidName(fieldName))
continue;
if (fieldDef.Renamed)
continue;
fieldDef.rename(variableNameState.getNewFieldName(fieldDef.OldName, new NameCreator2(fieldName)));
}
}
}
static MethodReference getOverrideMethod(MethodDefinition meth) {
if (meth == null || !meth.HasOverrides)
return null;

View File

@ -80,6 +80,10 @@ namespace de4dot.renamer {
return currentVariableNames.newName(field.Name, () => variableNameCreator.newName(field.FieldType));
}
public string getNewFieldName(string oldName, INameCreator nameCreator) {
return currentVariableNames.newName(oldName, () => nameCreator.newName());
}
public string getNewParamName(string oldName, ParameterDefinition param) {
return currentVariableNames.newName(oldName, () => variableNameCreator.newName(param.ParameterType));
}