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.

Llamando a una función no exportada en una DLL en Python

Estoy trabajando en Python e intentando ejecutar una función DLL. Puedo lograr ejecutar funciones por sus nombres si están expuestas:

# Cargar DLL en memoria.
hllDll = ctypes.WinDLL("mydll.dll")

# Configurar el prototipo y los parámetros para la llamada a la función deseada.
hllApiProto = ctypes.WINFUNCTYPE(
    ctypes.c_int,      # Tipo de retorno.
    ctypes.c_void_p,   # Parámetros 1 ...
    ctypes.c_void_p,
    ctypes.c_void_p,
    ctypes.c_void_p   # ... a través de 4.
)

hllApiParams = (1, "p1", 0), (1, "p2", 0), (1, "p3", 0), (1, "p4", 0)

# De hecho, mapear la llamada ("HLLAPI(...)") a un nombre en Python.
hllApi = hllApiProto(("HLLAPI", hllDll), hllApiParams)

hllApi(p1, p2, p3, p4)

Pero me gustaría crear un “funcptr” a una dirección de una función no exportada.

En C++ podemos hacer eso, por ejemplo, de esta manera (si no me equivoco):

FUNCPTR(MYDLL, myFuncName, DWORD __stdcall, (DWORD arg1, DWORD arg2, DWORD arg3), <addr>)

¿Alguien sabe cuál es el equivalente de esta función en Python?

¡Gracias!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para crear un puntero de función a una dirección de una función no exportada en Python utilizando ctypes, puedes usar el siguiente código:

    # Cargar la DLL en la memoria.
    hllDll = ctypes.WinDLL("mydll.dll")
    
    # Configurar el prototipo del puntero de función.
    myFuncNameProto = ctypes.WINFUNCTYPE(
      ctypes.c_int,    # Tipo de retorno.
      ctypes.c_uint32, # Parámetro 1.
      ctypes.c_uint32, # Parámetro 2.
      ctypes.c_uint32  # Parámetro 3.
    )
    
    # Crear un puntero de función a la dirección de la función no exportada.
    myFuncPtr = ctypes.cast(ADDRESS, myFuncNameProto)
    
    # Llamar la función no exportada utilizando el puntero de función.
    myFuncPtr(arg1, arg2, arg3)
    

    Reemplaza ADDRESS con la dirección de memoria de la función no exportada. Ten en cuenta que necesitarás saber la dirección de memoria exacta de la función de antemano, lo cual puede requerir ingeniería inversa o depurar la DLL.

Comments are closed.