elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  Alguien lo puede hacer mas rapido?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Alguien lo puede hacer mas rapido?  (Leído 4,369 veces)
LeandroA
Moderador
***
Desconectado Desconectado

Mensajes: 760


www.leandroascierto.com


Ver Perfil WWW
Alguien lo puede hacer mas rapido?
« en: 19 Agosto 2010, 00:03 am »

Buenas esto no es un reto, solo me intriga saber si se pude crear/mejorar una funcion mas rapida que esta que hice para buscar una palabra en un archivo, la funcion trabaja con bytes y no con string, como ejemplo puse que busque una palabra existente dentro del "Explorer.exe" y un bucle de 100 vueltas para exijirle un poco a la función. Tambien comente una palabra inexistente para probar.
no discrimina por mayusculas o minusculas "deve encontrarla de cualquier forma".

Código
  1. Option Explicit
  2. Private Declare Function GetTickCount Lib "kernel32.dll" () As Long
  3.  
  4. Private Declare Function CharUpperBuffA& Lib "user32" (lpsz As Any, ByVal cchLength&)
  5. Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
  6. Private Declare Function ReadFile Lib "kernel32.dll" (ByVal hFile As Long, ByRef lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, ByRef lpNumberOfBytesRead As Long, ByVal lpOverlapped As Long) As Long
  7. Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
  8. Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
  9. Private Declare Function GetFileSize Lib "kernel32.dll" (ByVal hFile As Long, ByRef lpFileSizeHigh As Long) As Long
  10. Private Declare Function SetFilePointer Lib "kernel32.dll" (ByVal hFile As Long, ByVal lDistanceToMove As Long, ByRef lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long
  11.  
  12. Private Type LARGE_INTEGER
  13.    lowpart As Long
  14.    highpart As Long
  15. End Type
  16.  
  17.  
  18. Private Const GENERIC_READ          As Long = &H80000000
  19. Private Const FILE_SHARE_READ       As Long = &H1
  20. Private Const OPEN_EXISTING         As Long = 3
  21. Private Const INVALID_HANDLE_VALUE  As Long = -1
  22. Private Const FILE_BEGIN            As Long = 0
  23.  
  24. Private aUChars(255) As Byte
  25.  
  26. Private Function LargeIntToCurrency(Low As Long, High As Long) As Currency
  27.    Dim LI As LARGE_INTEGER
  28.    LI.lowpart = Low: LI.highpart = High
  29.    CopyMemory LargeIntToCurrency, LI, LenB(LI)
  30.    LargeIntToCurrency = LargeIntToCurrency * 10000
  31. End Function
  32.  
  33. Private Function CurrencyToLargeInt(ByVal Curr As Currency) As LARGE_INTEGER
  34.    Curr = Curr / 10000
  35.    CopyMemory CurrencyToLargeInt, Curr, LenB(Curr)
  36. End Function
  37.  
  38.  
  39. Private Function FindWordInFile(ByVal sPath As String, ByVal sWord As String, Optional ByVal bUnicode As Boolean) As Boolean
  40.    Dim bArray() As Byte
  41.    Dim lRet As Long
  42.    Dim hFile As Long
  43.    Dim sFind() As Byte
  44.    Dim s As String
  45.    Dim t As Long
  46.    Dim i As Long
  47.    Dim FileSize As Currency
  48.    Dim tLI As LARGE_INTEGER
  49.    Dim LenBuffer As Long
  50.    Dim CurPos As Currency
  51.  
  52.    sWord = UCase(sWord)
  53.    If bUnicode Then sWord = StrConv(sWord, vbUnicode)
  54.    sFind = StrConv(sWord, vbFromUnicode)
  55.  
  56.    hFile = CreateFile(sPath, GENERIC_READ, FILE_SHARE_READ, ByVal 0&, OPEN_EXISTING, 0, 0)
  57.  
  58.    If hFile <> INVALID_HANDLE_VALUE Then
  59.  
  60.  
  61.        tLI.lowpart = GetFileSize(hFile, tLI.highpart)
  62.  
  63.        LenBuffer = &H2800 ' 10 KB
  64.  
  65.        FileSize = LargeIntToCurrency(tLI.lowpart, tLI.highpart)
  66.  
  67.        If FileSize < UBound(sFind) Then GoTo OutSearch
  68.  
  69.        If LenBuffer > FileSize Then LenBuffer = FileSize
  70.  
  71.        ReDim bArray(LenBuffer - 1)
  72.  
  73.        Do
  74.            ReadFile hFile, bArray(0), UBound(bArray) + 1, lRet, 0&
  75.  
  76.            If lRet = 0 Then Exit Do
  77.  
  78.            CurPos = CurPos + lRet
  79.  
  80.            If lRet < LenBuffer Then
  81.                ReDim Preserve bArray(lRet)
  82.            End If
  83.  
  84.            If InBytes(bArray, sFind) <> -1 Then
  85.                FindWordInFile = True
  86.                Exit Do
  87.            End If
  88.  
  89.            If CurPos = FileSize Then Exit Do
  90.  
  91.            tLI = CurrencyToLargeInt(CurPos - UBound(sFind) + 1)
  92.  
  93.            SetFilePointer hFile, tLI.lowpart, tLI.highpart, FILE_BEGIN
  94.  
  95.        Loop
  96.  
  97. OutSearch:
  98.  
  99.        CloseHandle hFile
  100.  
  101.    End If
  102. End Function
  103.  
  104.  
  105.  
  106. Public Function InBytes(ByRef bvSource() As Byte, ByRef bvMatch() As Byte) As Long
  107.  
  108.    Dim i       As Long
  109.    Dim j       As Long
  110.    Dim lChr    As Byte
  111.    Dim LenMach As Long
  112.  
  113.    LenMach = UBound(bvMatch)
  114.  
  115.    lChr = bvMatch(0)
  116.  
  117.    If LenMach > 0 Then
  118.  
  119.        For i = 0 To UBound(bvSource) - LenMach
  120.  
  121.            If (lChr = aUChars(bvSource(i))) Then
  122.  
  123.                j = LenMach - 1
  124.  
  125.                Do
  126.                    If bvMatch(j) <> aUChars(bvSource(i + j)) Then GoTo NotEqual
  127.                    j = j - 1
  128.                Loop While j
  129.  
  130.                InBytes = i
  131.  
  132.                Exit Function
  133.  
  134.            End If
  135. NotEqual:
  136.  
  137.        Next
  138.  
  139.    Else
  140.        For i = 0 To UBound(bvSource)
  141.            If (lChr = aUChars(bvSource(i))) Then
  142.                InBytes = i
  143.                Exit Function
  144.            End If
  145.        Next
  146.    End If
  147.  
  148.    InBytes = -1
  149. End Function
  150.  
  151. Private Sub Form_Initialize()
  152.    Dim i As Long
  153.  
  154.    For i = 0 To 255: aUChars(i) = i: Next
  155.    CharUpperBuffA aUChars(0), 256
  156.  
  157. End Sub
  158.  
  159. Private Sub Form_Load()
  160.    Dim t As Long, i As Long, Ret As Boolean
  161.    t = GetTickCount
  162.    For i = 0 To 100 'Este bucle es solo para exijirle un poco mas a la funcion
  163.        Ret = FindWordInFile(Environ("windir") & "\explorer.exe", "Mostrar en el escritorio", True)
  164.        'Ret = FindWordInFile(Environ("windir") & "\explorer.exe", "esta palabra no existe")
  165.    Next
  166.  
  167.    MsgBox GetTickCount - t
  168.    Me.Caption = Ret
  169.  
  170. End Sub
  171.  

PD: Complilarlo


En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Alguien lo puede hacer mas rapido?
« Respuesta #1 en: 19 Agosto 2010, 01:33 am »


la funcion devuelve el puntero al string del archivo donde se desea buscar!¡.

Se puede ingresar un puntero de inicio
devuelve -1 si no encontro nada

Código
  1.  
  2. Option Explicit
  3.  
  4. Public Function FindInStr(ByVal InThisFile As String, ByVal InStrToFind As String, Optional ByVal PointFile As Long = 0, Optional ByVal bUnicode As Boolean = False) As Long
  5.    Dim lFF             As Integer
  6.    Dim lLenFile        As Long
  7.    Dim vAFile()        As Byte, lindex     As Long, ByteAlt        As Byte
  8.    Dim vAStr()         As Byte
  9.    Dim lLenStr         As Long, LIndexStr  As Long
  10.  
  11.    FindInStr = -1
  12.    lLenStr = Len(InStrToFind)
  13.  
  14.    If Not Dir(InThisFile, vbArchive) = "" And lLenStr > 0 Then
  15.        lFF = FreeFile
  16.        Open InThisFile For Binary As lFF
  17.            lLenFile = LOF(lFF)
  18.            If lLenFile Then
  19.                If bUnicode Then
  20.                    InStrToFind = StrConv(InStrToFind, vbUnicode)
  21.                End If
  22.                vAStr = StrConv(InStrToFind, vbFromUnicode)
  23.  
  24.                ReDim vAFile(0 To lLenFile)
  25.                If PointFile > 0 Then
  26.                    If Not (lLenFile - lLenStr >= PointFile) Then GoTo Err_
  27.                    Get lFF, PointFile, vAFile
  28.                Else
  29.                    Get lFF, , vAFile
  30.                End If
  31.  
  32.                For lindex = 0 To lLenFile - lLenStr - 2
  33.                    For LIndexStr = 0 To lLenStr - 1
  34.                        If Not vAFile(lindex + LIndexStr) = vAStr(LIndexStr) Then
  35.                            If vAFile(lindex + LIndexStr) < 91 Then
  36.                                ByteAlt = vAFile(lindex + LIndexStr) + 32
  37.                            ElseIf vAFile(lindex + LIndexStr) < 123 Then
  38.                                ByteAlt = vAFile(lindex + LIndexStr) - 32
  39.                            End If
  40.                            If Not ByteAlt = vAStr(LIndexStr) Then Exit For
  41.                        End If
  42.                    Next LIndexStr
  43.                    If LIndexStr >= lLenStr - 1 Then
  44.                        FindInStr = lindex + PointFile
  45.                        If PointFile Then FindInStr = FindInStr - 1
  46.                        Exit Function
  47.                    End If
  48.                Next lindex
  49.            End If
  50. Err_:   Close lFF
  51.    End If
  52.  
  53. End Function
  54.  
  55. Private Sub Form_Load()
  56.    MsgBox FindInStr(Environ("windir") & "\explorer.exe", "Mostrar en el escritorio", , False)
  57. End Sub
  58.  
  59.  

Dulce Infierno Lunar!¡.


En línea

The Dark Shadow is my passion.
LeandroA
Moderador
***
Desconectado Desconectado

Mensajes: 760


www.leandroascierto.com


Ver Perfil WWW
Re: Alguien lo puede hacer mas rapido?
« Respuesta #2 en: 19 Agosto 2010, 03:06 am »

Gracias BlackZeroX por coloaborar, esta bien reducido pero es mucho mas lenta y si pasamos archivos grandes daria error (esto ultimo no importa mucho se puede solucionar)

un bucle de 101 lamadas testeado con GetTickCount

BlackZeroX  2437
LeandroA     782

Saludos.
En línea

Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
Re: Alguien lo puede hacer mas rapido?
« Respuesta #3 en: 19 Agosto 2010, 03:28 am »

Quizas sea una chorrada, pero y si usamos RegExp?

DoEvents¡! :P
En línea

raul338


Desconectado Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: Alguien lo puede hacer mas rapido?
« Respuesta #4 en: 19 Agosto 2010, 03:44 am »

Quizas sea una chorrada, pero y si usamos RegExp?

Puede que sea una forma mejor de hacerlo, pero... tienes que optimizarlo bien para que no consuma tiempo (ya que tiene varias validaciones) y... comparando con bytes, si esta optimizado no creo que le pueda ganar :P
En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Alguien lo puede hacer mas rapido?
« Respuesta #5 en: 19 Agosto 2010, 06:13 am »

@LeandroA

Esperame ando trabajando en otra version, esta digamos que como todo seria algo asi como un esboso!¡.

@*PsYkE1*, raul338

Da igual como lo hagas el chiste de esto es que sea lo mas RAPIDO posible!¡.

Dulces Lunas!¡.
En línea

The Dark Shadow is my passion.
Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: Alguien lo puede hacer mas rapido?
« Respuesta #6 en: 19 Agosto 2010, 14:38 pm »

Código:
http://www.xbeat.net/vbspeed/cod_InStrMarzo.htm
La funcion InStr01 debe ser la mas rapida en caso de que uses vbTextCompare, si no quieres trabajar con cadenas podras alterarla para que funcione con ByteArrays ;)

