es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Averiguando cómo convertir dynamic_array en IDA PRO a algún tipo de array en C#.

Me he topado con un problema en el que tengo que convertir un parámetro específico, que es un dynamic_array, a algún tipo de array en C#.

Ahora estamos hablando de un juego aquí, y estoy utilizando un modloader externo llamado MelonLoader que me está ayudando a inyectar mi mod de C# en él. El juego en sí está escrito en Unity (C#) pero se ha construido en C++ (IL2CPP).

He estado trasteando un poco con IDA Pro para averiguar a qué función necesitaba engancharme y encontré esta: https://i.stack.imgur.com/2ZlHL.png

Ves, la cosa es que el parámetro al que estoy intentando acceder está definido como una “estructura dynamic_array”. Le pedí ayuda a uno de mis amigos, pero lo único que dijo fue que era una “implementación simple de std::vector”.

Como dije antes, ya tengo bien el enganche, que se muestra aquí: https://i.stack.imgur.com/V33q1.png

Obtengo el IntPtr muy bien, pero necesito ayuda sobre cómo convertir esta cosa en algo que pueda usar en C#, ya sea utilizando una clase que pueda hacerlo o teniendo que reimplementarlo yo mismo, lo cual no sé nada. Si pudiera recibir orientación sobre cómo descifrar esa estructura invirtiendo el proceso de ingeniería, lo agradecería mucho.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución:

    Dado que el parámetro en cuestión está definido como una “struct dynamic_array”, es básicamente una implementación personalizada de std::vector de la biblioteca estándar de C++.

    Para poder usar este parámetro en C#, es necesario crear un envoltorio en C# para la estructura dynamic_array. Este envoltorio debe imitar la funcionalidad de la clase std::vector en C++.

    Aquí hay un enfoque posible:

    1. Crear una clase en C# llamada DynamicArray que proporcione la misma funcionalidad que un std::vector. Esta clase debe tener métodos para agregar, eliminar y acceder a los elementos del arreglo.
    2. Definir una estructura en C# que coincida con la estructura dynamic_array en C++. Esta estructura debe contener un puntero a los datos subyacentes y la longitud del arreglo.

    3. Cuando recibas un IntPtr a un parámetro dynamic_array, conviértelo en un puntero a la estructura de C# que creaste en el paso 2.

    4. Usa el IntPtr para acceder al puntero de datos y a la longitud del arreglo en la estructura de C#.

    5. Pasa el puntero de datos y la longitud a la clase DynamicArray que creaste en el paso 1, y utiliza sus métodos para manipular el arreglo.

    6. Cuando hayas terminado, crea una nueva estructura dynamic_array en el código de C++ y copia los datos de DynamicArray de vuelta en ella.

    Ten en cuenta que implementar una clase similar a std::vector en C# desde cero puede llevar mucho tiempo y propenso a errores. Puede ser más fácil utilizar una biblioteca existente como el espacio de nombres System.Collections.Generic o la biblioteca de código abierto SharpDX, que proporciona una clase NativeArray que se puede utilizar para la interoperabilidad entre código C# y C++.

Comments are closed.