• XSS.stack #1 – первый литературный журнал от юзеров форума

C# GMH/GPA

hayincan

HDD-drive
Пользователь
Регистрация
11.01.2021
Сообщения
24
Реакции
5
Небольшой модуль для замены GetModuleHandle/GetProcAddress
Поддерживает x32/x64/AnyCpu
Требует C# 9.0
Компилится под 2.0-4.8.


Код:
    public unsafe class NativeModules
    {
        public static readonly delegate*<uint, void*> NativePointer;

        static NativeModules()
        {
            NativePointer = &NativeFunction;
            var memory = (byte*)NativePointer;
            if (IntPtr.Size == 4)
                *memory = 0x64;
            else
                *(short*)memory++ = 0x4865;
            *(int*)++memory = 0x00C3018B;
        }

        private static void* NativeFunction(uint offset)
        {
            return new IntPtr(offset).ToPointer();
        }

        private static IntPtr FindInList(void** list, int index, string module)
        {
            var entryOffset = index * IntPtr.Size;
            var currentList = &list[index];
            for (var listEntry = *currentList; listEntry != currentList; listEntry = *(void**) listEntry)
            {
                var entry = (void**)((byte*) listEntry - entryOffset);
                var str = new string((char*)entry[12], 0, *(ushort*)&entry[11] / 2);
                if (string.Compare(str, module, StringComparison.InvariantCultureIgnoreCase) == 0)
                    return new IntPtr(entry[6]);
            }
            return IntPtr.Zero;
        }

        public static IntPtr FindModule(string name)
        {
            var list = IntPtr.Size == 4
                ? &((void***) NativePointer(0x30))[3][3]
                : &((void***) NativePointer(0x60))[3][2];
            if (name == null)
                return new IntPtr(((void**)((byte*)list[2] - 2 * IntPtr.Size))[6]);
            for (var i = 0; i < 6; i+=2)
            {
                var module = FindInList(list, i, name);
                if (module != IntPtr.Zero)
                    return module;
            }
            return IntPtr.Zero;
        }

        public static IntPtr FindProcAddress(IntPtr handle, string procName)
        {
            if (handle == IntPtr.Zero || procName == null) return IntPtr.Zero;
            var image = (byte*) handle.ToPointer();
            var exportDir = image + *(int*) (image + *(int*) (image + 60) + (IntPtr.Size == 4 ? 120 : 136));
            var names = image + *(int*) (exportDir + 32);
            var namesCount = *(int*) (exportDir + 24);
            for (int i = 0, offset = 0; i < namesCount; i++, offset += 4)
            {
                if (string.Compare(new string((sbyte*) (image + *(int*) (names + offset))), procName,
                    StringComparison.InvariantCultureIgnoreCase) == 0)
                    return new IntPtr(image + *(int*) (image + *(int*) (exportDir + 28) +
                                                       (*(short*) (image + *(int*) (exportDir + 36) + (i << 1)) << 2)));
            }

            return IntPtr.Zero;
        }
    }
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Обе эти функции можно куда проще через Reflection получить у класса Microsoft.Win32.UnsafeNativeMethods, если уж так не хочется делать PInvoke напрямую.
 
Обе эти функции можно куда проще через Reflection получить у класса Microsoft.Win32.UnsafeNativeMethods, если уж так не хочется делать PInvoke напрямую.

Тут эти функции и не вызываются. По сути это типичный поиск через peb но переписанный на .net
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Тут эти функции и не вызываются. По сути это типичный поиск через peb но переписанный на .net
О хоспаде, я в курсе, я о том, что в дотнете их куда проще найти через рефлекшн этого класса.
 
О хоспаде, я в курсе, я о том, что в дотнете их куда проще найти через рефлекшн этого класса.
Спецом глянул mscorlib.dll, не зря же я раньше отказался от этого метода
1) Reflection был не применим из за простоты его хука под eazvm
2) С классом ты конечно немного ошибся Microsoft.Win32.UnsafeNativeMethods -> Microsoft.Win32.Win32Native
3) Ну и самое главное, в .netframework 2.0 там тупо нет этих функций.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
2) С классом ты конечно немного ошибся Microsoft.Win32.UnsafeNativeMethods -> Microsoft.Win32.Win32Native
Нет, не ошибся. Ты, наверное, в mscorlib'е смотришь, а надо в System.dll.

Ну и самое главное, в .netframework 2.0 там тупо нет этих функций
Есть во и втором и само собой в четвертом.
 
Последнее редактирование:


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх