-
Notifications
You must be signed in to change notification settings - Fork 7
/
SetVariableControlNew.xaml.cs
120 lines (104 loc) · 4.56 KB
/
SetVariableControlNew.xaml.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/*
dnDeflow - Control flow deobfuscation using Z3 and ILAst
Copyright (C) 2016 [email protected]
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows;
using System.Windows.Controls;
using dnlib.DotNet;
using dnSpy.Contracts.Controls;
using dnSpy.Contracts.Decompiler;
using dnSpy.Contracts.MVVM;
using ICSharpCode.Decompiler.Disassembler;
namespace DeFlow
{
sealed partial class SetVariableControlNew : WindowBase
{
public SetVariableControlNew()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
foreach (var field in (this.DataContext as List<FieldDef>))
{
Vars.Items.Add(this.GetField(field));
}
}
private void AddButton_Click(object sender, RoutedEventArgs e)
{
Regex regex1 = new Regex("^\\d+$");
Regex regex2 = new Regex("^-\\d+$");
Regex regex3 = new Regex("^[A-Fa-f0-9]{1,8}$");
Regex regex4 = new Regex("^0x[A-Fa-f0-9]{1,8}$");
if (SetVariable.Variables.Items.Where(x => x.Name == Vars.Text).Any())
return;
if (regex1.IsMatch(Value.Text))
{
uint val = 0;
if (uint.TryParse(Value.Text, out val))
{
var varName = Vars.Text;
var token = (this.DataContext as List<FieldDef>).Find(x => this.GetField(x) == varName).MDToken.ToUInt32();
SetVariable.Variables.Items.Add(new SetVariable.Var() { Token = string.Format("0x{0:X8}", token), Name = varName, Value = val });
}
}
else if (regex2.IsMatch(Value.Text))
{
int val = 0;
if (int.TryParse(Value.Text, NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture, out val))
{
var varName = Vars.Text;
var token = (this.DataContext as List<FieldDef>).Find(x => this.GetField(x) == varName).MDToken.ToUInt32();
SetVariable.Variables.Items.Add(new SetVariable.Var() { Token = string.Format("0x{0:X8}", token), Name = varName, Value = (uint)val });
}
}
else if (regex3.IsMatch(Value.Text))
{
uint val = 0;
if (uint.TryParse(Value.Text, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out val))
{
var varName = Vars.Text;
var token = (this.DataContext as List<FieldDef>).Find(x => this.GetField(x) == varName).MDToken.ToUInt32();
SetVariable.Variables.Items.Add(new SetVariable.Var() { Token = string.Format("0x{0:X8}", token), Name = varName, Value = val });
}
}
else if (regex4.IsMatch(Value.Text))
{
uint val = 0;
if (uint.TryParse(Value.Text.Remove(0, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out val))
{
var varName = Vars.Text;
var token = (this.DataContext as List<FieldDef>).Find(x => this.GetField(x) == varName).MDToken.ToUInt32();
SetVariable.Variables.Items.Add(new SetVariable.Var() { Token = string.Format("0x{0:X8}", token), Name = varName, Value = val });
}
}
}
private string GetField(IField field)
{
IDecompilerOutput output;
var stringBuilder = new StringBuilder();
var writer = new StringWriter(stringBuilder);
output = new TextWriterDecompilerOutput(writer);
DisassemblerHelpers.WriteFieldTo(field, output);
return output.ToString();
}
}
}