[AYUDA] Como hacer call y significado: DWORD *thiscall

Estado
Cerrado para nuevas respuestas.
Registrado
29 Abr 2020
Mensajes
5
Buenas amigos :)
Tengo una duda... Así me encuentro las funciones normalmente en IDA:
C++:
Please, Acceder or Regístrate to view codes content!

Y las uso de esta forma:
C++:
Please, Acceder or Regístrate to view codes content!

Hasta aquí todos contentos... el caso es que esta vez me he encontrado con esto:
C++:
Please, Acceder or Regístrate to view codes content!

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:
  • Like
Reacciones: Mstik

Mstik

Moderador
Registrado
4 May 2021
Mensajes
44
Please, Acceder or Regístrate to view quote content!
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
Please, Acceder or Regístrate to view quote content!
se veria asi:
Código:
Please, Acceder or Regístrate to view codes content!
Please, Acceder or Regístrate to view quote content!
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:
Please, Acceder or Regístrate to view codes content!
 
Registrado
29 Abr 2020
Mensajes
5
Please, Acceder or Regístrate to view quote content!
Hola @Mstik 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?
 
Registrado
29 Abr 2020
Mensajes
5
Lo he solucionado! Al final tenía que declarar la función de esta forma:

C++:
Please, Acceder or Regístrate to view codes content!

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++:
Please, Acceder or Regístrate to view codes content!
 
Última edición:
  • Like
Reacciones: c0de y Mstik
Estado
Cerrado para nuevas respuestas.