@daniil14056

Как определить размер функции в байтах Машиного кода?

c# или с++, или c# c dllImport, там вроде есть какие-то функции
Почему не получается сделать самому.
public  static   void test1()
    {
        a = a + b;
    } 
    unsafe static void Main(string[] args)
    {
        delegate*<void> funcDelegate 
            = (delegate*<void>)typeof(Program).GetMethod("test1").MethodHandle.GetFunctionPointer();
       funcDelegate ();

          ///  Это точно не байты функции. И вообще не могу понять что за байты
     nint  address= (nint)funcDelegate ;
    Console.WriteLine(Marshal.ReadByte(address + 0).ToString("x16"));
            Console.WriteLine(Marshal.ReadByte(address + 1).ToString("x16"));
            Console.WriteLine(Marshal.ReadByte(address + 2).ToString("x16"));
            Console.WriteLine(Marshal.ReadByte(address + 3).ToString("x16"));
            Console.WriteLine(Marshal.ReadByte(address + 4).ToString("x16"));
            Console.WriteLine(Marshal.ReadByte(address + 5).ToString("x16"));
            Console.WriteLine(Marshal.ReadByte(address + 6).ToString("x16"));
            Console.WriteLine(Marshal.ReadByte(address + 7).ToString("x16"));
            Console.WriteLine(Marshal.ReadByte(address + 8).ToString("x16"));
            Console.WriteLine(Marshal.ReadByte(address + 9).ToString("x16"));
            Console.WriteLine(Marshal.ReadByte(address + 10).ToString("x16"))
      size++;
  }

Что такое funcDelegate, точнее что за адрес он хранит, как от него перейти к байтам кода.
mov         rax,qword ptr [rbp-10h]  
call        rax

Вот я вижу такое до вызова, почему переход происходит не на значения rax?
Значение rax 0x00007FFE532cc000
А след инструкция после call rax -> PC = 00007FFE53204560 ? // не тот адрес немного.
Почему переход в другое место
Как получить машинный байт код функции? Я знаю что ее длина там от 10 20 байтов, и последний байт
0xC3, хотя 100% уже ожидаю след ошибки. Есть ли какие-то библиотеки?
Что бы определить машинный код функции, и затем как можно объединить 2 функции в одну.
void fun1(){ count++;} 
  void fun2(){ count--;}

Как из них одну функцию сделать в Машином коде.
  • Вопрос задан
  • 153 просмотра
Пригласить эксперта
Ответы на вопрос 3
saboteur_kiev
@saboteur_kiev
software engineer
Язык программирования тебе это не подскажет. Он не знает.
Об этом может знать компилятор, но для компиляторов такой "функции" как get_machinecode_instruction_length нету. Компилятор может генерировать не прямой код трансляции команд С++ в машинный код. Он может оптимизировать вызовы под конкретный процессор/архитектуру, по опциям для оптимизации загрузки данных в память и так далее.
Просто посмотреть машинные коды - нужно читать datashit конкретной архитектуры, они более-менее стабильные.
Ответ написан
Комментировать
mayton2019
@mayton2019
Bigdata Engineer
Такой функции скорее всего не существует. Тут как в парадоксе про пудинг. Чтобы узнать хороший он или
нет - его надо сьесть. Вот чтобы узнать длину машинного кода нужно провести этот код по всем стадиям
компилляции
. А судя по внешнему виду это не С++. Это DotNet поэтому здесь будет минимум 2 стадии.
DotNet => MSIL. И потом уже в машинный код. Подозреваю что длина машинного кода будет
зависеть от версии DotNet, от разрядности платформы 32/64 и от целевой железной архитектуры
Intel/ARM e.t.c.

Вот такое получается уравнение со многими неизвестными. И его решить можно только практически.
Компиллируем. Смотрим. Считаем. Если нудно считать - автоматизируем подсчет функции.
Ответ написан
Комментировать
yarosroman
@yarosroman Куратор тега C#
C# the best
https://stackoverflow.com/questions/18836120/using...

https://habr.com/ru/articles/464931/

Только зачем, с трудом потом ошибки ловить? Если есть нужда в динамическом коде, то есть в шарпе кодогенерация.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы