Título: [PREGUNTA] Convertir una declaracion API de C# a VB6 (problema con punteros) Publicado por: el_c0c0 en 16 Marzo 2012, 19:01 pm Buenas, la pregunta es simple. Tengo una api declarada en C# (en una clase).. y la quiero pasar a VB6. Es stdcall por lo que probe, asi que no habria dramas.
El tema es que usa un puntero a un array de bytes, y probe de mil y 1 formas y sigue crasheando. Código
probe con cada caso de estas declaraciones: Código
con sus respectivos varptr al array de bytes (en los casos que hay ByVal). tambien probe con VarPtrArray, y lo mismo... hasta hice un odl: (obviamente era 1 solo, no todos juntos) Código: [entry("ReadDataFromTPM")] y sigue crasheando... Recalco que, el error NO ES DE CONVERSION DE LLAMADAS NO VALIDO (se ve que no es cdecl). el tamaño del array de bytes esta bien, viene de esto: Código y originalmente se llama asi: Código
apreciaria ayuda... saludos Título: Re: [PREGUNTA] Convertir una declaracion API de C# a VB6 (problema con punteros) Publicado por: x64core en 17 Marzo 2012, 09:35 am Y esa DLL adonde la encuentro? :P subirla
has probado con esto: Código: Private Declare Function ReadDataFromTPM Lib "TPMCtrl_WinBond.dll" (UserData As any) As Long Código: dim mybytes(9) as byte Título: Re: [PREGUNTA] Convertir una declaracion API de C# a VB6 (problema con punteros) Publicado por: Karcrack en 17 Marzo 2012, 12:42 pm Código
Código
Sería equivalente al code de RHL pero sin necesidad de llamar a VarPtr()... tal y como está aquí arriba debería de funcionarte a la perfección. Título: Re: [PREGUNTA] Convertir una declaracion API de C# a VB6 (problema con punteros) Publicado por: el_c0c0 en 18 Marzo 2012, 00:28 am Hola , gracias por responder @Karcrack y @RHL.
Probe de las 2 formas recien (antes ya las habia probado), y sigue explotando. La dll la puedo subir, no hay drama. El tema es que no funciona si no se ejecuta bajo una Classmate netbook (por el acceso a drivers del TPM). Basicamente ya no entiendo mas nada!!! O bien el codigo fuente en el que me estoy basando esta mal, o no se. (Tecnicamente esta bien, ya que esa aplicacion funciona). Me es dificil andar debugueando con el olly, porque las llamadas en C# se generan en el framework, y no en el .exe principal. Gracias Título: Re: [PREGUNTA] Convertir una declaracion API de C# a VB6 (problema con punteros) Publicado por: Karcrack en 18 Marzo 2012, 15:21 pm Comprueba que realmente la convención de llamada sea __stdcall. Comprueba también que la DLL generada por C# sea una librería estándar (no ActiveX).
Título: Re: [PREGUNTA] Convertir una declaracion API de C# a VB6 (problema con punteros) Publicado por: el_c0c0 en 18 Marzo 2012, 20:47 pm @Karcrack:
Si la declaracion del C# esta asi, yo asumo que es stdcall. Ademas, llamo a otras funciones que NO llevan parametros y devuelven siempre lo mismo (y no joden el stack). Ademas NO ES ActiveX: (http://i.minus.com/jRyeeFu1jDpJ2.png) (http://minus.com/mlhbJdYlE#1o) PD: la DLL mencionada NO ESTA hecha en C#... La aplicacion que la usa, SI. Voy a probar de hacer algo en C# que llame a esa dll, para ver que onda... Realmente me tiene atonito esto Título: Re: [PREGUNTA] Convertir una declaracion API de C# a VB6 (problema con punteros) Publicado por: el_c0c0 en 18 Marzo 2012, 22:35 pm Bueno, creo que ya esta. Probe con el modulo cCDECL de Paul Caton, y no explota. Esto fue gracias al IDA, porque no veia que se popearan los parametros, o que se usara retn xxx.
Gracias y disculpas por la molestia... Proximamente vamos a estar probando esto en el foro de seguridad, referido a las Netbooks del Gobierno (argentina) y otras netbooks basadas en Intel Classmate. Gracias Título: Re: [PREGUNTA] Convertir una declaracion API de C# a VB6 (problema con punteros) Publicado por: x64core en 18 Marzo 2012, 22:58 pm Yo no veo que en la imagen diga nada de stdcall o la convencion de llamada :P
Y que yo sepa siempre se eliminan los parametros al retorno con la RETN Título: Re: [PREGUNTA] Convertir una declaracion API de C# a VB6 (problema con punteros) Publicado por: el_c0c0 en 19 Marzo 2012, 00:22 am Yo no veo que en la imagen diga nada de stdcall o la convencion de llamada :P Y que yo sepa siempre se eliminan los parametros al retorno con la RETN No, yo me referia a la declaracion de C#... no dice CDECL (y las llamadas a APIs comunes, se declaran igual... por eso, pense que era STDCALL). 2º, en el RETN no se eliminaban los parametros, pero arriba del RETN habia varios POP, que luego vi que no tenian nada que ver con el stack... Misteriosamente el VB no decia nada de la convencion de llamadas (normalmente lo hace)... Título: Re: [PREGUNTA] Convertir una declaracion API de C# a VB6 (problema con punteros) Publicado por: x64core en 19 Marzo 2012, 02:20 am No, yo me referia a la declaracion de C#... no dice CDECL (y las llamadas a APIs comunes, se declaran igual... por eso, pense que era STDCALL). 2º, en el RETN no se eliminaban los parametros, pero arriba del RETN habia varios POP, que luego vi que no tenian nada que ver con el stack... Misteriosamente el VB no decia nada de la convencion de llamadas (normalmente lo hace)... Es raro entonces es como decir que la funcion esta mal porque el RETN forma parte de ella :silbar: pues los POP por algo deben estar no seguramente usaba registros o variables locales... cuanto era el valor de RETN? Título: Re: [PREGUNTA] Convertir una declaracion API de C# a VB6 (problema con punteros) Publicado por: el_c0c0 en 19 Marzo 2012, 02:22 am Es raro entonces es como decir que la funcion esta mal porque el RETN forma parte de ella :silbar: pues los POP por algo deben estar no seguramente usaba registros o variables locales... cuanto era el valor de RETN? Ninguno. es un RETN solo. Ademas, el IDA decia bp-based frame... por ende, es CDECL. Era un poco ambiguo para mi (primera vez que me pasa esto, sin que el VB diga lo de "Convencion de llamadas no valido"). En fin, ahora resta descubrir la declaracion de una funcion que exporta, pero no esta declarada en el codigo de C#. Título: Re: [PREGUNTA] Convertir una declaracion API de C# a VB6 (problema con punteros) Publicado por: x64core en 19 Marzo 2012, 02:25 am Ninguno. es un RETN solo. Ademas, el IDA decia bp-based frame... por ende, es CDECL. Era un poco ambiguo para mi (primera vez que me pasa esto, sin que el VB diga lo de "Convencion de llamadas no valido"). En fin, ahora resta descubrir la declaracion de una funcion que exporta, pero no esta declarada en el codigo de C#. ningun valor en el RETN? se supone que debe de haber un RETN 04h que es el puntero al array... sin poder ver codigo ni nada a lo mucho que llega uno es adivinando :P prueba modificando a RETN 04h... Esperemos a que dice Karcrack :) muestra el desemsamblado Título: Re: [PREGUNTA] Convertir una declaracion API de C# a VB6 (problema con punteros) Publicado por: el_c0c0 en 19 Marzo 2012, 02:50 am ningun valor en el RETN? se supone que debe de haber un RETN 04h que es el puntero al array... sin poder ver codigo ni nada a lo mucho que llega uno es adivinando :P prueba modificando a RETN 04h... Esperemos a que dice Karcrack :) muestra el desemsamblado Nop. Como es CDECL, el RETN no tiene nada... es decir, si uno prepara el stack previo a la llamada, uno mismo debe hacer pop por cada parametro. Entonces la DLL no los quita del stack al volver... En fin, el desensamblado (parcial, solo de la funcion que no se si estoy pasandole bien los argumentos) esta aqui: http://pastebin.com/yb5Jeu7y No esta entero. Pero es igual a la funcion por la cual cree el post. La dll por si te interesa, esta aca http://www.mediafire.com/?c8movap40k83qra Si no estan instalados los drivers, va a tirar error al llamar a cualquier funcion, ya que no se carga siquiera. Título: Re: [PREGUNTA] Convertir una declaracion API de C# a VB6 (problema con punteros) Publicado por: x64core en 19 Marzo 2012, 09:44 am Entonces no es stdcall se supone que si era stdcall, Bueno revisando un poco la funcion yo encontre
el codigo siguiente, se supone que es llamar a la funcion ReadDataFromTPM ... El Codigo del pastebin que subiste es el de la funcion ReadCertFromTPM... Código: X_100033F0: push ebp el parametro se recupera aquí: Código: X_1000341B: mov esi, [ebp+0x8] se tendria que depurar para ver adonde se pierde la pila ED: bueno igual ahora que releo los post :xD entonces el problema era la convecion Título: Re: [PREGUNTA] Convertir una declaracion API de C# a VB6 (problema con punteros) Publicado por: el_c0c0 en 19 Marzo 2012, 14:47 pm si, con cobein habiamos visteo que al final era cdecl por eso mismo. es decir que con ReadDataFromTPM ya estamos listos (y funcionando).
Pero en el pastebin esta OTRA funcion, que es una que NO se cuantos parametros tiene. Teoricamente es 1 solo, un puntero a un array, pero no le cambia ningun byte. Estamos hablando de ReadCertFromTPM. saludos |