- Joined
- Dec 11, 2010
- Messages
- 2,955
- Reaction score
- 2,688
Hello.
Just screwing around with Mono.Cecil. And I decided to make a 30 day limit check when you run a file through Mono.Cecil, don't judge my code please.
I coded this myself, by creating the function in C# and using a decompiler to locate the correct OpCodes.
You don't have to change to keep it days, you can change the method "FromDays" as you desire.
It calls on the Main(); function the DateVerify, and it will output an injected method such as;
Just screwing around with Mono.Cecil. And I decided to make a 30 day limit check when you run a file through Mono.Cecil, don't judge my code please.
I coded this myself, by creating the function in C# and using a decompiler to locate the correct OpCodes.
You don't have to change to keep it days, you can change the method "FromDays" as you desire.
It calls on the Main(); function the DateVerify, and it will output an injected method such as;
Code:
public static void DateVerify()
{
DateTime now = DateTime.Now;
DateTime value = DateTime.Parse("7/03/2013 11:36:00 PM");
if (now.Subtract(value) >= TimeSpan.FromDays(30.0))
{
throw new Exception("The time period has surpassed 30 days!");
}
}
Code:
private double Time = 30;
public void RunTask()
{
for (var modules = 0; modules < Program.Assembly.Modules.Count; modules++)
{
var module = Program.Assembly.Modules[modules];
for (int types = 0; types < module.Types.Count; types++)
{
var type = module.Types[types];
for (int methods = 0; methods < type.Methods.Count; methods++)
{
var method = type.Methods[methods];
if (method.Name == "Main")
{
var methodDateCheck = new MethodDefinition("DateVerify", MethodAttributes.Public | MethodAttributes.Static | MethodAttributes.HideBySig, Program.Assembly.MainModule.Import(typeof(void)));
InsertTimeCheck(type, methodDateCheck);
type.Methods.Add(methodDateCheck);
var worker = method.Body.GetILProcessor();
var call = worker.Create(OpCodes.Call, methodDateCheck);
worker.InsertAfter(method.Body.Instructions[0], call);
worker.InsertAfter(call, worker.Create(OpCodes.Nop));
}
}
}
}
}
public void InsertTimeCheck(TypeDefinition type, MethodDefinition method)
{
var dateNow = DateTime.Now;
var assembly = Program.Assembly;
TypeReference declaringType = type;
ModuleDefinition module = declaringType.Module;
TypeReference variableType = module.Import(type);
VariableDefinition result = new VariableDefinition("start", module.Import(typeof(DateTime)));
method.Body.Variables.Add(result);
result = new VariableDefinition("oldDate", module.Import(typeof(DateTime)));
method.Body.Variables.Add(result);
result = new VariableDefinition(module.Import(typeof(bool)));
method.Body.Variables.Add(result);
var worker = method.Body.GetILProcessor();
worker.Append(worker.Create(OpCodes.Nop));
worker.Append(worker.Create(OpCodes.Call, assembly.Import(typeof(DateTime).GetMethod("get_Now", Type.EmptyTypes))));
worker.Append(worker.Create(OpCodes.Stloc_0));
worker.Append(worker.Create(OpCodes.Ldstr, dateNow.ToString()));
worker.Append(worker.Create(OpCodes.Call, assembly.Import(typeof(DateTime).GetMethod("Parse", new[] { typeof(string) }))));
worker.Append(worker.Create(OpCodes.Stloc_1));
worker.Append(worker.Create(OpCodes.Ldloca_S, (byte)0));
worker.Append(worker.Create(OpCodes.Ldloc_1));
worker.Append(worker.Create(OpCodes.Call, assembly.Import(typeof(DateTime).GetMethod("Subtract", new[] { typeof(DateTime) }))));
worker.Append(worker.Create(OpCodes.Ldc_R8, Time));
worker.Append(worker.Create(OpCodes.Call, assembly.Import(typeof(TimeSpan).GetMethod("FromDays", new[] { typeof(long) }))));
worker.Append(worker.Create(OpCodes.Call, assembly.Import(typeof(TimeSpan).GetMethod("op_GreaterThanOrEqual", new[] { typeof(TimeSpan), typeof(TimeSpan) }))));
worker.Append(worker.Create(OpCodes.Ldc_I4_0));
worker.Append(worker.Create(OpCodes.Ceq));
worker.Append(worker.Create(OpCodes.Stloc_2));
worker.Append(worker.Create(OpCodes.Ldloc_2));
var last = worker.Create(OpCodes.Ret);
worker.Append(worker.Create(OpCodes.Brtrue_S, last));
worker.Append(worker.Create(OpCodes.Nop));
worker.Append(worker.Create(OpCodes.Ldstr, "The time period has surpassed 30 days!"));
worker.Append(worker.Create(OpCodes.Newobj, assembly.Import(typeof(Exception).GetConstructor(new[] { typeof(string) }))));
worker.Append(worker.Create(OpCodes.Throw));
worker.Append(last);
}