CallApi Error

Consultas sobre el lenguaje Pauscal

CallApi Error

Notapor PowerDeath » Vie Jul 18, 2014 11:05 am

Estoy tratando de traducir una función que encontré dentro de un stub, quiero implementarla a Pauscal y tengo problemas con una DLL

Se llama al procedimiento "LlamarAPI" y SE pasan los parámetros por una matriz entero.

El problema surge con la api CallWindowProc, Por alguna razón me da un error en tiempo de ejecución sin importar que haga.

¿Alguna sugerencia?

Código: Seleccionar todo
Importar "Utiles.prp"
Importar "Cadena.prp"

Proc RtlMoveMemory(Destination,Source,Lenght:Entero), "Kernel32.dll" "RtlMoveMemory"
Proc LoadLibraryA(lpLibFileName:Cadena):Entero, "Kernel32.dll"
Proc CallWindowProc(addr,p1,p2,p3,p4:Entero):Entero, "User32.dll" "CallWindowProcA"
Proc GetProcAddress(hModule:Entero,lpProcName:Cadena):Entero, "Kernel32.dll"

Proc MEMMoverMemoria(Destination,Source,Lenght:Entero)
RtlMoveMemory(Destination@,Source@,Lenght)
FinProc

Proc LlamarAPI(sLib,sMod:Cadena,Parametros[]:Entero):Entero
Var OKMJI:Entero,C,A:Entero
Var EDCVFR[&EC00 - 1]:Byte
Var i:Entero
Var WERDF:Entero

WERDF = GetProcAddress(LoadLibraryA(sLib),sMod)
Si WERDF = 0 Salir

OKMJI = EDCVFR[0]@
'Mensaje(EntCad(OKMJI) + Crlf + EntCad(&59595958))
MEMMoverMemoria(OKMJI, &59595958,&4)
 OKMJI = OKMJI + 4
MEMMoverMemoria(OKMJI, &5059, &2)
 OKMJI = OKMJI + 2
Contar i = Límite(Parametros) a 0 Dec
   Si i = 0 Salir Contar
   MEMMoverMemoria(OKMJI, &68, &1)
   OKMJI = OKMJI + 1
   'Mensaje(EntCad(Parametros[i]) + Crlf + Crlf + EntCad(i))
   MEMMoverMemoria(OKMJI,Parametros[i],&4)
   OKMJI = OKMJI + 4
Seguir
MEMMoverMemoria(OKMJI, &E8, &1)
 OKMJI = OKMJI + 1
MEMMoverMemoria(OKMJI, WERDF - OKMJI - 4, &4)
 OKMJI = OKMJI + 4
MEMMoverMemoria(OKMJI, &C3, &1)
 OKMJI = OKMJI + 1
AdmErr
CallWindowProc(EDCVFR[0]@,0,0,0,0)
Controlar A
   Mensaje(EntCad(A))
FinAdmErr
FinProc

Var A[]:Entero
'int WINAPI MessageBox(
'  _In_opt_  HWND hWnd,
'  _In_opt_  LPCTSTR lpText,
'  _In_opt_  LPCTSTR lpCaption,
'  _In_      UINT uType
');
ReDim A,4
A[0] = 0
A[1] = CadPtr("Hola Mundo")
A[2] = CadPtr("Hollaaa")
A[3] = 0
LlamarAPI("User32.dll","MessageBoxA",A)
Imagen
PowerDeath
 
Mensajes: 160
Registrado: Sab Ago 11, 2012 5:29 am

Sponsor


Re: CallApi Error

Notapor ErikH » Vie Jul 18, 2014 4:43 pm

No he tenido oportunidad de probar el código. Pero un problema que veo es en la declaración de MEMMoverMemoria(), cuando mandas llamar RtlMoveMemory() le estas pasando punteros aquí:

Código: Seleccionar todo
OKMJI = EDCVFR[0]@
'Mensaje(EntCad(OKMJI) + Crlf + EntCad(&59595958))
MEMMoverMemoria(OKMJI, &59595958,&4)


Se arregla quitando la dirección a puntero.

Código: Seleccionar todo
Proc MEMMoverMemoria(Destination,Source,Lenght:Entero)
RtlMoveMemory(Destination,Source@,Lenght)
FinProc


De la otra manera le estas enviando una especie de lista enlazada. (=pp) Es un puntero a un entero, cuyo valor es otro puntero.

Para no quitar los punteros, supongo que también podrías llamarlo así:
Código: Seleccionar todo
MEMMoverMemoria(EDCVFR[0], &59595958,&4)


Después lo reviso con mas calma, tal vez puedas postear el código del stub.
ImagenEntrá a la wiki en OpenShift
Colofox!!!!
ErikH
 
Mensajes: 151
Registrado: Jue Nov 29, 2007 11:24 pm
Ubicación: Algún lugar de México

Re: CallApi Error

Notapor PowerDeath » Vie Jul 18, 2014 5:16 pm

El stub esta echo en VB6 y quiero traducir la función CallApi

Crypter

La función fue traducida de la manera mas parecida posible, también me di cuenta de que podría llamarlo así:

Código: Seleccionar todo
MEMMoverMemoria(EDCVFR[0], &59595958,&4)


Pero quiero dejar el código intacto para luego poder optimizarlo.

Sobre el siguiente codigo:

Código: Seleccionar todo
Proc MEMMoverMemoria(Destination,Source,Lenght:Entero)
RtlMoveMemory(Destination,Source@,Lenght)
FinProc

También había pensado esto, pero cuando le quitaba el arroba en frente de "Destination" me producía un error en memoria al llegar a la segunda llamada al procedimiento "MEMMoverMemoria".
Código: Seleccionar todo
Proc LlamarAPI(sLib,sMod:Cadena,Parametros[]:EnteroSig):Entero
Var OKMJI:Entero
Var EDCVFR[&EC00 - 1]:Byte
Var i:Entero
Var WERDF:Entero

WERDF = GetProcAddress(LoadLibraryA(sLib),sMod)
Si WERDF = 0 Salir

OKMJI = EDCVFR[0]@
MEMMoverMemoria(OKMJI, &59595958, &4); OKMJI = OKMJI + 4 ' ACA ANDA BIEN.
MEMMoverMemoria(OKMJI, &5059, &2); OKMJI = OKMJI + 2 ' <<<<<<<<<<<<<ERROR
Contar i = Límite(Parametros) a 0 Dec
   Si i = 0 Salir Contar ' <<<<<<<<<< SIN ESTA SENTENCIA EL BUCLE SIGUE INFINITAMENTE ._.
   MEMMoverMemoria(OKMJI, &68, &1); OKMJI = OKMJI + 1
   MEMMoverMemoria(OKMJI, Parametros[i], &4); OKMJI = OKMJI + 4
Seguir
MEMMoverMemoria(OKMJI, &E8, &1); OKMJI = OKMJI + 1
MEMMoverMemoria(OKMJI, WERDF - OKMJI - 4, &4); OKMJI = OKMJI + 4
MEMMoverMemoria(OKMJI, &C3, &1); OKMJI = OKMJI + 1
Resultado = CallWindowProc(EDCVFR[0]@,0,0,0,0)
FinProc
Imagen
PowerDeath
 
Mensajes: 160
Registrado: Sab Ago 11, 2012 5:29 am

Re: CallApi Error

Notapor ErikH » Sab Jul 19, 2014 7:35 am

Código: Seleccionar todo
Importar "Utiles.prp"
Importar "Cadena.prp"

Proc MoverM(Destination,Source,Length:Entero), "Kernel32" "RtlMoveMemory"
Proc LoadLibraryA(lpLibFileName:Cadena):Entero, "Kernel32" "LoadLibraryA"
Proc CallWindowProc(addr,p1,p2,p3,p4:Entero):Entero, "User32" "CallWindowProcA"
Proc GetProcAddress(hModule:Entero,lpProcName:Cadena):Entero, "Kernel32" "GetProcAddress"

Proc MEMMoverMemoria(Destination,Source,Lenght:Entero)
MoverM(Destination@,Source@,Lenght)
FinProc

Unión PP, s:Entero, m[4]:Byte, w[2]:Word

Proc LlamarFn(dll:Cadena,fn:Cadena,param[]:Entero)
  var bvASM[]:Byte
  var lPtr,lMod,Loadl,h:Entero
  var i:EnteroSig
  var @p:PP
 
  Redim bvASM, 60415'&EC00-1
 
  Loadl = LoadLibraryA(dll)
  Si Loadl = 0 Entonces Salir
  lMod = GetProcAddress(Loadl, fn)
  Si lMod = 0 Entonces Salir
 
  lPtr = bvASM[0]@
 
  p@ = bvASM[0]@
 
  p.s = &59595958'MoverM(bvASM[0]@,&59595958,&4)
  p@ = p@ + 4'lPtr = lPtr + 4
  p.w[0] = &5059'MoverM(lPtr,&5059,2)
  p@ = p@ + 2'lPtr = lPtr + 2
  Contar i = Límite(param) A 0 Dec
     Si i = -1 Salir Contar
     p.m[0] = &68'MoverM(lPtr,&68,1)
     p@ = p@ + 1'lPtr = lPtr + 1
     p.s = param[i]'MoverM(lPtr,param[i],4)
     p@ = p@ + 4'lPtr = lPtr + 4
  Seguir
  p.m[0] = &E8'MoverM(lPtr,&E8,1)
  p@ = p@ + 1'lPtr = lPtr + 1
  p.s = lMod - p@ - 4'MoverM(lPtr,lMod - lPtr - 4, 4)
  p@ = p@ + 4'lPtr = lPtr + 4
  p.m[0] = &C3'MoverM(lPtr,&C3,1)
  p@ = p@ + 1'lPtr = lPtr + 1 ' Este ultimo ya no se requiere XD
  h = CallWindowProc(bvASM[0]@,0,0,0,0)
FinProc

Var A[]:Entero
'int WINAPI MessageBox(
'  _In_opt_  HWND hWnd,
'  _In_opt_  LPCTSTR lpText,
'  _In_opt_  LPCTSTR lpCaption,
'  _In_      UINT uType
');
Var cad1,cad2,dll,fn:Cadena
cad1="Hola Mundo"
cad2="Hollaaa"

ReDim A,4
A[0] = 0
A[1] = CadPtr(cad1)
A[2] = CadPtr(cad2)
A[3] = 0
dll="User32.dll"
fn="MessageBoxA"
LlamarFn(dll,fn,A)



Traté con una forma alternativa a rtlmovememory(), porque me estaba fallando desde la primera vez que lo llamaba. Pero ahora el último paso no lo realiza. Pero eso es porque estoy en windows 8 y es muy quisquilloso, pruebalo en winXP.

¡Suerte!

Fuente:
Varios CallApiByName

Edición: Parece que este es el mensaje 1337 del foro. :lol:
ImagenEntrá a la wiki en OpenShift
Colofox!!!!
ErikH
 
Mensajes: 151
Registrado: Jue Nov 29, 2007 11:24 pm
Ubicación: Algún lugar de México

Re: CallApi Error

Notapor PowerDeath » Sab Jul 19, 2014 10:43 am

Excepcional
Funciónal en Windows 7 Ultimate - Service pack 1 - 32 Bits

Pero la verdad no entiendo que hiciste, ¿usaste el puntero a la unión como una forma alternativa a RtlMoveMemory?
Pregunta: ¿Puedo aportar tu código al foro UDT?
¡Saludos!
Imagen
PowerDeath
 
Mensajes: 160
Registrado: Sab Ago 11, 2012 5:29 am

Re: CallApi Error

Notapor ErikH » Sab Jul 19, 2014 1:36 pm

Creí que Win7 sería mas seguro. (=pp)

PowerDeath escribiste:...
¿usaste el puntero a la unión como una forma alternativa a RtlMoveMemory?
...

Así es, se va moviendo el puntero a lo largo de bvASM, según se vaya necesitando. Y se modifican los bytes mediante la asignación de valores en la unión.

PowerDeath escribiste:...
¿Puedo aportar tu código al foro UDT?

Si, no hay problema.

__________________________________________

Actualizacion(2014-07-26):
Otra forma sin usar callwindowproc()

Código: Seleccionar todo
Importar "Utiles.prp"
Importar "Cadena.prp"

Proc LoadLibraryA(lpLibFileName:Cadena):Entero, "Kernel32" "LoadLibraryA"
Proc GetProcAddress(hModule:Entero,lpProcName:Cadena):Entero, "Kernel32" "GetProcAddress"

Unión PP, s:Entero, m[4]:Byte, w[2]:Word

Proc LlamarFn(dll:Cadena,fn:Cadena,param[]:Entero)
  var bvASM[]:Byte
  var lPtr,lMod,Loadl:Entero
  var i:EnteroSig
  var @p:PP
  var @corre:prototipoFunción
 
  Redim bvASM, 60415'&EC00-1
 
  Loadl = LoadLibraryA(dll)
  Si Loadl = 0 Entonces Salir
  lMod = GetProcAddress(Loadl, fn)
  Si lMod = 0 Entonces Salir
 
  lPtr = bvASM[0]@
 
  p@ = bvASM[0]@
 
  p.s = &59595958
  p@ = p@ + 4
  p.w[0] = &5059
  p@ = p@ + 2
  Contar i = Límite(param) A 0 Dec
     Si i = -1 Salir Contar
     p.m[0] = &68
     p@ = p@ + 1
     p.s = param[i]
     p@ = p@ + 4
  Seguir
  p.m[0] = &E8
  p@ = p@ + 1
  p.s = lMod - p@ - 4
  p@ = p@ + 4
  p.m[0] = &C3
  corre@ = bvASM[0]@
  corre()
FinProc

Prototipo prototipoFunción()

Var A[]:Entero
'int WINAPI MessageBox(
'  _In_opt_  HWND hWnd,
'  _In_opt_  LPCTSTR lpText,
'  _In_opt_  LPCTSTR lpCaption,
'  _In_      UINT uType
');
Var cad1,cad2,dll,fn:Cadena
cad1="Hola Mundo"
cad2="Hollaaa"

ReDim A,4
A[0] = 0
A[1] = CadPtr(cad1)
A[2] = CadPtr(cad2)
A[3] = 0
dll="User32.dll"
fn="MessageBoxA"
LlamarFn(dll,fn,A)


Lamentablemente, o afortunadamente, según como se vea, tampoco funciona en Win8.
ImagenEntrá a la wiki en OpenShift
Colofox!!!!
ErikH
 
Mensajes: 151
Registrado: Jue Nov 29, 2007 11:24 pm
Ubicación: Algún lugar de México

Re: CallApi Error

Notapor PowerDeath » Lun Ago 04, 2014 6:06 am

Buena actualizacion, En el 7 si funca, saludos
Imagen
PowerDeath
 
Mensajes: 160
Registrado: Sab Ago 11, 2012 5:29 am

Re: CallApi Error

Notapor jmetin2 » Mar Oct 28, 2014 6:12 pm

Ey esta genial!

Vere si lo puedo adaptar a mi runPe
:)
jmetin2
 
Mensajes: 168
Registrado: Jue Dic 15, 2011 12:07 pm
Ubicación: Merida, Yucatan, Mexico


Volver a Dudas, Preguntas y Respuestas

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados

cron