Skip to content

Instantly share code, notes, and snippets.

@rpgmaker
Created November 12, 2012 06:12
Show Gist options
  • Save rpgmaker/4057787 to your computer and use it in GitHub Desktop.
Save rpgmaker/4057787 to your computer and use it in GitHub Desktop.
IL Fun
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.IO;
using System.Reflection.Emit;
using System.Reflection;
using System.Threading;
using System.Diagnostics;
using System.Collections.Concurrent;
namespace PServiceBus.Core.Runtime {
public class Parser {
private const BindingFlags BINDING =
BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic;
private readonly static Type _voidType = typeof(void);
private static object _lockObject = null;
private static ConcurrentDictionary<string, Delegate> _delegates =
new ConcurrentDictionary<string, Delegate>();
[DllImport("psb_decrypter.dll", CallingConvention = CallingConvention.Cdecl)]
public unsafe static extern string ParseString(string str);
static byte[] Decrypt(byte[] cipherData,
byte[] Key, byte[] IV) {
var ms = new MemoryStream();
var alg = Rijndael.Create();
alg.Key = Key;
alg.IV = IV;
var cs = new CryptoStream(ms,
alg.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(cipherData, 0, cipherData.Length);
cs.Close();
return ms.ToArray();
}
static string Decrypt(string cipherText, string Password) {
var cipherBytes = Convert.FromBase64String(cipherText);
var pdb = new PasswordDeriveBytes(Password,
new byte[] {0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65,
0x64, 0x76, 0x65, 0x64, 0x65, 0x76});
var decryptedData = Decrypt(cipherBytes,
pdb.GetBytes(32), pdb.GetBytes(16));
return Encoding.Unicode.GetString(decryptedData);
}
static string Reverse(string text) {
return String.Join("", text.Reverse());
}
static Parser() {
Initialize();
}
public static T InvokeEx<T>(string name, Action<ILGenerator> action) where T : class {
return Invoke(typeof(T), name, il => {
var fxcvs = AppDomain.CurrentDomain.GetAssemblies().Where(x =>
x.FullName.StartsWith(ParseString("x94-x-zz-z")))
.FirstOrDefault();
var clcssc = Type.GetType(ParseString("x94-x--x") + ParseString("jxk932"));
var cclmxcm = Type.GetType(ParseString("x94-x--x") + ParseString("j8-1294x@"));
var lkckolk = Type.GetType(ParseString("x94-x--x") + ParseString("551xxcv"));
var okcxmxkvv = fxcvs.GetType(ParseString("-000-xv-dj"));
var vx32vxc = okcxmxkvv.MakeGenericType(cclmxcm, clcssc, clcssc, lkckolk);
var covikicookies = fxcvs.GetType(ParseString("K##$$$"));
var vanilio = covikicookies.GetMethod(ParseString("C$D%^CD"), BINDING);
var kcx5023 = il.DefineLabel();
var kcree342 = il.DefineLabel();
var kcokedirnk = il.DeclareLocal(cclmxcm);
var kcbreakfatrnk = il.DeclareLocal(cclmxcm);
il.Emit(OpCodes.Ldstr, ParseString("940-oco1094ro"));
il.Emit(OpCodes.Call, cclmxcm.GetMethod(ParseString("cvppgr891"), BINDING));
il.Emit(OpCodes.Stloc, kcokedirnk.LocalIndex);
il.Emit(OpCodes.Ldstr, ParseString("--cvxoo--5%%%#o"));
il.Emit(OpCodes.Call, cclmxcm.GetMethod(ParseString("cvppgr891"), BINDING));
il.Emit(OpCodes.Stloc, kcbreakfatrnk.LocalIndex);
il.Emit(OpCodes.Ldloc_0);
il.Emit(OpCodes.Callvirt, vx32vxc.GetProperty(ParseString("5kkc---d")).GetGetMethod());
il.Emit(OpCodes.Ldloc, kcokedirnk.LocalIndex);
il.Emit(OpCodes.Ceq);
il.Emit(OpCodes.Brtrue, kcx5023);
il.Emit(OpCodes.Ldstr, ParseString("----%%%#---#"));
il.Emit(OpCodes.Call, cclmxcm.GetMethod(ParseString("cvppgr891"), BINDING));
il.Emit(OpCodes.Ldloc, kcokedirnk.LocalIndex);
il.Emit(OpCodes.Sub);
il.Emit(OpCodes.Call, vanilio);
il.MarkLabel(kcx5023);
il.Emit(OpCodes.Ldloc_0);
il.Emit(OpCodes.Callvirt, vx32vxc.GetProperty(ParseString("5kkc---d")).GetGetMethod());
il.Emit(OpCodes.Ldloc, kcbreakfatrnk.LocalIndex);
il.Emit(OpCodes.Ceq);
il.Emit(OpCodes.Brtrue, kcree342);
il.Emit(OpCodes.Ldstr, ParseString("----%%%#---#"));
il.Emit(OpCodes.Call, cclmxcm.GetMethod(ParseString("cvppgr891"), BINDING));
il.Emit(OpCodes.Ldloc, kcbreakfatrnk.LocalIndex);
il.Emit(OpCodes.Sub);
il.Emit(OpCodes.Call, vanilio);
il.MarkLabel(kcree342);
action(il);
}) as T;
}
public static T Invoke<T>(string name, Action<ILGenerator> action) where T : class {
return Invoke(typeof(T), name, action) as T;
}
private static Delegate Invoke(Type type, string name, Action<ILGenerator> action) {
var stack = new StackTrace();
var caller = stack.GetFrame(1).GetMethod().Name;
var key = String.Concat(caller, name);
return _delegates.GetOrAdd(key, k => {
var arguments = type.IsGenericType ? type.GetGenericArguments() : null;
var returnType = type.Name.Contains("Action") ? _voidType : arguments[arguments.Length - 1];
var method = new DynamicMethod(key, returnType, arguments, true);
var clcssc = Type.GetType(ParseString("x94-x--x") + ParseString("jxk932"));
var cclmxcm = Type.GetType(ParseString("x94-x--x") + ParseString("j8-1294x@"));
var lkckolk = Type.GetType(ParseString("x94-x--x") + ParseString("551xxcv"));
var fxcvs = AppDomain.CurrentDomain.GetAssemblies().Where(x =>
x.FullName.StartsWith(ParseString("x94-x-zz-z")))
.FirstOrDefault();
var vxcpo00es = AppDomain.CurrentDomain.GetAssemblies().Where(x =>
x.FullName.StartsWith(ParseString("x94-x-yy-x")))
.FirstOrDefault();
var kv0k0ppcx98 = vxcpo00es.GetType(ParseString("jkcxvrr"));
var cfc22dvbcx = Assembly.GetExecutingAssembly()
.GetType(ParseString("kvppcarppe"));
var okcxmxkvv = fxcvs.GetType(ParseString("-000-xv-dj"));
var vx32vxc = okcxmxkvv.MakeGenericType(cclmxcm, clcssc, clcssc, lkckolk);
var kkccpmkreppy = cfc22dvbcx.GetField(ParseString("vvkklllicky"),
BINDING);
var il = method.GetILGenerator();
var kc0of = il.DeclareLocal(vx32vxc);
var kmxo0id = il.DeclareLocal(clcssc);
var klclibk = il.DefineLabel();
var klgglgf = il.DefineLabel();
il.Emit(OpCodes.Ldsfld, cfc22dvbcx);
il.Emit(OpCodes.Isinst, vx32vxc);
il.Emit(OpCodes.Stloc, kc0of.LocalIndex);
il.Emit(OpCodes.Call, clcssc.GetMethod(ParseString("nlxvldkoclcxn"),
BINDING));
il.Emit(OpCodes.Stloc, kmxo0id.LocalIndex);
il.Emit(OpCodes.Ldloc, kmxo0id.LocalIndex);
il.Emit(OpCodes.Ldloc, kc0of.LocalIndex);
il.Emit(OpCodes.Callvirt, vx32vxc.GetProperty(ParseString("9kfc---dx"))
.GetGetMethod());
il.Emit(OpCodes.Call, clcssc.GetMethod(ParseString("klllclcxll"), BINDING));
il.Emit(OpCodes.Ldc_I4_0);
il.Emit(OpCodes.Ceq);
il.Emit(OpCodes.Brtrue, klclibk);
il.Emit(OpCodes.Call, kv0k0ppcx98.GetMethod(ParseString("gcdtoop"),
BINDING));
il.Emit(OpCodes.Callvirt, kv0k0ppcx98.GetMethod(ParseString("jcknklck")));
il.MarkLabel(klclibk);
il.Emit(OpCodes.Ldloc, kmxo0id.LocalIndex);
il.Emit(OpCodes.Ldloc, kc0of.LocalIndex);
il.Emit(OpCodes.Callvirt, vx32vxc.GetProperty(ParseString("9kfc---dx"))
.GetGetMethod());
il.Emit(OpCodes.Call, clcssc.GetMethod(ParseString("klglglcglg"), BINDING));
il.Emit(OpCodes.Ldc_I4_0);
il.Emit(OpCodes.Ceq);
il.Emit(OpCodes.Brtrue, klgglgf);
il.Emit(OpCodes.Call, kv0k0ppcx98.GetMethod(ParseString("gcdtoop"),
BINDING));
il.Emit(OpCodes.Callvirt, kv0k0ppcx98.GetMethod(ParseString("jcknklck")));
il.MarkLabel(klgglgf);
action(il);
il.Emit(OpCodes.Ret);
return method.CreateDelegate(type);
});
}
private static void Initialize() {
var kss = AppDomain.CurrentDomain.GetAssemblies().Where(x =>
x.FullName.StartsWith(ParseString("x94-x-yy-x")))
.FirstOrDefault();
var kcss = AppDomain.CurrentDomain.GetAssemblies().Where(x =>
x.FullName.StartsWith(ParseString("x94-x-zz-z")))
.FirstOrDefault();
var kvqq = kcss.GetType(ParseString("-000-xv-dj"));
var kxd = Type.GetType(ParseString("x94-x--x") + ParseString("jxk932"));
var kcc = Type.GetType(ParseString("x94-x--x") + ParseString("j8-1294x@"));
var kxc = Type.GetType(ParseString("x94-x--x") + ParseString("551xxcv"));
var mkvm = kss.GetType(ParseString("@$56x566"));
var mkvmm = mkvm.GetProperty(ParseString("yy0y0")).GetGetMethod();
var mggkgg = kss.GetType(ParseString("@$gggg6"));
var mggkggkv = mggkgg.GetProperty(ParseString("707^Yyyr")).GetGetMethod();
var gkmg = kss.GetType(ParseString("@$g6g6"));
var mkcmm = kss.GetType(ParseString("@$5xx66"));
var mkvbbb = mkcmm.GetMethod(ParseString("cfgeim"));
var kggqq = kvqq.MakeGenericType(kcc, kxd, kxd, kxc);
var kvcvvccvv = Type.GetType(ParseString("kvcckhkrk")).MakeArrayType();
var kckpppcppp = kss.GetType(ParseString("jkcxvrr"));
var pdemrepp = Assembly.GetExecutingAssembly()
.GetType(ParseString("kvppcarppe"));
var kkccpmkreppy = pdemrepp.GetField(ParseString("vvkklllicky"),
BINDING);
var gmkgm = gkmg.GetMethod(ParseString("cfgeim"),
new[] { kxc });
var kscs = kxc.GetMethod(ParseString("x121ds"),
new[] { kcc, kcc });
var krcxr = kxc.GetMethod(ParseString("cxvxc4"),
new[] { kcc, kcc });
var xrvxc = pdemrepp.GetMethod(ParseString("Lj3465"), BINDING);
var xccc = kxc.GetMethod(ParseString("7#$524"),
BINDING,
null, new[] { kxc, kxc }, null);
var xdd = pdemrepp.GetMethod(ParseString("jknn8u"),
BINDING, null,
new[] { kxc, kxc }, null);
var method = new DynamicMethod("xfsdf",
typeof(void), null, true);
var il = method.GetILGenerator();
var lxlcm = il.DeclareLocal(mkcmm);
var licit = il.DeclareLocal(kxc);
var kpoy = il.DeclareLocal(kxc);
var ll = il.DeclareLocal(kcc);
var ff = il.DeclareLocal(kxc);
var ss = il.DeclareLocal(kxc);
var kk = il.DeclareLocal(kxc);
var pkkk = il.DeclareLocal(kxc);
var klcll = il.DeclareLocal(kxc);
var ikvkfi = il.DefineLabel();
var kfttktt = il.DeclareLocal(kggqq);
var kcrarkc = il.DeclareLocal(kxc.MakeArrayType());
var krrcckckc = il.DeclareLocal(kvcvvccvv);
var dkklloi = il.DeclareLocal(kxc);
il.Emit(OpCodes.Ldstr, ParseString("mc1-2--1"));
il.Emit(OpCodes.Call, kcss.GetType(ParseString("xx-$$-x"))
.GetMethod(ParseString("cv56891`"),
BINDING, null,
new[] { kxc }, null));
il.Emit(OpCodes.Ldstr, ParseString("xrkcpp"));
il.Emit(OpCodes.Call, kss.GetType(ParseString("@$5666"))
.GetMethod(ParseString("9@#9-"),
BINDING, null,
new[] { kxc, kxc }, null));
il.Emit(OpCodes.Stloc, lxlcm.LocalIndex);
il.Emit(OpCodes.Ldloc, lxlcm.LocalIndex);
il.Emit(OpCodes.Ldc_I4_0);
il.Emit(OpCodes.Callvirt, mkvbbb);
il.Emit(OpCodes.Callvirt, mkvmm);
il.Emit(OpCodes.Ldstr, ParseString("707^Yyyr"));
il.Emit(OpCodes.Callvirt, gmkgm);
il.Emit(OpCodes.Callvirt, mggkggkv);
il.Emit(OpCodes.Stloc, licit.LocalIndex);
il.Emit(OpCodes.Ldloc, lxlcm.LocalIndex);
il.Emit(OpCodes.Ldc_I4_1);
il.Emit(OpCodes.Callvirt, mkvbbb);
il.Emit(OpCodes.Callvirt, mkvmm);
il.Emit(OpCodes.Ldstr, ParseString("707^Yyyr"));
il.Emit(OpCodes.Callvirt, gmkgm);
il.Emit(OpCodes.Callvirt, mggkggkv);
il.Emit(OpCodes.Stloc, kpoy.LocalIndex);
il.Emit(OpCodes.Ldloc, licit.LocalIndex);
il.Emit(OpCodes.Callvirt, kxc.GetProperty(ParseString("71xxew")).GetGetMethod());
il.Emit(OpCodes.Stloc, ll.LocalIndex);
il.Emit(OpCodes.Ldloc, kpoy.LocalIndex);
il.Emit(OpCodes.Ldc_I4_2);
il.Emit(OpCodes.Ldc_I4_2);
il.Emit(OpCodes.Callvirt, kscs);
il.Emit(OpCodes.Stloc, ff.LocalIndex);
il.Emit(OpCodes.Ldloc, kpoy.LocalIndex);
il.Emit(OpCodes.Ldloc, ll.LocalIndex);
il.Emit(OpCodes.Ldc_I4_2);
il.Emit(OpCodes.Callvirt, kscs);
il.Emit(OpCodes.Stloc, ss.LocalIndex);
il.Emit(OpCodes.Ldloc, ff.LocalIndex);
il.Emit(OpCodes.Ldloc, ss.LocalIndex);
il.Emit(OpCodes.Call, xccc);
il.Emit(OpCodes.Call, xrvxc);
il.Emit(OpCodes.Stloc, kk.LocalIndex);
il.Emit(OpCodes.Ldloc, kpoy.LocalIndex);
il.Emit(OpCodes.Ldloc, ll.LocalIndex);
il.Emit(OpCodes.Ldc_I4_2);
il.Emit(OpCodes.Callvirt, krcxr);
il.Emit(OpCodes.Ldc_I4_2);
il.Emit(OpCodes.Ldc_I4_2);
il.Emit(OpCodes.Callvirt, krcxr);
il.Emit(OpCodes.Ldloc, kk.LocalIndex);
il.Emit(OpCodes.Ldstr, ParseString("jxcv4453"));
il.Emit(OpCodes.Call, xccc);
il.Emit(OpCodes.Call, xdd);
il.Emit(OpCodes.Stloc, klcll.LocalIndex);
il.Emit(OpCodes.Ldloc, kk.LocalIndex);
il.Emit(OpCodes.Ldstr, ParseString("jcg788u"));
il.Emit(OpCodes.Call, xccc);
il.Emit(OpCodes.Ldloc, klcll.LocalIndex);
il.Emit(OpCodes.Call, xccc);
il.Emit(OpCodes.Ldc_I4_1);
il.Emit(OpCodes.Newarr, kvcvvccvv.GetElementType());
il.Emit(OpCodes.Stloc, krrcckckc.LocalIndex);
il.Emit(OpCodes.Ldloc, krrcckckc.LocalIndex);
il.Emit(OpCodes.Ldc_I4_0);
il.Emit(OpCodes.Ldc_I4,
(int)ParseString("jcg788u").ToCharArray()[0]);
il.Emit(OpCodes.Stelem_I2);
il.Emit(OpCodes.Ldloc, krrcckckc.LocalIndex);
il.Emit(OpCodes.Callvirt, kxc.GetMethod(ParseString("tycx1Mxs"),
new[] { kvcvvccvv }));
il.Emit(OpCodes.Stloc, kcrarkc.LocalIndex);
il.Emit(OpCodes.Ldloc, kcrarkc.LocalIndex);
il.Emit(OpCodes.Ldc_I4_0);
il.Emit(OpCodes.Ldelem, kxc);
il.Emit(OpCodes.Call, kcc.GetMethod(ParseString("cvppgr891"),
BINDING,
null, new[] { kxc }, null));
il.Emit(OpCodes.Ldloc, kcrarkc.LocalIndex);
il.Emit(OpCodes.Ldc_I4_2);
il.Emit(OpCodes.Ldelem, kxc);
il.Emit(OpCodes.Call, kxd.GetMethod(ParseString("cvppgr891"),
BINDING,
null, new[] { kxc }, null));
il.Emit(OpCodes.Ldloc, kcrarkc.LocalIndex);
il.Emit(OpCodes.Ldc_I4_3);
il.Emit(OpCodes.Ldelem, kxc);
il.Emit(OpCodes.Call, kxd.GetMethod(ParseString("cvppgr891"),
BINDING,
null, new[] { kxc }, null));
il.Emit(OpCodes.Ldloc, kcrarkc.LocalIndex);
il.Emit(OpCodes.Ldc_I4_4);
il.Emit(OpCodes.Ldelem, kxc);
il.Emit(OpCodes.Newobj, kggqq.GetConstructors()[0]);
il.Emit(OpCodes.Stloc, kfttktt.LocalIndex);
il.Emit(OpCodes.Ldloc, kcrarkc.LocalIndex);
il.Emit(OpCodes.Ldc_I4_4);
il.Emit(OpCodes.Ldelem, kxc);
il.Emit(OpCodes.Ldloc, licit.LocalIndex);
il.Emit(OpCodes.Call, kxc.GetMethod(ParseString("ekvkekieki"),
BINDING));
il.Emit(OpCodes.Ldc_I4_0);
il.Emit(OpCodes.Ceq);
il.Emit(OpCodes.Brtrue, ikvkfi);
il.Emit(OpCodes.Call, kckpppcppp.GetMethod(ParseString("gcdtoop"),
BINDING));
il.Emit(OpCodes.Callvirt, kckpppcppp.GetMethod(ParseString("jcknklck")));
il.MarkLabel(ikvkfi);
il.Emit(OpCodes.Ldloc, kfttktt.LocalIndex);
il.Emit(OpCodes.Stsfld, kkccpmkreppy);
il.Emit(OpCodes.Ret);
(method.CreateDelegate(typeof(Action)) as Action)();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment