我们在反编译的时候会遇到一些混淆过的程序,他们会将一些字符串也混淆变成乱码,再经过混淆后的代码调用如(?149.?150),对应的IL代码为
L_0026: ldstr "IŔɫͮЧԳشݻࡵॺ୴౼ഺོှᅽቻ።ᐢᕠᙤᠧᥩᩴ᭶ᱽᴻṡὲ‼" // 72870B0070
L_002b: call string ?149::?150(string) // 285E030006
如果想知道加密字符串是什么东西,有两种办法
- 阅读?150方法的代码,用VB或C#模仿写一个出来调用
- 引用其DLL调用?150方法获得结果,输出
由于?150也是被混淆过的,阅读起来非常困难,所以我选择了第二个办法
但采用第二种方法时会遇到这样的情况
Dim r = ?149.?150(str)
这样过不了编译器,原因是不能用“?”开头,所以只能使用动态调用类,具体实现如下:
Sub Main()
Dim str = "IŔɫͮЧԳشݻࡵॺ୴౼ഺོှᅽቻ።ᐢᕠᙤᠧᥩᩴ᭶ᱽᴻṡὲ‼"
Dim a = Assembly.Load("zymtl")
Dim t = a.GetType("?149")
Dim p = t.GetMethod("?150")
Dim s = p.Invoke(t, New Object() {str})
Console.WriteLine(s)
Console.Read()
End Sub