Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: el_c0c0 en 16 Marzo 2012, 19:01 pm



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
  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



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
...
ReadDataFromTPM(byval varptr(mybytes(0)))


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
  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.


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
X_100033F1:   mov ebp, esp
X_100033F3:   push -0x1
X_100033F5:   push 0x1000c3b8
X_100033FA:   mov eax, fs:[0x0]
X_10003400:   push eax
X_10003401:   sub esp, 0x8
X_10003404:   push ebx
X_10003405:   push esi
X_10003406:   push edi
X_10003407:   mov eax, [0x1001001c]
X_1000340C:   xor eax, ebp
X_1000340E:   push eax
X_1000340F:   lea eax, [ebp-0xc]
X_10003412:   mov fs:[0x0], eax
X_10003418:   mov [ebp-0x10], esp
X_1000341B:   mov esi, [ebp+0x8]
X_1000341E:   xor ebx, ebx
X_10003420:   cmp esi, ebx
X_10003422:   jz 0x10003463
X_10003424:   push 0x18
X_10003426:   mov [ebp-0x4], ebx
X_10003429:   call 0x100036a0
X_1000342E:   add esp, 0x4
X_10003431:   cmp eax, ebx
X_10003433:   mov [ebp-0x14], eax
X_10003436:   jz 0x10003463
X_10003438:   lea ecx, [ebp+0xb]
X_1000343B:   call 0x10002470
X_10003440:   lea eax, [ebp-0x14]
X_10003443:   push eax
X_10003444:   push 0x18
X_10003446:   push 0x3
X_10003448:   lea ecx, [ebp+0xb]
X_1000344B:   mov byte [ebp-0x4], 0x1
X_1000344F:   call 0x100026e0
X_10003454:   cmp eax, ebx
X_10003456:   mov [ebp-0x4], bl
X_10003459:   jz 0x10003478
X_1000345B:   lea ecx, [ebp+0xb]
X_1000345E:   call 0x10002480
X_10003463:   or eax, -0x1
X_10003466:   mov ecx, [ebp-0xc]
X_10003469:   mov fs:[0x0], ecx
X_10003470:   pop ecx
X_10003471:   pop edi
X_10003472:   pop esi
X_10003473:   pop ebx
X_10003474:   mov esp, ebp
X_10003476:   pop ebp
X_10003477:   ret

el parametro se recupera aquí:
Código:
X_1000341B:   mov esi, [ebp+0x8]
sino me equivoco :P
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