Importar APIs

Iniciado por Lekim, 24 Noviembre 2015, 00:45 AM

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

Lekim

Hola

///IMPORTAR APIs///
Quiero compartir esta código curioso para importar APIs de librerías DLL y de aplicaciones. Es muy útil.

Código (vbnet) [Seleccionar]
Public Class Form1

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       Dim DialogoAbrir As New System.Windows.Forms.OpenFileDialog
       DialogoAbrir.Title = "Abrir..."
       DialogoAbrir.FilterIndex = 1
       DialogoAbrir.Filter = "*.dll|*.dll|*.exe|*.exe"
       DialogoAbrir.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.System)
       If DialogoAbrir.ShowDialog() = DialogResult.OK Then
ImportAPI(DialogoAbrir.FileName)
       End If

       

   End Sub
   Sub ImportAPI(ByVal Path_Dll As String)

       '//VB6
       'Dim Path_Link As String = DirProgramFiles & "\Microsoft Visual Studio\VB98\link.exe"

       '****IMPORTANTE****:
       '//VB2010
       'link.exe se encuentra en:
       'C:\Archivos de programa\Microsoft Visual Studio 10.0\VC\bin\
       'Tiene dependencia con 'mspdb100.dll' que se encuentra en:
       'C:\Archivos de programa\Microsoft Visual Studio 10.0\Common7\IDE
       'Haz una copia de link.exe en  ...\Common7\IDE de lo contrario dará error al no encontrar 'mspdb100.dll'

       '//VS2012 64bits
       'link.exe se encuentra en:
       'C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin
       'mspdb100.dll' se encuentra en:
       'C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE

       Dim DirProgramFiles As String

       If Environment.Is64BitOperatingSystem Then
           DirProgramFiles = (Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86))
       Else
           DirProgramFiles = (Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles))
       End If

       Dim Path_Link As String  = (DirProgramFiles & "\Microsoft Visual Studio 10.0\Common7\IDE\link.exe")
       Dim FileTemp As String = System.IO.Path.GetTempFileName     'Crea un archivo temporal
       Dim C34 As String = Convert.ToChar(34)

       'Linea de comandos para link.exe
       Dim StartLink As String = String.Format("{0}{1}{2} /dump /exports {3}{4}{5} /out:{6}{7}{8}", _
                                               C34, Path_Link, C34, _
                                               C34, Path_Dll, C34, _
                                               C34, FileTemp, C34)
       Try
           'Ejecuta link.exe
           Dim myProcess As New Process()
           myProcess.StartInfo.UseShellExecute = False
           myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
           myProcess.StartInfo.FileName = StartLink
           myProcess.StartInfo.CreateNoWindow = True
           myProcess.Start()
       Catch ex As Exception
           MessageBox.Show("No se encuentra link.exe")
       End Try


        Me.Cursor = Cursors.WaitCursor
       System.Threading.Thread.Sleep(2000)
       Me.Cursor = Cursors.Default

       Dim strBuffer As New System.IO.StreamReader(FileTemp)
       TextBox1.Text = strBuffer.ReadToEnd
       strBuffer.Close()
       FileIO.FileSystem.DeleteFile(FileTemp)

   End Sub

   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

   End Sub
End Class


Sl2





El método también se puede usar para obtener información a través de aplicaciones que usen comandos

Este ejemplo obtiene es el resultado de hacer: ping www.google.es

Código (vbnet) [Seleccionar]

