-
-
[求助].NET 的一个加壳保护工具dotNet Protector | PVLog
-
发表于:
2017-7-31 16:26
9359
-
[求助].NET 的一个加壳保护工具dotNet Protector | PVLog
.NET 的一个加壳保护工具PVLog dotNet Protector。想知道它的实现原理。
本人菜鸟,自己分析了一遍后所获甚微。求助各路大神帮忙分析分析吧。
软件截图:
(图1)
主程序就是一个没什么用的外壳,由外壳动态加载 dotNetProtectorEngine.dll , 然后通过反射的方式调用这个动态库里面的方法。
由于动态加载的时候有公钥Token验证,如果修改了dotNetProtectorEngine.dll的话会导致加载失败(BadImageException),所以
我去掉了Token验证(如图2所示)。图3是外壳原来的代码,做个对比。
(图2)
(图3)
另外:直接dump也是不行的哦,dump出来后方法体直接是 throw new ApplicationException();
那么真正的 Method Body 去哪里了呢??
很多 IL 级别的加密软件都是将Method Body中真正的IL代码加密后保存起来(可能会存储在Resource中),然后用一个类似于执行宿主的方法替代原来的Method Body。
在代码执行的时候由这个执行宿主找到对应的加密IL,最后解密再执行。
个人认为这个PVLog dotNet Protector 也是类似的原理。
坐等大神们6B的分析!
壳子代码:
using System;
using System.Reflection;
namespace dotNetProtectorEnv
{
internal static class dotNetProtectorEnv
{
[STAThread]
private static void Main(string[] args)
{
Assembly assembly = AppDomain.CurrentDomain.Load("dotNetProtectorEngine, Culture=neutral, PublicKeyToken=139802f83c3904a4");
if (assembly == null)
{
return;
}
Type type = assembly.GetType("PvLogiciels.dotNetProtector.EngineInterop");
if (type == null)
{
return;
}
MethodInfo method = type.GetMethod("RunEnv", BindingFlags.Static | BindingFlags.Public);
if (method == null)
{
return;
}
Type type2 = assembly.GetType("PvLogiciels.dotNetProtector.EnginePack");
if (type2 != null)
{
MethodInfo method2 = type2.GetMethod("LoadPack", BindingFlags.Static | BindingFlags.Public);
if (method2 != null)
{
for (int i = 0; i < args.Length; i++)
{
string text = args[i];
if (text.ToLower().StartsWith("-ev:"))
{
try
{
Version version = new Version(text.Substring(4));
method2.Invoke(null, new object[]
{
version
});
break;
}
catch
{
}
}
}
}
}
object[] parameters = new object[]
{
args
};
method.Invoke(null, parameters);
}
}
}
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!