Gran Problema DLL estandar en VB6(No activex)+HooK en proceso

Iniciado por shaggikpo, 8 Diciembre 2009, 08:35 AM

0 Miembros y 1 Visitante están viendo este tema.

shaggikpo

Bueno mi problema es bastante complejo y lo detallo aqui con la esperanza de que alguien puede ayudarme:
La cosa es asi:
Estoy Programado una DLL normal en VB6, para hacerlo segui esta guia depues de creear el contol de compilacion como dice la guia y probar que fucnionaba usando el ejemplo alli descrito me propuse crear un dll la cul su funcion es:
Verificar si existe un proceso DAdo, si este existe cerrarlo y continuar la ejecucionde proceso Padre, en caso contrario(el proceso buscado no existe) la dll cierra el proceso padre y abre el programa enscionad al pricipio.

Ahora ahi que desctacar varias cosas sin las cuales no se entenderia el problema.

La dll esta hookeada usando olly para editar el EXE el hook es de esta forma
HOOK:

Código (asm) [Seleccionar]
PUSH + offset Loader.dll
LOADLIBRARYA
OR EAX,EAX
JE (DB 00)
PUSH offset_DllMain
PUSH EAX
PUSH GetProcAddress
CALL EAX
JMP OEP

Luego de hookear la dll con este metodo, cambio el EP por el  del PUSH + offset DLL
La dll debe ser iniciada con un proceso que en este caso se LLama DllMain
Este es el unico metodo de hook que puedo hacer ya que una inyecion dese otro programa no me sirve y no tengo acceso al codigo del exe para hacer el hook de otra forma
MODULO.bas
Código (vb) [Seleccionar]
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

' Funciòn APi para buscar Ventanas de Windows
Public Declare Function FindWindow _
    Lib "user32" _
    Alias "FindWindowA" ( _
        ByVal lpClassName As String, _
        ByVal lpWindowName As String) As Long
   

'Para finalizar dicha ventana
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _
                 ByVal hwnd As Long, _
                 ByVal wMsg As Long, _
                 ByVal wParam As Long, _
                 lParam As Any) As Long

Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _
     ByVal hwnd As Long, _
     ByVal lpOperation As String, _
     ByVal lpFile As String, _
     ByVal lpParameters As String, _
     ByVal lpDirectory As String, _
     ByVal nShowCmd As Long) As Long


Public Sub Comprobar()
Dim clase As String
clase = "ThunderRT6FormDC"
Dim ret As Long

    ' busca la ventana y retorna el Handle
    ret = FindWindow(clase, "MuPaysandú V 1.0.59")
   
    'si retorna distinto _
     de 0 es porque la encontró
    If ret <> 0 Then
                ' Finaliza la ventana
             Log ("Launcher cerrado corectamente con el HWD " & ret)
            SendMessage ret, "&H112", "&HF060&", ByVal 0
           
           
           
        Else
        Log ("Launcher no encontrado.")
        ret = FindWindow("MU", vbNullString)
        If ret <> 0 Then
            SendMessage ret, "&H112", "&HF060&", ByVal 0
            Log ("Procediendo a cerrar el Cliente.")
            Log ("Abriendo Launcher.")
            ShellExecute ret, "Open", App.Path & "\MU.exe", vbNullString, "0", "1"
            Else
            Log ("MuPaysandu No encontrado.")
        End If
    End If
   
End Sub


   



Public Sub Log(Razon As String)
    Open App.Path & "\log.txt" For Append As 1
    Print #1, "[" & Date & "] " & Razon
    Close #1
End Sub


   




Public Function DllMain() As String

          Comprobar
End Function

Para cree un exe estandar y pude declare la dll
y luego hice la llamada y el resultado es:
Error '429 en tiempo de ejecucion.
El componente ActiveX no puede crear el objecto.

Código (vb) [Seleccionar]
Private Declare Function DllMain Lib "Loader.dll" () As String

Private Sub Command1_Click()
DllMain
End Sub

