elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  [PREGUNTA] Convertir una declaracion API de C# a VB6 (problema con punteros)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: [PREGUNTA] Convertir una declaracion API de C# a VB6 (problema con punteros)  (Leído 7,172 veces)
el_c0c0


Desconectado Desconectado

Mensajes: 307


Ver Perfil
[PREGUNTA] Convertir una declaracion API de C# a VB6 (problema con punteros)
« 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
  1.        [DllImport("TPMCtrl_WinBond.dll")]
  2.        public static extern unsafe int ReadDataFromTPM(byte* UserData);

probe con cada caso de estas declaraciones:
Código
  1. Private Declare Function ReadDataFromTPM Lib "TPMCtrl_WinBond.dll" (UserData As Any) As Long
  2. Private Declare Function ReadDataFromTPM Lib "TPMCtrl_WinBond.dll" (UserData As Byte) As Long
  3. Private Declare Function ReadDataFromTPM Lib "TPMCtrl_WinBond.dll" (ByVal UserData As Byte) As Long
  4. Private Declare Function ReadDataFromTPM Lib "TPMCtrl_WinBond.dll" (UserData As Long) As Long
  5. Private Declare Function ReadDataFromTPM Lib "TPMCtrl_WinBond.dll" (ByVal UserData As Long) As Long
  6.  
  7. Private Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (Var() As Any) As Long
  8.  
  9. Private c_bvUserData(24)       As Byte
  10.  

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")]
long ReadDataFromTPM([in] long UserData);
long ReadDataFromTPM([in] byte *UserData);
long ReadDataFromTPM([in] byte * UserData[24]);

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
  1. private byte[] m_UserData = new byte[0x18];
y originalmente se llama asi:
Código
  1.        public unsafe void GetUserData()
  2.        {
  3.            fixed (byte* numRef = this.m_UserData)
  4.            {
  5.                try
  6.                {
  7.                    ReadDataFromTPM(numRef);
  8.                }
  9.                catch
  10.                {
  11.                    throw;
  12.                }
  13.            }
  14.        }

apreciaria ayuda...
saludos



« Última modificación: 16 Marzo 2012, 19:03 pm por el_c0c0 » En línea

'-     coco
"Te voy a romper el orto"- Las hemorroides
x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: [PREGUNTA] Convertir una declaracion API de C# a VB6 (problema con punteros)
« Respuesta #1 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
...
ReadDataFromTPM(byval varptr(mybytes(0)))


En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: [PREGUNTA] Convertir una declaracion API de C# a VB6 (problema con punteros)
« Respuesta #2 en: 17 Marzo 2012, 12:42 pm »

Código
  1. Private Declare Function ReadDataFromTPM Lib "TPMCtrl_WinBond.dll" (UserData As Byte) As Long
Código
  1. Dim m_UserData(0x18) As Byte
  2. Call ReadDataFromTPM(mybytes(0))

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.
En línea

el_c0c0


Desconectado Desconectado

Mensajes: 307


Ver Perfil
Re: [PREGUNTA] Convertir una declaracion API de C# a VB6 (problema con punteros)
« Respuesta #3 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
En línea

'-     coco
"Te voy a romper el orto"- Las hemorroides
Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: [PREGUNTA] Convertir una declaracion API de C# a VB6 (problema con punteros)
« Respuesta #4 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).
En línea

el_c0c0


Desconectado Desconectado

Mensajes: 307


Ver Perfil
Re: [PREGUNTA] Convertir una declaracion API de C# a VB6 (problema con punteros)
« Respuesta #5 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:



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
« Última modificación: 18 Marzo 2012, 20:53 pm por el_c0c0 » En línea

'-     coco
"Te voy a romper el orto"- Las hemorroides
el_c0c0


Desconectado Desconectado

Mensajes: 307


Ver Perfil
Re: [PREGUNTA] Convertir una declaracion API de C# a VB6 (problema con punteros)
« Respuesta #6 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
En línea

'-     coco
"Te voy a romper el orto"- Las hemorroides
x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: [PREGUNTA] Convertir una declaracion API de C# a VB6 (problema con punteros)
« Respuesta #7 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
En línea

el_c0c0


Desconectado Desconectado

Mensajes: 307


Ver Perfil
Re: [PREGUNTA] Convertir una declaracion API de C# a VB6 (problema con punteros)
« Respuesta #8 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)...

En línea

'-     coco
"Te voy a romper el orto"- Las hemorroides
x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: [PREGUNTA] Convertir una declaracion API de C# a VB6 (problema con punteros)
« Respuesta #9 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?

En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
pregunta convertir « 1 2 »
Programación Visual Basic
thearing 12 6,286 Último mensaje 19 Marzo 2011, 04:31 am
por raul338
Pregunta tonta sobre declaracion... « 1 2 »
.NET (C#, VB.NET, ASP)
Edu 13 6,983 Último mensaje 20 Marzo 2011, 23:05 pm
por Edu
¿Atan() Siempre devuelve 0? (posible problema con la declaración de las varibles
Programación C/C++
carlmycol 1 1,912 Último mensaje 4 Abril 2013, 17:49 pm
por isseu
Problema con orden de declaración de 2 clases
Programación C/C++
xRodak 1 1,281 Último mensaje 16 Enero 2014, 07:07 am
por Beakman
(Consulta) - Declaracion de punteros en Null
Programación C/C++
palacio29 2 1,520 Último mensaje 16 Mayo 2019, 09:29 am
por MAFUS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines