[SRC]- mGetAPIPtr, sacar el puntero de un API... nuevo metodo :P

Iniciado por Karcrack, 11 Agosto 2009, 13:54 PM

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

Karcrack

Bueno, despues de estar investigando he conseguido sacar el Puntero de un API llamando a DllFunctionCall@MSVBVM60.DLL...

Como todo programador de VB6 debe saber al llamar un API externa desde VB se llama a DllFunctionCall para sacar el puntero... osea, las APIs declaradas directamente desde el codigo no se agregan a la IAT...

Y bueno, decidi aprovecharme de eso :rolleyes:

Código (vb) [Seleccionar]
Option Explicit
'---------------------------------------------------------------------------------------
' Module    : mGetAPIPtr
' Author    : Karcrack
' Now$      : 11/08/2009  13:07
' WebPage   : http://www.advancevb.com.ar
' Used for? : Get API Pointer withouth calling any external API
' Thanks.   :
'       - Cobein: Support and Unicode-ANSI function (=
'---------------------------------------------------------------------------------------

'MSVBVM60
Private Declare Function DllFunctionCall Lib "MSVBVM60" (ByRef typeAPI As tAPICall) As Long

Private Type tAPICall
    ptsLIB              As Long ' Pointer to ANSI String that contains Library
    ptsProc             As Long ' Pointer to ANSI String that contains Procedure
    lReserved           As Long ' Just reserved...
    lPointer            As Long ' Pointer to the buffer that will contain temp variables from DllFunctionCall
    lpBuffer(3)         As Long ' Buffer that will contain temp variables
End Type

Public Function GetAPIPtr(ByVal sLib As String, ByVal sProc As String) As Long
    Dim tAPI            As tAPICall
    Dim bvLib()         As Byte
    Dim bvMod()         As Byte
   
    Call Unicode2ANSI(sLib, bvLib)
    Call Unicode2ANSI(sProc, bvMod)
   
    With tAPI
        .ptsLIB = VarPtr(bvLib(0))
        .ptsProc = VarPtr(bvMod(0))
        .lReserved = &H40000
        .lPointer = VarPtr(.lpBuffer(0))
    End With
   
    GetAPIPtr = DllFunctionCall(tAPI)
End Function

'COBEIN (=
Private Sub Unicode2ANSI(ByVal sUNICODE As String, ByRef bvANSI() As Byte)
    Dim i           As Long
   
    ReDim bvANSI(Len(sUNICODE))
    For i = 1 To Len(sUNICODE)
        bvANSI(i - 1) = Asc(Mid$(sUNICODE, i, 1))
    Next i
End Sub


Con esto solo no podemos llamar a las APIs, asi que he modificado el codigo de Cobein del cInvoke
para que llama al puntero que le pases... Aqui hay un ejemplo bastante claro:
http://www.box.net/shared/tbbihznz6r

Ah! Si pretendeis llamar APIs que pidan Strings recordar usar la version UNICODE de esa API (*W)

Saludos ;D

illuminat3d

Muy bueno loco, me quedé medio confuso  :huh:, pero se ve muy bueno  ;-)

el_c0c0

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

YST



Yo le enseñe a Kayser a usar objetos en ASM

cobein

Karcrack, despues tengo unos datos interesantes para pasarte de esta API, me colgue un rato con el IDA y vi unas cuantas cosas.
http://www.advancevb.com.ar
Más Argentino que el morcipan
Aguante el Uvita tinto, Tigre, Ford y seba123neo
Karcrack es un capo.

Karcrack

Cita de: cobein en 15 Agosto 2009, 06:39 AM
Karcrack, despues tengo unos datos interesantes para pasarte de esta API, me colgue un rato con el IDA y vi unas cuantas cosas.
Perfecto :D, si no ves en el MSN enviame un MP por aqui o en HH ;)

Espero ansioso la informacion :xD

Saludos ;)

MCKSys Argentina

MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Karcrack

Cita de: MCKSys Argentina en 15 Agosto 2009, 20:56 PM
Muy bueno!

No conocia esa estructura...

Gracias!
Claro que no :xD, la he hecho yo para imitar la llamada al API DllFunctionCall que hacen las aplicaciones del VB :xD