si pruebo este mismo exe dese el IDE no pasa nada
y si hookeo la dll al ejecutable al cual va destinado genera el tipico "Main.exe ha generado un error y deb cerrarse"

cobein

El proceso donde cargas la libreria tiene msvbvm60 en memoria?
http://www.advancevb.com.ar
Más Argentino que el morcipan
Aguante el Uvita tinto, Tigre, Ford y seba123neo
Karcrack es un capo.

shaggikpo

#2
No el proceso esta programado en VC++ asi que no creo
Como seria para cargarlo en memoria habria que hookearlo con el mismo procedimeinto?

cobein

Bien, entonces posiblemente ese sea tu problema. Por lo que comprendi hiciste una libreria en VB le cambiaste el EP y todo eso no?
Si ese es el caso habria que saber mas detalles, como por ejemplo que metodo utilizaste para compilar la libreria etc. hay muchas cosas que pueden estar causando el error pero parece que es lo mas comun de todo, el uso de APIs declaradas en el codigo y las funciones de VB.
http://www.advancevb.com.ar
Más Argentino que el morcipan
Aguante el Uvita tinto, Tigre, Ford y seba123neo
Karcrack es un capo.


cobein

Ok, no tenes ningun preloader o algo asi en la libreria, simplemente tu codigo verdad?
http://www.advancevb.com.ar
Más Argentino que el morcipan
Aguante el Uvita tinto, Tigre, Ford y seba123neo
Karcrack es un capo.


cobein

Si, perdon no vi que habia un link, el tema es asi, cuando usas ese metodo el EP de la libreria se modifica, el tema es que las librerias asi como los exes en VB tienen como un stub, este stub lo que hace entre otras cosas es "corregir" el IAT (Import Address Table), si abris tu libreria en PE explorer o algun programa similar vas aver que en el IAT no aparecen ni las librerias ni las funciones que estas usando en tu codigo ej:SendMessageA.

Como solucionar esto? Hay un par de maneras que conozco

1- es utilizar un addin para VB (no recuerdo el nombre) que utilizando shellcode inicializa el stub de la libreria (nunca me funciono).
2- esta es mi preferida pero requiere mas trabajo. Primero que nada tenes que declarar absolutamente todas las APIs en un type library (esto va a hacer que VB las agregue en el IAT como cualquier otro programa) y el codigo lo tenes que hacer teniendo en cuenta que ninguna de las funciones de VB (llamdas a msvbvm60) van a estar disponibles.
3- esta es la mas clasica, hace la libreria en otro lenguage
http://www.advancevb.com.ar
Más Argentino que el morcipan
Aguante el Uvita tinto, Tigre, Ford y seba123neo
Karcrack es un capo.

shaggikpo

Creo que voy a probar la opcion 2 a que no usomuchas fucniones de VB en realidad pero. podria orientarme de como hacerlo pues no entendi muy bien

cobein

=D opcion 2 !!! te ganaste un dolor de cabeza!!!!

Bien mi preferida, primero que nada, las APIs que vayas a utilizar en codigo las tenes que declacrar en un type library, Hay varios tutoriales y ejemplos por ahi de como crearlas si queres pego el source de una que utilizo para inyeccion. Obviamente hay que compilarla, si tenes Visual Studio tenes que tener midl.exe por ahi en tu disco.

Inject.odl source
http://pastebin.com.ar/5567

Una vez que tenes el tlb creado lo agregas a las referencias y eso tendria que resolver el tema de las APIs, con respecto al codigo, muchas cosas no te van a funcionar, como ser los & para concatenar y Mid y esas cosas, por lo que vi en el codigo que tenes son simplemente unos if y cosas asi que no te van a dar mayores problemas.

Una aclaracion, para debuguear eso no uses un log, usa Outputdebugstring y el programa DebugView.
http://www.advancevb.com.ar
Más Argentino que el morcipan
Aguante el Uvita tinto, Tigre, Ford y seba123neo
Karcrack es un capo.