Foro de elhacker.net

Programación => Ingeniería Inversa => Mensaje iniciado por: calk9 en 12 Noviembre 2013, 20:11 pm



Título: Pointer a función (C y VB6)
Publicado por: calk9 en 12 Noviembre 2013, 20:11 pm
Hola nuevamente foreros. Estoy intentando llamar una función de un proceso externo. Tengo 2 procesos, uno está en C y el otro en VB6. Las funciones de ambos serían algo así:

VB6:
Código
  1. Public Function Sumar(ByVal a As Integer, ByVal b As Integer) As Integer
  2.    Sumar = a + b
  3. End Function
  4.  

C:
Código
  1. int sumar(int a, int b)
  2. {
  3.    return a + b;
  4. }

En el primer programa (VB6), Sumar() se encuentra en la dirección 0x0401BD0. En el segundo (C), sumar() está en 0x0401334.

Ahora bien, creo una DLL en C y hago lo siguiente:

Código
  1. typedef int (__stdcall *exe_sumar_ptr)(int, int);
  2. ...
  3. char result[50] = "";
  4. exe_sumar_ptr exe_sumar;
  5. exe_sumar = (exe_sumar_ptr)(0x0401334);
  6. sprintf(result, "Resultado: %d\n", exe_sumar(5, 5));
  7. MessageBox(0, result, "Resultado", MB_OK);
  8. ...

La inyecto en el programa en C y funciona perfectamente, llama a la función sumar() y devuelve como valor 10 (5+5, correcto!). Ahora el problema es en el programa de VB6. Recompilo la DLL con la nueva dirección (0x0401BD0) y la función siempre retorna 0. Según la MSDN, el equivalente del tipo Integer de VB6 es long, así que intenté lo siguiente:

Código
  1. typedef long (__stdcall *exe_sumar_ptr)(long, long);

Pero el problema persiste. Alguna idea de que puede estar sucediendo?

Les agradezco de antemano su ayuda y saludos!!


Título: Re: Pointer a función (C y VB6)
Publicado por: MCKSys Argentina en 12 Noviembre 2013, 21:02 pm
El tipo Integer de VB6 es de 16 bits, osea WORD.
El tipo Long de VB6 es de 32 bits (DWORD), pero con signo.

Tambien ten en cuenta que VB usa STDCALL y C no.

Eso es lo que se me ocurre por ahora, aunque siempre puedes agarrar Olly (o el dbg que prefieras) y ver que esta pasando...

Saludos!


Título: Re: Pointer a función (C y VB6)
Publicado por: calk9 en 12 Noviembre 2013, 22:52 pm
Hola, gracias por la respuesta. Inteté usando WORD pero aún así el problema persiste:

Código
  1. typedef WORD (__stdcall *exe_sumar_ptr)(WORD, WORD);

Alguna otra idea? Como puedo detectar el problema con ollydbg? Necesito saber ASM? (porque no entiendo nada de eso :xD).

Saludos y gracias de nuevo!  :D


Título: Re: Pointer a función (C y VB6)
Publicado por: calk9 en 14 Noviembre 2013, 02:43 am
Bueno finalmente me descargue el OllyDbg y lo ejecuté para ver que podía hacer. Primero intenté con el programa en C y todo funciona perfectamente. Luego continué con el de VB6 y el Olly me dice lo siguiente al momento de inyectar la DLL que llama a la función Sumar() (del programa hecho en VB6):

Citar
Access violation when reading 00000004 - use Shift+F7 to pass exception to program

Automáticamente Olly pausea el programa, así que apreto Shift+F7 y luego le doy Run. Ahora sale el mismo mensaje pero la dirección es 0000007C. De nuevo hago el procedimiento anterior y la dirección ahora es 00000008. Presiono por última vez Shift+F7 + Run y finalmente continúa la ejecución normalmente. El inyector retorna un mensaje indicando que falló la inyección de la DLL.

Por que puede estar sucediendo esto?  :huh:

Gracias!