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.
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 clasestd::vector
en C++.Aquí hay un enfoque posible:
DynamicArray
que proporcione la misma funcionalidad que unstd::vector
. Esta clase debe tener métodos para agregar, eliminar y acceder a los elementos del arreglo.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.Cuando recibas un
IntPtr
a un parámetrodynamic_array
, conviértelo en un puntero a la estructura de C# que creaste en el paso 2.Usa el
IntPtr
para acceder al puntero de datos y a la longitud del arreglo en la estructura de C#.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.Cuando hayas terminado, crea una nueva estructura
dynamic_array
en el código de C++ y copia los datos deDynamicArray
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 nombresSystem.Collections.Generic
o la biblioteca de código abiertoSharpDX
, que proporciona una claseNativeArray
que se puede utilizar para la interoperabilidad entre código C# y C++.