首页
社区
课程
招聘
[求助].NET 的一个加壳保护工具dotNet Protector | PVLog
发表于: 2017-7-31 16:26 9359

[求助].NET 的一个加壳保护工具dotNet Protector | PVLog

2017-7-31 16:26
9359

.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);
        }
    }
}


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 11
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
  坐等大神
2017-7-31 16:27
0
雪    币: 14517
活跃值: (3338)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3


MethodInfo method = type.GetMethod("RunEnv", BindingFlags.Static | BindingFlags.Public);

method.Invoke(null, parameters);

调用RunEnv之前会先调用该类的静态构造函数,所以可以顺藤摸瓜

会先调用 EngineInterop();再调用 RunEnv(),我只能帮到这了。我搬砖去了


2017-7-31 18:31
0
雪    币: 11
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
landeaxm MethodInfo&nbsp;method&nbsp;=&nbsp;type.GetMethod(&quot;RunEnv&quot;,&nbsp;B ...
大神,你已经脱了DLL库??
2017-7-31 20:13
0
雪    币: 11
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
问题太Low了吗?
2017-8-1 11:19
0
雪    币: 11
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
~~~
2017-8-3 15:49
0
雪    币: 11
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
2017-8-4 09:33
0
雪    币: 5568
活跃值: (3208)
能力值: ( LV12,RANK:407 )
在线值:
发帖
回帖
粉丝
8
我从内存拷贝了一个dotNetProtectUI.exe,但是它的所有方法体都是throw new ApplicationException();
貌似其方法仍然被加密了。
我在 internal unsafe static Assembly \u0082\u00BF(int \u007F)方法里面,跟踪到 dotNetProtectUI.exe内存代码。
将array另存为exe文件后,发现该exe里面的方法体都是 throw new ApplicationException();
但是我一直跟踪代码过程中,从
assembly = Assembly.Load(array);之后,
到方法体 internal static int \u0082\u00B9(int \u007F, string[] \u007F)
assembly 并没有被改变。。。。
MethodInfo entryPoint = assembly.EntryPoint;
object obj = entryPoint.Invoke(null, new object[]                {                    \u007F                }); 
Invoke执行后,就开始初始化窗体,显示正常的UI界面了。
实在没有想明白,assembly已经加载了array里面的东东,没有发现代码改动地方,难道是由Invoke的hook代码,在马上要执行的时候,就更新了代码?期待高手指引。。。。

2017-9-25 01:11
0
雪    币: 11
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
htg 我从内存拷贝了一个dotNetProtectUI.exe,但是它的所有方法体都是throw new ApplicationException();貌似其方法仍然被加密了。我在 internal uns ...
无解了?难道会比  DNGuard  HVM  还6B??
2017-11-17 17:04
0
雪    币: 5568
活跃值: (3208)
能力值: ( LV12,RANK:407 )
在线值:
发帖
回帖
粉丝
10
我利用dnSPY进行调试的时候,在调试堆栈内能看到  IL和NativeCode一直再变动(dnSPY已经获取了真正的IL),但是在代码窗口里面一直停留在throw  new  exception内。
我估计代码窗口里面的代码根本就没用。
这应该是JIT了,如果对dnSPY的源代码熟悉的话,修改一下源代码,将IL进行恢复就可以了。
还有,如果对IL进行修改,DLL将无法运行,这应该是有保护措施。
如果要真正Crack,需要如下处理:
1、对NET的PE结构非常熟悉,能够手动修复相关错误
2、对JIT机制非常熟悉,如果能手动hook到JIT里面的compliedMethod方法,提前获取到IL代码,然后遍历所有的方法进行IL的恢复。
IL恢复后,去除一些不相关的代码。
当然,也有可能有名称混淆之类的,这也需要进行处理。
我这块还不是很熟,大致知道方向,如果往前走,貌似类似的加密错误基本就失效了。
2017-11-20 07:44
0
雪    币: 225
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
老仙儿可以试试managejitter
2017-11-21 22:24
0
雪    币: 5568
活跃值: (3208)
能力值: ( LV12,RANK:407 )
在线值:
发帖
回帖
粉丝
12
destnity 老仙儿可以试试managejitter[em_2]
managejitter没找到啊,求提示
2018-4-21 10:20
0
雪    币: 6331
活跃值: (1457)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
不知道这个壳是否有新的进展呢
2020-12-8 18:20
0
游客
登录 | 注册 方可回帖
返回
//