El truco de esta funcion esta en sus Arrays trucados :laugh:
En línea

LeandroA
Moderador
***
Desconectado Desconectado

Mensajes: 760


www.leandroascierto.com


Ver Perfil WWW
Re: Alguien lo puede hacer mas rapido?
« Respuesta #7 en: 19 Agosto 2010, 19:48 pm »

Código:
http://www.xbeat.net/vbspeed/cod_InStrMarzo.htm
La funcion InStr01 debe ser la mas rapida en caso de que uses vbTextCompare, si no quieres trabajar con cadenas podras alterarla para que funcione con ByteArrays ;)

El truco de esta funcion esta en sus Arrays trucados :laugh:

si he visto el enlace inclusive saque algunos tips, trabaja practicamente igual solo que este pasa una cadena como puntero y lo pasa a un array (no entendi bien eso) pero en fin da lo mismo porque yo estoy trabajando directamente con byte array.
bueno creo que es lo maximo que se pude llegar con vb, no estoy seguro ejcutandolo con ASM o declarando las apis en .tlv

Saludos.
En línea

raul338


Desconectado Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: Alguien lo puede hacer mas rapido?
« Respuesta #8 en: 19 Agosto 2010, 20:10 pm »

Ya esta leandro, pedile a Tokes a ver si con su magia hace algo para optimizar :P

Yo lo logre con Expresiones regulares, pero, tarda un poco mas (usando FSO) y la pega es que no acepta UTF-8 directo (o sea, hay q convertir feamente u.u)
En línea

Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
Re: Alguien lo puede hacer mas rapido?
« Respuesta #9 en: 20 Agosto 2010, 00:28 am »

Ya esta leandro, pedile a Tokes a ver si con su magia hace algo para optimizar :P

Yo lo logre con Expresiones regulares, pero, tarda un poco mas (usando FSO) y la pega es que no acepta UTF-8 directo (o sea, hay q convertir feamente u.u)
Vaya raul... :-(
Nos quedamos sin RegExp...  :laugh:

DoEvents¡! :P
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Prueba Glasnost, ¿Alguien la puede hacer sin problemas hoy en día?
Redes
chillinfart 2 2,841 Último mensaje 26 Enero 2011, 15:02 pm
por chillinfart
como hacer SQLi más rápido??? y las huellas....???
Bugs y Exploits
ruben_linux 7 6,684 Último mensaje 27 Agosto 2011, 09:52 am
por Gambinoh
Alguien me puede hacer un presupuesto de un trabajo?
Desarrollo Web
Dany Zir 1 2,481 Último mensaje 9 Julio 2020, 04:20 am
por [u]nsigned
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines