Autor
|
Tema: Llamadas a ASM desde C (Leído 4,524 veces)
|
fary
|
Hola a todos, Tengo una DLL creada en FASM y llamo a las funciones desde C pero me devuelve un error 0xC0000005 mi aplicacion y se cierra. Para llamarla desde C lo ago así: typedef (WINAPI * DLLCargada) (DWORD sock); DLLCargada ShellDLLCargada; ShellDLLCargada = (DLLCargada)GetProcAddress(Shell,"DLLCargada"); ShellDLLCargada(sock);
y las funciones en la DLL están hechas así: DLLCargada: ; parametro sock ; informamos que la DLL esta cargada correctamente. push ebp mov ebp,esp mov eax,dword[esp+8] invoke send,eax,CargadaOk,20,0 leave ret
La aplicación me peta y nose porque creo que es por la pila que no la arreglo bien o algo desde el ASM ayuda un saludo!
|
|
|
En línea
|
Un byte a la izquierda.
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.937
Israel nunca torturó niños, ni lo volverá a hacer.
|
|
|
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
fary
|
Hola EI, gracias por responder. La aplicación sigue dando el mismo error... DLLCargada: ; parametro sock ; informamos que la DLL esta cargada correctamente. push ebp mov ebp,esp invoke LoadLibraryA,mKernel32 ; cargamos las librerias mov [Kernel32],eax invoke LoadLibraryA,mWinsock mov [Winsock],eax stdcall mGetProc,[Winsock],hsend ; EAX = send@winsock mov edx,dword[esp+8] stdcall eax,edx,CargadaOk,20,0 ;invoke send,edx,CargadaOk,20,0 leave ret 4
En la función mGetProc hago ret 8 tambien y nada... estoy ya un poco desesperado
|
|
« Última modificación: 10 Marzo 2013, 19:31 pm por mDrinky »
|
En línea
|
Un byte a la izquierda.
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.937
Israel nunca torturó niños, ni lo volverá a hacer.
|
Bueno ese codigo ya es bastante diferente, depuralo linea por linea ya que ahora no hay forma de que lo haga yo sin tener que esforzarme (no se bien que hace mGetProc y sinceramente no tengo ganas de crear todo el codigo necesario en FASM).
EDITO: llamando a GetProcAddress funciona bien, siempre que hsend sea una cadena con send como texto claro ...
|
|
« Última modificación: 10 Marzo 2013, 20:11 pm por Eternal Idol 7D »
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
fary
|
mGetProc retorna la dirección de una API pasandole la librería y un hash de la cadena de la funcion. Solo explota cuando lo lamo desde C si genero un exe con el mismo código ASM y llamo a las funciones no explota, creo que es por las convenciones de llamada o algo pero no acabo de atinar
|
|
|
En línea
|
Un byte a la izquierda.
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.937
Israel nunca torturó niños, ni lo volverá a hacer.
|
Depuralo con WinDbg (en teoria estas usando stdcall en ambos lados), asi sabras exactamente cual es el problema, siempre es mas rapido para resolver un problema conocerlo.
|
|
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
Arkangel_0x7C5
Desconectado
Mensajes: 361
|
con el primer codigo si eliminas el winapi de la declaracion tiene que solucionarse el error de la convencion de llamadas
Saludos
|
|
|
En línea
|
|
|
|
fary
|
Ya solucione el problema, era porque rompia registros que no podia tocar con la convencion de llamada stdcall. Gracias EI jaja
|
|
|
En línea
|
Un byte a la izquierda.
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.937
Israel nunca torturó niños, ni lo volverá a hacer.
|
De nadas
|
|
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
|
|