Public Class Form1

   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

   End Sub


   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 Dim sCommand As String = String.Format("""{0}"" /r ping {1} >", "cmd.exe", "www.elhacker.net")
       TextBox1.Text = GetResultCommand(sCommand)
   End Sub

#Region "GetResultCommand"
   Public Function GetResultCommand(ByVal sCommandLine As String) As String
       Dim FileTemp As String = System.IO.Path.GetTempFileName     'Crea un archivo temporal
       Dim C34 As String = Convert.ToChar(34)
       Dim Result As String = Nothing


       sCommandLine = String.Format(sCommandLine & "{0}{1}{2}", C34, FileTemp, C34)


       Try
           Dim myProcess As New Process()
           With myProcess
               .StartInfo.UseShellExecute = False
               .StartInfo.WindowStyle = ProcessWindowStyle.Hidden
               .StartInfo.FileName = sCommandLine
               .StartInfo.CreateNoWindow = True
               .Start()
           End With

       Catch ex As Exception
           MessageBox.Show(ex.Message)
       End Try

       Me.Cursor = Cursors.WaitCursor
       System.Threading.Thread.Sleep(2000)

       Dim FileAccesible As Boolean = False
       While FileAccesible = False
           Try
               Dim strBuffer As New System.IO.StreamReader(FileTemp, System.Text.Encoding.GetEncoding("ibm850"))
               Result = strBuffer.ReadToEnd()
               FileAccesible = True
               strBuffer.Close()

           Catch ex As Exception
               FileAccesible = False
           End Try
            My.Application.DoEvents()
       End While
       Me.Cursor = Cursors.Default
       FileIO.FileSystem.DeleteFile(FileTemp)
       Return Result
   End Function
#End Region
End Class


Mediante este...snippet, supongo. Se obtendría el resultado de una línea de comandos que usáramos en la consola de windows:


Código (vbnet) [Seleccionar]
GetResultCommand(LÍNA DE COMANDO)

Es importante poner entre comillas la aplicación a la que llamamos:
""cmd.exe""

Código (vbnet) [Seleccionar]
Dim sCommand As String = String.Format("""cmd.exe"" /r ping {0} ", "www.elhacker.net")

para menos lío también se puede llamar así:

Código (vbnet) [Seleccionar]
Dim sCommand As String = String.Format("""{0}"" /r ping {1} ", "cmd.exe", "www.elhacker.net")

el caso es que la aplicación quede entre comillas.

[MODIFICACADO]
Bueno, he hecho una pequeña modificación porque me he dado cuenta que claro, no todas las aplicaciones con comandos tienen el mismo comando de salida. Por ejemplo link.exe tiene /out: y cmd.exe tiene '>'. Así que esto es mejor aplicarlo cuando establecemos el comando y no desde el snippet

Con lo cual quedaría así con link.exe:
Código (vbnet) [Seleccionar]
     Dim sCommand As String = String.Format("""{0}"" /dump /exports {1} /out:", _
"C:\Archivos de programa\Microsoft Visual Studio 10.0\Common7\IDE\link.exe", _
   "c:\windows\system32\shell32.dll")
       TextBox1.Text = GetResultCommand(sCommand)


o así en con cmd.exe:
Código (vbnet) [Seleccionar]
  Dim sCommand As String = String.Format("""{0}"" /r ping {1} >", "cmd.exe", "www.elhacker.net")
       TextBox1.Text = GetResultCommand(sCommand)


Y he modificado esta línea quitando '>':

Código (vbnet) [Seleccionar]
sCommandLine = String.Format(sCommandLine & "{0}{1}{2}", C34, FileTemp, C34)

También he añadido:
Código (vbnet) [Seleccionar]
System.Text.Encoding.GetEncoding("ibm850")

Que no se en otra compu, pero en la mía si no establezco esta codificación para leer el archivo no se ven correctamente las vocales con acento.

-------------------------------------------------------



         ALGUNOS COMANDOS INTERESANTES PARA OBTENER INFORMACIÓN
       Dim sCommand As String = String.Format("""{0}"" /r dir C: >", "cmd.exe")
         
    Dim sCommand As String = String.Format("""{0}"" /r ping {1} >", "cmd.exe", "www.elhacker.net")
   
   Para mostrar todo el contenido de la tabla de rutas IP
   Dim sCommand As String = String.Format("""{0}"" /r route print >", "cmd.exe")

     Muestra la configuración de TCP/IP completa de todos los adaptadores
       Dim sCommand As String = String.Format("""{0}"" /r ipconfig /all >", "cmd.exe")


       Muestra una lista de todos los controladores de dispositivo instalados y sus propiedades.
       [modo tabla]
       Dim sCommand As String = String.Format("""{0}"" /r driverquery >", "cmd.exe")
       [modo csv]
       Dim sCommand As String = String.Format("""{0}"" /r driverquery /fo csv >", "cmd.exe")


       Muestra los archivos en lista donde se ejecuta esta apliación
       Dim sCommand As String = String.Format("""{0}"" /r tree /f >", "cmd.exe")

       Muestra todos los archivos del directorio C: (puede tardar un poco según el disco)
       Dim sCommand As String = String.Format("""{0}"" /r tree c:\ /f >", "cmd.exe")


       [Este es muy buen comando]
       Muestra información de configuración detallada acerca de un equipo y su sistema operativo
       (puedes usar 'csv' o 'list' en lugar de 'table'
   Dim sCommand As String = String.Format("""{0}"" /r systeminfo /fo table >", "cmd.exe")
       
   Para obtener información de un determinado host (sistema)
       comando= 'systeminfo /s HOST /fo table'
       Para(obtener) 'HOST'  escribe hostname en la consola y luego lo incorporas en el siguente
       comando, en este caso es 'mypc'
       Dim sCommand As String = String.Format("""{0}"" /r systeminfo /s mypc /fo table >", "cmd.exe")

       Muestra una lista de los servicios que se están ejecutando
Dim sCommand As String = String.Format("""{0}"" /r Net start  >", "cmd.exe")

       Muestra las conexiones activas
       Dim sCommand As String = String.Format("""{0}"" /r netstat >", "cmd.exe")

       Muestra todas las conexiones y puertos de escucha
       'Dim sCommand As String = String.Format("""{0}"" /r netstat -a >", "cmd.exe")

       Muestra el ejecutable que crea cada conexión o puerto de(escucha)
       Dim sCommand As String = String.Format("""{0}"" /r netstat -b >", "cmd.exe")

       Muestra las estadísticas Ethernet. Se puede combinar con la opción()-s
       Dim sCommand As String = String.Format("""{0}"" /r netstat -e >", "cmd.exe")

       Muestra estadísticas por protocolo. De forma predeterminada,
       se muestran para IP, IPv6, ICMP, ICMPv6, TCP, TCPv6, UDP y
       UDPv; se puede utilizar la opción -p para especificar un
       subconjunto de los valores predeterminados
       Dim sCommand As String = String.Format("""{0}"" /r netstat -s >", "cmd.exe")


       CONSEJO:
       'ALGUNOS COMANDOS PERMITEN USAR TRES TIPOS DE LISTA [LIST|CSV|TABLE]
       usando CSV puedes acceder fácilmente a la información usando SPLIT
       MODO CSV: "infoA","InfoB","infoC","InfoD"
       Ejemplo:
       Devuelve la dirección de control de acceso a medios (MAC, media access control) y  lista de los protocolos de red asociados con cada la dirección de todas las tarjetas de red de cada equipo
       Dim sCommand As String = String.Format("""{0}"" /r getmac  /fo csv /nh /v >", "cmd.exe")
       Dim sCommand As String = String.Format("""{0}"" /r getmac  /s mypc /fo csv >", "cmd.exe")


Espero que os sirva

sl2  :D



[condejo]
Para un TextBox u otro control de texto usa la fuente Courier New para que las tablas se muestren de forma ordenada.