Novedades

Ayuda Ayuda con funciones thiscall en IDA



Desde
29 Abr 2020
Mensajes
5
Buenas amigos :)
Tengo una duda... Así me encuentro las funciones normalmente en IDA:
C++:
Por favor, Acceder o Regístrate para ver el contenido de los códigos!

Y las uso de esta forma:
C++:
Por favor, Acceder o Regístrate para ver el contenido de los códigos!

Hasta aquí todos contentos... el caso es que esta vez me he encontrado con esto:
C++:
Por favor, Acceder o Regístrate para ver el contenido de los códigos!

Entiendo la primera definición (devolver void, calling convention es thiscall, la dirección de la función, el puntero a la clase ya que es thiscall, y los parámetros de la función.
Pero la segunda definición no la entiendo... :(

No sé como llamar a la segunda función... ¿Alguien sabría explicarme que significa ese tipo de declaración y cómo debería usarla?is...

Mil gracias <3
 
Última edición por un moderador:
Por favor, Acceder o Regístrate ¡para ver el contenido de la cita!
no puedes declarar un prototipo de funcion directamente con esta convencion de llamada, no esta permitido, lo que si puedes hacer, es declarar con la convencion de __fastcall, cual es la diferencia? bueno fastcall hace exactamente lo que hace thiscall, simplemente es que debes recivir a EDX como segundo parametro de la funcion, despues siguen los parametros normalmente de la stack
Por favor, Acceder o Regístrate ¡para ver el contenido de la cita!
se veria asi:
Código:
Por favor, Acceder o Regístrate para ver el contenido de los códigos!
Por favor, Acceder o Regístrate ¡para ver el contenido de la cita!
la segunda funcion, seria un prototipo similar, sobre el tipo de dato _DWORD, si estas en 32 bits es de 4 bytes que lo podrias representar facilmente con un uint32_t, lo mismo en 64 bits, uint64_t, o simplemente unsigned int o void*, independientemente de la plataforma
el prototipo de la segunda se veria asi:
Código:
Por favor, Acceder o Regístrate para ver el contenido de los códigos!
 
Hola @Extasis gracias por tu respuesta.
El caso es que siempre he usado __thiscall y siempre me ha funcionado:

1652906337536.png
Todas esas funciones me van perfectamente en el juego, excepto la última. Por lo que no entiendo que no está permitido, a mi me funciona... Si no me equivoco a partir de vc++ 2015 se puede.

¿Entonces simplemente la diferencia de una declaración a otra es que esta última devuelve un puntero a un dword y que el parámetro que instancia la clase es un puntero a un puntero?
 
Última edición por un moderador:
Lo he solucionado! Al final tenía que declarar la función de esta forma:

C++:
Por favor, Acceder o Regístrate para ver el contenido de los códigos!

El error ha sido confiar únicamente en los resultados de IDA y no revisar Ghidra.

Tras revisar con Ghidra he encontrado el camino :)

Esta es la call desde mi dll por si a alguien le interesa:


C++:
Por favor, Acceder o Regístrate para ver el contenido de los códigos!
 
Última edición:
Atrás
Arriba