Archive
Construyendo tipos de datos de C con ctypes
Seguimos con estos post dedicados a python y su libreria ctypes. En este caso voy a dar algunos ejemplos para saber que tipo de datos usar en cada variable que criemos.
Hago esto… porque yo como muchos reversers estoy acostumbrado a ver todo como BYTE, WORD, DWORD. Ya cuando me agregan palabras como punteros o integer, ya me rompe la paciencia 😛 por eso vamos a ver que tamaño le da a cada cosa nuestra querida librería de python.
Esta es la lista de estructura de datos que nos provee el librito “Gray Hat Python“:
C Type | Python Type | ctypes Type |
---|---|---|
char | 1-character string | c_char |
wchar_t | 1-character Unicode string | c_wchar |
char | int/long | c_byte |
char | int/long | c_ubyte |
short | int/long | c_short |
unsigned short | int/long | c_ushort |
int | int/long | c_int |
unsigned int | int/long | c_uint |
long | int/long | c_long |
unsigned long | int/long | c_ulong |
long long | int/long | c_longlong |
unsigned long long | int/long | c_ulonglong |
float | float | c_float |
double | float | c_double |
char * (NULL terminated) | string or none | c_char_p |
wchar_t * (NULL terminated) | unicode or none | c_wchar_p |
void * | int/long or none | c_void_p |
Calling conventions y ctypes
Comencé a leer el libro “Gray Hat Python” y ya comenzamos con escollos por el camino, como no podía ser de otra manera… el primer ejemplo que se me ocurrió probar me tiraba un error.
En estas poquitas lineas voy a dejar documentado como fue que la safe, para que a nadie le suceda de nuevo.
Tal vez el error se dio porque me apure a agarrar el interprete, antes de documentarme bien acerca de ctypes y python. Pero hay veces que leer tanto le quita la gracia, y uno quiere probar rápidamente si tal o cual cosa sirve para sus propósitos ❗
Recién comencé con el capitulo 2 y me tope con ctypes, una librería que no conocía y que provee la funcionalidad de usar .dll’s desde el mismo código de python. No hace falta decir lo valioso que puede ser para nosotros tener este poder al alcance de la mano.
En el libro tenemos el siguiente ejemplo:
from ctypes import * msvcrt = cdll.msvcrt message_string = "Hello world!\n" msvcrt.printf("Testing: %s", message_string)
ahí nomas sin dudarlo, agarre la consola interactiva y me dispuse a probar ese ejemplo.