GetILAsByteArray to Method

Ты че баклан, дефективный?
Пользователь
Статус
Оффлайн
Регистрация
18 Мар 2019
Сообщения
756
Реакции[?]
64
Поинты[?]
2K
Кто нибудь сталкивался с подобным?Если да поделитесь промером
 
Ты че баклан, дефективный?
Пользователь
Статус
Оффлайн
Регистрация
18 Мар 2019
Сообщения
756
Реакции[?]
64
Поинты[?]
2K
ldloc.s <d0t.net> stloc.s <Reversed>
Пользователь
Статус
Оффлайн
Регистрация
21 Окт 2018
Сообщения
214
Реакции[?]
337
Поинты[?]
1K
GetILAsByteArray() - это не то, о чем ты думаешь. Он копирует в массив только байты самих MSIL-инструкций.
Как выглядит полноценная структура метода:

Существует два типа метода(заголовка):
  • "TINY"(использует структуру IMAGE_COR_ILMETHOD_TINY)
  • "FAT"(использует структуру IMAGE_COR_ILMETHOD_FAT)
TINY используется, когда метод < 64 байта, когда нет локальных переменных, а также нет SEH-обработчиков(блоков исключений). В остальных случаях используется FAT.
Также у методов в хедере есть флаги.
  • TINY - CodeSize
  • FAT - Flags(bits), MaxStack, CodeSize, LocalVarSigTok
Дальше у обоих методов идет тело метода ("Instuctions" as "array bytes", как раз то, что ты получаешь при вызове GetILAsByteArray()). Tiny-метод на этом заканчивается.
Но у FAT может быть padding (выравнивание) + SEH Header(флаги обработчика, структура IMAGE_COR_ILMETHOD_SECT_EH) + SEH-body (TryOffset, TryLength, HandlerOffset, HandlerLength)

Всё это ты можешь сделать сам(небольшая идея для шифровки методов :tonguewink:, такого ни у кого не будет, кроме тебя))__). Или использовать
Пожалуйста, авторизуйтесь для просмотра ссылки.
,
где не нужно заморачиваться.
 
Ты че баклан, дефективный?
Пользователь
Статус
Оффлайн
Регистрация
18 Мар 2019
Сообщения
756
Реакции[?]
64
Поинты[?]
2K
GetILAsByteArray() - это не то, о чем ты думаешь. Он копирует в массив только байты самих MSIL-инструкций.
Как выглядит полноценная структура метода:

Существует два типа метода(заголовка):
  • "TINY"(использует структуру IMAGE_COR_ILMETHOD_TINY)
  • "FAT"(использует структуру IMAGE_COR_ILMETHOD_FAT)
TINY используется, когда метод < 64 байта, когда нет локальных переменных, а также нет SEH-обработчиков(блоков исключений). В остальных случаях используется FAT.
Также у методов в хедере есть флаги.
  • TINY - CodeSize
  • FAT - Flags(bits), MaxStack, CodeSize, LocalVarSigTok
Дальше у обоих методов идет тело метода ("Instuctions" as "array bytes", как раз то, что ты получаешь при вызове GetILAsByteArray()). Tiny-метод на этом заканчивается.
Но у FAT может быть padding (выравнивание) + SEH Header(флаги обработчика, структура IMAGE_COR_ILMETHOD_SECT_EH) + SEH-body (TryOffset, TryLength, HandlerOffset, HandlerLength)

Всё это ты можешь сделать сам(небольшая идея для шифровки методов :tonguewink:, такого ни у кого не будет, кроме тебя))__). Или использовать
Пожалуйста, авторизуйтесь для просмотра ссылки.
,
где не нужно заморачиваться.
Пожалуйста, авторизуйтесь для просмотра ссылки.
в net 3.5 не доступен (
 
ldloc.s <d0t.net> stloc.s <Reversed>
Пользователь
Статус
Оффлайн
Регистрация
21 Окт 2018
Сообщения
214
Реакции[?]
337
Поинты[?]
1K

Вложения

ldloc.s <d0t.net> stloc.s <Reversed>
Пользователь
Статус
Оффлайн
Регистрация
21 Окт 2018
Сообщения
214
Реакции[?]
337
Поинты[?]
1K
И создавать нужно сначала экземпляр класса, а далее обращаться к нему:
C#:
public static Type BuildDynType() {

            Type addType = null;

            AppDomain currentDom = Thread.GetDomain();

            AssemblyName myAsmName = new AssemblyName();
            myAsmName.Name = "MyDynamicAssembly";

            AssemblyBuilder myAsmBldr = currentDom.DefineDynamicAssembly(
                myAsmName,
                AssemblyBuilderAccess.RunAndSave);

            // The dynamic assembly space has been created.  Next, create a module
            // within it.  The type Point will be reflected into this module.

            ModuleBuilder myModuleBldr = myAsmBldr.DefineDynamicModule("MyModule");

            TypeBuilder myTypeBldr =  myModuleBldr.DefineType("Adder");

            MethodBuilder myMthdBldr = myTypeBldr.DefineMethod("DoAdd",
                MethodAttributes.Public |
                MethodAttributes.Static,
                typeof(int),
                new Type[]
                    {typeof(int), typeof(int)});
            // Build the array of Bytes holding the MSIL instructions.

            byte[] ILcodes = new byte[] {
                0x02,   /* 02h is the opcode for ldarg.0 */
                0x03,   /* 03h is the opcode for ldarg.1 */
                0x58,   /* 58h is the opcode for add     */
                0x2A    /* 2Ah is the opcode for ret     */
            };
            myMthdBldr.CreateMethodBody(ILcodes, ILcodes.Length);

            addType = myTypeBldr.CreateType();

            return addType;
        }
 
Ты че баклан, дефективный?
Пользователь
Статус
Оффлайн
Регистрация
18 Мар 2019
Сообщения
756
Реакции[?]
64
Поинты[?]
2K
И создавать нужно сначала экземпляр класса, а далее обращаться к нему:
C#:
public static Type BuildDynType() {

            Type addType = null;

            AppDomain currentDom = Thread.GetDomain();

            AssemblyName myAsmName = new AssemblyName();
            myAsmName.Name = "MyDynamicAssembly";

            AssemblyBuilder myAsmBldr = currentDom.DefineDynamicAssembly(
                myAsmName,
                AssemblyBuilderAccess.RunAndSave);

            // The dynamic assembly space has been created.  Next, create a module
            // within it.  The type Point will be reflected into this module.

            ModuleBuilder myModuleBldr = myAsmBldr.DefineDynamicModule("MyModule");

            TypeBuilder myTypeBldr =  myModuleBldr.DefineType("Adder");

            MethodBuilder myMthdBldr = myTypeBldr.DefineMethod("DoAdd",
                MethodAttributes.Public |
                MethodAttributes.Static,
                typeof(int),
                new Type[]
                    {typeof(int), typeof(int)});
            // Build the array of Bytes holding the MSIL instructions.

            byte[] ILcodes = new byte[] {
                0x02,   /* 02h is the opcode for ldarg.0 */
                0x03,   /* 03h is the opcode for ldarg.1 */
                0x58,   /* 58h is the opcode for add     */
                0x2A    /* 2Ah is the opcode for ret     */
            };
            myMthdBldr.CreateMethodBody(ILcodes, ILcodes.Length);

            addType = myTypeBldr.CreateType();

            return addType;
        }
а вызвать как не подскажешь?
 
ldloc.s <d0t.net> stloc.s <Reversed>
Пользователь
Статус
Оффлайн
Регистрация
21 Окт 2018
Сообщения
214
Реакции[?]
337
Поинты[?]
1K
а вызвать как не подскажешь?
Что вызвать? Переделай под себя и всё.
Так сразу делать нельзя: MethodBuilder.CreateMethodBody(ILcodes, ILcodes.Length);
Нужно сначала выделить память(создать инстанс) ->
C#:
MethodBuilder myMthdBldr = myTypeBldr.DefineMethod("DoAdd",
                MethodAttributes.Public |
                MethodAttributes.Static,
                typeof(int),
                new Type[]
                    {typeof(int), typeof(int)});
Далее уже обращаться к myMthdBldr, у которого будет метод CreateMethodBody()
 
Ты че баклан, дефективный?
Пользователь
Статус
Оффлайн
Регистрация
18 Мар 2019
Сообщения
756
Реакции[?]
64
Поинты[?]
2K
Что вызвать? Переделай под себя и всё.
Так сразу делать нельзя: MethodBuilder.CreateMethodBody(ILcodes, ILcodes.Length);
Нужно сначала выделить память(создать инстанс) ->
C#:
MethodBuilder myMthdBldr = myTypeBldr.DefineMethod("DoAdd",
                MethodAttributes.Public |
                MethodAttributes.Static,
                typeof(int),
                new Type[]
                    {typeof(int), typeof(int)});
Далее уже обращаться к myMthdBldr, у которого будет метод CreateMethodBody()
я передал в myMthdBldr var ILcodes = typeof(Bootstrap).GetMethod("Test").GetMethodBody().GetILAsByteArray();

как мне вызвать myMthdBldr?Через invoke

P.S мне это нужно для вызова методов по типу как в Agile.net
 
ldloc.s <d0t.net> stloc.s <Reversed>
Пользователь
Статус
Оффлайн
Регистрация
21 Окт 2018
Сообщения
214
Реакции[?]
337
Поинты[?]
1K
я передал в myMthdBldr var ILcodes = typeof(Bootstrap).GetMethod("Test").GetMethodBody().GetILAsByteArray();

как мне вызвать myMthdBldr?Через invoke

P.S мне это нужно для вызова методов по типу как в Agile.net
В том типе, где создавал метод, вызываешь метод InvokeMember();
Если конкретнее:
C#:
var type = BuildDynType();
var result = type.InvokeMember("DoAdd", // название метода, который создал
                                BindingFlags.InvokeMethod, // биндинг на вызов
                                null, // биндер здесь не нужен
                                type, // тип, в котором метод
                                new object[] { 3, 5 }); // передача аргументов в метод (должны совпадать типы 1к1)
 
Ты че баклан, дефективный?
Пользователь
Статус
Оффлайн
Регистрация
18 Мар 2019
Сообщения
756
Реакции[?]
64
Поинты[?]
2K
В том типе, где создавал метод, вызываешь метод InvokeMember();
Если конкретнее:
C#:
var type = BuildDynType();
var result = type.InvokeMember("DoAdd", // название метода, который создал
                                BindingFlags.InvokeMethod, // биндинг на вызов
                                null, // биндер здесь не нужен
                                type, // тип, в котором метод
                                new object[] { 3, 5 }); // передача аргументов в метод (должны совпадать типы 1к1)
а что на счет il?что я не правильно передал?
byte[] ILcodes = typeof(Program).GetMethod("Debug").GetMethodBody().GetILAsByteArray();
 
ldloc.s <d0t.net> stloc.s <Reversed>
Пользователь
Статус
Оффлайн
Регистрация
21 Окт 2018
Сообщения
214
Реакции[?]
337
Поинты[?]
1K
Не понимаю что ты хочешь. Конкретный вопрос сформулируй. Если есть ошибка, кидай.
 
Ты че баклан, дефективный?
Пользователь
Статус
Оффлайн
Регистрация
18 Мар 2019
Сообщения
756
Реакции[?]
64
Поинты[?]
2K
Не понимаю что ты хочешь. Конкретный вопрос сформулируй. Если есть ошибка, кидай.
1617104541876.png

C#:
class Program
    {
        public static void Debug()
        {
            Console.WriteLine(1);
            Console.ReadKey();
        }

        static void Main(string[] args)
        {
            var gen = BuildDynType();
            var result = gen.InvokeMember("Debug", // название метода, который создал
                BindingFlags.InvokeMethod, // биндинг на вызов
                null, // биндер здесь не нужен
                gen, // тип, в котором метод
                null); // передача аргументов в метод (должны совпадать типы 1к1)
        }

        public static Type BuildDynType()
        {

            Type addType = null;

            AppDomain currentDom = Thread.GetDomain();

            AssemblyName myAsmName = new AssemblyName();
            myAsmName.Name = "MyDynamicAssembly";

            AssemblyBuilder myAsmBldr = currentDom.DefineDynamicAssembly(
                myAsmName,
                AssemblyBuilderAccess.Run);

            // The dynamic assembly space has been created.  Next, create a module
            // within it.  The type Point will be reflected into this module.

            ModuleBuilder myModuleBldr = myAsmBldr.DefineDynamicModule("MyModule");

            TypeBuilder myTypeBldr = myModuleBldr.DefineType("Program");

            MethodBuilder myMthdBldr = myTypeBldr.DefineMethod("Debug",
                MethodAttributes.Public |
                MethodAttributes.Static,
                typeof(int),
                new Type[]
                    {typeof(int), typeof(int)});
            // Build the array of Bytes holding the MSIL instructions.

            byte[] ILcodes = typeof(Program).GetMethod("Debug").GetMethodBody().GetILAsByteArray();
            myMthdBldr.CreateMethodBody(ILcodes, ILcodes.Length);

            var type = BuildDynType();
            

            return type;
        }
    }
 
ldloc.s <d0t.net> stloc.s <Reversed>
Пользователь
Статус
Оффлайн
Регистрация
21 Окт 2018
Сообщения
214
Реакции[?]
337
Поинты[?]
1K
Посмотреть вложение 140694

C#:
class Program
    {
        public static void Debug()
        {
            Console.WriteLine(1);
            Console.ReadKey();
        }

        static void Main(string[] args)
        {
            var gen = BuildDynType();
            var result = gen.InvokeMember("Debug", // название метода, который создал
                BindingFlags.InvokeMethod, // биндинг на вызов
                null, // биндер здесь не нужен
                gen, // тип, в котором метод
                null); // передача аргументов в метод (должны совпадать типы 1к1)
        }

        public static Type BuildDynType()
        {

            Type addType = null;

            AppDomain currentDom = Thread.GetDomain();

            AssemblyName myAsmName = new AssemblyName();
            myAsmName.Name = "MyDynamicAssembly";

            AssemblyBuilder myAsmBldr = currentDom.DefineDynamicAssembly(
                myAsmName,
                AssemblyBuilderAccess.Run);

            // The dynamic assembly space has been created.  Next, create a module
            // within it.  The type Point will be reflected into this module.

            ModuleBuilder myModuleBldr = myAsmBldr.DefineDynamicModule("MyModule");

            TypeBuilder myTypeBldr = myModuleBldr.DefineType("Program");

            MethodBuilder myMthdBldr = myTypeBldr.DefineMethod("Debug",
                MethodAttributes.Public |
                MethodAttributes.Static,
                typeof(int),
                new Type[]
                    {typeof(int), typeof(int)});
            // Build the array of Bytes holding the MSIL instructions.

            byte[] ILcodes = typeof(Program).GetMethod("Debug").GetMethodBody().GetILAsByteArray();
            myMthdBldr.CreateMethodBody(ILcodes, ILcodes.Length);

            var type = BuildDynType();
         

            return type;
        }
    }
1617125866544.png
Тут скорее твоя невнимательность. Я не думаю, что визулка не подсказала бы тебе о рекурсивном вызове
 
Ты че баклан, дефективный?
Пользователь
Статус
Оффлайн
Регистрация
18 Мар 2019
Сообщения
756
Реакции[?]
64
Поинты[?]
2K
Ты че баклан, дефективный?
Пользователь
Статус
Оффлайн
Регистрация
18 Мар 2019
Сообщения
756
Реакции[?]
64
Поинты[?]
2K
Сверху Снизу