Restore original WinForms class and field names
This commit is contained in:
parent
df507526ba
commit
7486b73da3
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user