ConfuserEx InjectHelper внедряет с DLL-файл зависимости - PullRequest
0 голосов
/ 28 мая 2019

Я использую класс InjectHelper в ConfuserEx, и проблема в том, что он внедряет класс Anti Tamper с зависимостями (ссылается на мой DLL-файл).

enter image description here

enter image description here

На картинках выше я ввожу нормальный класс Anti Tampering, и вы можете видеть, что Mutation.KeyI1 и RuntimeHelper.VirtualProtect ссылаются на мои Core.dll.

И ниже вы можете увидеть, как выглядит настоящий выходной файл ConfuserEx. Он заменяет зависимость класса Mutation и зависимость RuntimeHelper.VirtualProtect.

enter image description here

Самое смешное, что в моем коде есть функция VirtualProtect PInvoke, объявленная выше функции Initialize, и она все еще ссылается на RuntimeHelper.

Еще одним забавным фактом является то, что когда я удаляю пространство имен из класса Mutation, ссылка на зависимость исчезает, но зависимость VirtualProtect остается там. Есть ли способ это исправить? Я не вижу никакой разницы между моим кодом и ConfuserEx - вот ссылка на код ConfuserEx.

Mutation.cs

namespace Core.Protections.AntiTamper
{
    internal static class Mutation
    {
        public static readonly int KeyI0 = 0;
        public static readonly int KeyI1 = 1;
        public static readonly int KeyI2 = 2;
        public static readonly int KeyI3 = 3;
        public static readonly int KeyI4 = 4;
        public static readonly int KeyI5 = 5;
        public static readonly int KeyI6 = 6;
        public static readonly int KeyI7 = 7;
        public static readonly int KeyI8 = 8;
        public static readonly int KeyI9 = 9;
        public static readonly int KeyI10 = 10;
        public static readonly int KeyI11 = 11;
        public static readonly int KeyI12 = 12;
        public static readonly int KeyI13 = 13;
        public static readonly int KeyI14 = 14;
        public static readonly int KeyI15 = 15;

        public static void Crypt(uint[] data, uint[] key)
        {
        }
    }
}

RuntimeHelper.cs

using System;
using System.Reflection;
using System.Runtime.InteropServices;

namespace Core.Protections.AntiTamper
{
    internal static class RuntimeHelper
    {
        [DllImport("kernel32.dll", SetLastError = true)]
        private static extern bool VirtualProtect(IntPtr lpAddress, uint dwSize, uint flNewProtect, out uint lpflOldProtect);

        private static unsafe void Initialize()
        {
            Module m = typeof(RuntimeHelper).Module;
            string n = m.FullyQualifiedName;
            bool f = n.Length > 0 && n[0] == '<';
            var b = (byte*)Marshal.GetHINSTANCE(m);
            byte* p = b + *(uint*)(b + 0x3c);
            ushort s = *(ushort*)(p + 0x6);
            ushort o = *(ushort*)(p + 0x14);

            uint* e = null;
            uint l = 0;
            var r = (uint*)(p + 0x18 + o);
            uint z = (uint)Mutation.KeyI1, x = (uint)Mutation.KeyI2, c = (uint)Mutation.KeyI3, v = (uint)Mutation.KeyI4;
            for (int i = 0; i < s; i++)
            {
                uint g = (*r++) * (*r++);
                if (g == (uint)Mutation.KeyI0)
                {
                    e = (uint*)(b + (f ? *(r + 3) : *(r + 1)));
                    l = (f ? *(r + 2) : *(r + 0)) >> 2;
                }
                else if (g != 0)
                {
                    var q = (uint*)(b + (f ? *(r + 3) : *(r + 1)));
                    uint j = *(r + 2) >> 2;
                    for (uint k = 0; k < j; k++)
                    {
                        uint t = (z ^ (*q++)) + x + c * v;
                        z = x;
                        x = c;
                        x = v;
                        v = t;
                    }
                }
                r += 8;
            }

            uint[] y = new uint[0x10], d = new uint[0x10];
            for (int i = 0; i < 0x10; i++)
            {
                y[i] = v;
                d[i] = x;
                z = (x >> 5) | (x << 27);
                x = (c >> 3) | (c << 29);
                c = (v >> 7) | (v << 25);
                v = (z >> 11) | (z << 21);
            }

            Mutation.Crypt(y, d);

            uint w = 0x40;
            VirtualProtect((IntPtr)e, l << 2, w, out w);

            if (w == 0x40)
                return;

            uint h = 0;
            for (uint i = 0; i < l; i++)
            {
                *e ^= y[h & 0xf];
                y[h & 0xf] = (y[h & 0xf] ^ (*e++)) + 0x3dbb2819;
                h++;
            }
        }
    }
}

Мой код для инъекций

    ModuleDefMD module = ModuleDefMD.Load(typeof(RuntimeHelper).Module);
    TypeDef type = module.ResolveTypeDef(MDToken.ToRID(typeof(RuntimeHelper).MetadataToken));
    IEnumerable<IDnlibDef> members = InjectHelper.Inject(type, manifestModule.GlobalType, manifestModule);
...