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

 

 


Tema destacado: Top 20 herramientas Hacking más populares de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  Seriales de Pen-Drives conectados (SRC)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 3 Ir Abajo Respuesta Imprimir
Autor Tema: Seriales de Pen-Drives conectados (SRC)  (Leído 7,603 veces)
Hasseds

Desconectado Desconectado

Mensajes: 145



Ver Perfil
Seriales de Pen-Drives conectados (SRC)
« en: 21 Junio 2011, 22:01 pm »

Retorno = Seriales de Pen-Drives conectados

Código
  1.  
  2. Option Explicit
  3.  
  4. 'Function: FlashSerials
  5. 'Autor   : Sergio Desanti (Hasseds)
  6. 'Thank   : Seba , Cobein, A.Desanti
  7. 'Test    : XP (32 BIT) - W7/UAC (32 BIT)
  8. 'Return  : Serial(ESN) de Pen-Drives conectados
  9. '
  10. Private Declare Function IIDFromString Lib "ole32" (ByVal lpsz As Long, ByRef lpiid As GUID) As Long
  11. Private Declare Function SetupDiGetClassDevs Lib "setupapi.dll" Alias "SetupDiGetClassDevsA" (ByRef ClassGuid As GUID, ByVal Enumerator As Long, ByVal hwndParent As Long, ByVal flags As Long) As Long
  12. Private Declare Function SetupDiEnumDeviceInterfaces Lib "setupapi.dll" (ByVal DeviceInfoSet As Long, ByVal DeviceInfoData As Long, ByRef InterfaceClassGuid As GUID, ByVal MemberIndex As Long, ByRef DeviceInterfaceData As SP_DEVICE_INTERFACE_DATA) As Long
  13. Private Declare Function SetupDiGetDeviceInterfaceDetail Lib "setupapi.dll" Alias "SetupDiGetDeviceInterfaceDetailA" (ByVal DeviceInfoSet As Long, ByRef DeviceInterfaceData As SP_DEVICE_INTERFACE_DATA, DeviceInterfaceDetailData As Any, ByVal DeviceInterfaceDetailDataSize As Long, ByRef RequiredSize As Long, DeviceInfoData As Any) As Long
  14. Private Declare Function SetupDiDestroyDeviceInfoList Lib "setupapi.dll" (ByVal DeviceInfoSet As Long) As Long
  15.  
  16.  
  17. Private Type GUID
  18.    Data1 As Long: Data2 As Integer: Data3 As Integer: Data4(7) As Byte
  19. End Type
  20.  
  21. Private Type SP_DEVICE_INTERFACE_DATA
  22.    cbSize As Long: InterfaceClassGuid As GUID: flags As Long: Reserved As Long
  23. End Type
  24.  
  25. Private Type SP_DEVINFO_DATA
  26.    cbSize As Long: ClassGuid As GUID: DevInst As Long: Reserved As Long
  27. End Type
  28.  
  29. Private Type SP_DEVICE_INTERFACE_DETAIL_DATA
  30.    cbSize As Long: strDevicePath As String * 260
  31. End Type
  32.  
  33. Private Sub Form_Load()
  34.     AutoRedraw = True
  35.     Print FlashSerials
  36. End Sub
  37.  
  38. Public Function FlashSerials() As String
  39.  
  40.    Dim TGUID As GUID
  41.  
  42.    Call IIDFromString(StrPtr("{a5dcbf10-6530-11d2-901f-00c04fb951ed}"), TGUID)
  43.  
  44.    Dim hDev As Long
  45.    hDev = SetupDiGetClassDevs(TGUID, &H0, &H0, &H12)
  46.    If hDev = -1 Then Exit Function
  47.  
  48.    Dim lCount        As Long
  49.    Dim lSize         As Long
  50.    Dim DEV_DETAIL    As SP_DEVICE_INTERFACE_DETAIL_DATA
  51.    Dim DEV_INFO      As SP_DEVINFO_DATA
  52.    Dim DEV_DATA      As SP_DEVICE_INTERFACE_DATA
  53.  
  54.    DEV_DATA.cbSize = Len(DEV_DATA)
  55.  
  56.    While SetupDiEnumDeviceInterfaces(hDev, &H0, TGUID, lCount, DEV_DATA) <> &H0
  57.      Call SetupDiGetDeviceInterfaceDetail(hDev, DEV_DATA, ByVal &H0, &H0, lSize, ByVal &H0)
  58.      DEV_DETAIL.cbSize = &H5
  59.      DEV_INFO.cbSize = Len(DEV_INFO)
  60.      Call SetupDiGetDeviceInterfaceDetail(hDev, DEV_DATA, DEV_DETAIL, ByVal lSize, &H0, DEV_INFO)
  61.      If UBound(Split(DEV_DETAIL.strDevicePath, "#")) > 1 Then
  62.        FlashSerials = FlashSerials & Split(UCase$(DEV_DETAIL.strDevicePath), "#")(2) & Chr$(&HD)
  63.      End If
  64.      lCount = lCount + 1
  65.    Wend
  66.  
  67.    Call SetupDiDestroyDeviceInfoList(hDev)
  68.  
  69. End Function
  70.  
  71.  






« Última modificación: 20 Septiembre 2011, 23:44 pm por Hasseds » En línea

Sergio Desanti
Elemental Code


Desconectado Desconectado

Mensajes: 622


Im beyond the system


Ver Perfil
Re: Seriales de Pen-Drives conectados (SRC)
« Respuesta #1 en: 21 Junio 2011, 23:15 pm »

CHAAAAAAAN.
Explicame que es el serial de un pendrive  :-[


En línea

I CODE FOR $$$
Programo por $$$
Hago tareas, trabajos para la facultad, lo que sea en VB6.0

Mis programas
Hasseds

Desconectado Desconectado

Mensajes: 145



Ver Perfil
Re: Seriales de Pen-Drives conectados (SRC)
« Respuesta #2 en: 21 Junio 2011, 23:34 pm »

El numero de serie (Proporcionado por el frabricante) de un dispositivo, este deberiá ser unico y no cambiar al formatear, saludos
En línea

Sergio Desanti
Hasseds

Desconectado Desconectado

Mensajes: 145



Ver Perfil
Re: Seriales de Pen-Drives conectados (SRC)
« Respuesta #3 en: 17 Septiembre 2011, 01:08 am »

Agrego (por si el tema le interesó a alguien) un modulo para asociar la letra de unidad con su respectivo Serial (ESN) de Pen Drive.

Nota1: no pude probar como se comporta el código con Discos uSB externos ni con grabadoras USB, lo voy a hacer en cuanto tenga la oportunidad

Nota 2: es posible que no haya que llamar 2 veces a SetupDiGetDeviceInterfaceDetail, creo que RequiredSize As Long (lSize en el codigo) de esta api seria de &H7B para la clase "{53f56307-b6bf-11d0-94f2-00a0c91efb8b}" pero solo pude probar en XP conectando de uno hasta seis PenDrive.

Saludos


MODULO:

Código
  1.  
  2. Option Explicit
  3.  
  4. 'Modulo: FlashSerial
  5. 'Autor: Sergio Desanti (Hasseds)
  6. 'Agradecimientos: Seba, Cobein, A.Desanti
  7. 'Test: XP (32 BIT) & W7 (32 BIT)
  8. 'Retorno:  Letra de unidad y Serial Number(ESN) de Pen Drive conectados
  9. '
  10. Declare Function GetLogicalDriveStrings Lib "kernel32" Alias "GetLogicalDriveStringsA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
  11. Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
  12. Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
  13. Private Declare Function DeviceIoControl Lib "kernel32" (ByVal hDevice As Long, ByVal dwIoControlCode As Long, lpInBuffer As Any, ByVal nInBufferSize As Long, lpOutBuffer As Any, ByVal nOutBufferSize As Long, lpBytesReturned As Long, ByVal lpOverlapped As Long) As Long
  14.  
  15. Private Declare Function IIDFromString Lib "ole32" (ByVal lpsz As Long, ByRef lpiid As GUID) As Long
  16.  
  17. Private Declare Function SetupDiGetClassDevs Lib "setupapi.dll" Alias "SetupDiGetClassDevsA" (ByRef ClassGuid As GUID, ByVal Enumerator As Long, ByVal hwndParent As Long, ByVal flags As Long) As Long
  18. Private Declare Function SetupDiEnumDeviceInterfaces Lib "setupapi.dll" (ByVal DeviceInfoSet As Long, ByVal DeviceInfoData As Long, ByRef InterfaceClassGuid As GUID, ByVal MemberIndex As Long, ByRef DeviceInterfaceData As SP_DEVICE_INTERFACE_DATA) As Long
  19. Private Declare Function SetupDiGetDeviceInterfaceDetail Lib "setupapi.dll" Alias "SetupDiGetDeviceInterfaceDetailA" (ByVal DeviceInfoSet As Long, ByRef DeviceInterfaceData As SP_DEVICE_INTERFACE_DATA, DeviceInterfaceDetailData As Any, ByVal DeviceInterfaceDetailDataSize As Long, ByRef RequiredSize As Long, DeviceInfoData As Any) As Long
  20. Private Declare Function SetupDiDestroyDeviceInfoList Lib "setupapi.dll" (ByVal DeviceInfoSet As Long) As Long
  21.  
  22. Private Type STORAGE_DEVICE_NUMBER
  23.    DeviceType As Long: DiskNumber As Long: PartNumber As Long
  24. End Type
  25.  
  26. Private Type GUID
  27.    Data1 As Long: Data2 As Integer: Data3 As Integer: Data4(7) As Byte
  28. End Type
  29.  
  30. Private Type SP_DEVICE_INTERFACE_DATA
  31.    cbSize As Long: InterfaceClassGuid As GUID: flags As Long: Reserved As Long
  32. End Type
  33.  
  34. Private Type SP_DEVICE_INTERFACE_DETAIL_DATA
  35.    cbSize As Long: strDevicePath As String * 260
  36. End Type
  37.  
  38. Public Function FlashSerial(ByVal sLetra As String) As String
  39.  
  40.  sLetra = Left$(UCase$(sLetra), 1) & ":"
  41.  
  42.  FlashSerial = sLetra & " NO USB"
  43.  
  44.  Dim RetDeviceIndex    As Long
  45.  RetDeviceIndex = DeviceIndex(sLetra)
  46.  If RetDeviceIndex < 0 Then Exit Function ' " -1 -2 -3 en DeviceIndex"
  47.  
  48.  Dim TGUID             As GUID
  49.  Call IIDFromString(StrPtr("{53f56307-b6bf-11d0-94f2-00a0c91efb8b}"), TGUID)
  50.  
  51.  Dim hDev              As Long
  52.  hDev = SetupDiGetClassDevs(TGUID, &H0, &H0, &H12)
  53.  If hDev = -1 Then: Exit Function
  54.  
  55.  Dim lCount            As Long
  56.  Dim lSize             As Long
  57.  Dim DTA               As SP_DEVICE_INTERFACE_DATA
  58.  Dim DTL               As SP_DEVICE_INTERFACE_DETAIL_DATA
  59.  
  60.  DTA.cbSize = Len(DTA)
  61.  DTL.cbSize = &H5
  62.  
  63.  Do While Not (SetupDiEnumDeviceInterfaces(hDev, &H0, TGUID, lCount, DTA) = &H0&)
  64.    Call SetupDiGetDeviceInterfaceDetail(hDev, DTA, ByVal &H0&, &H0, lSize, ByVal &H0&)
  65.    Call SetupDiGetDeviceInterfaceDetail(hDev, DTA, DTL, ByVal lSize, &H0&, ByVal &H0&)
  66.    If InStr(UCase$(DTL.strDevicePath), "USB") Then
  67.      If DeviceIndex(DTL.strDevicePath, True) = RetDeviceIndex Then
  68.        If UBound(Split(DTL.strDevicePath, "#")) > 1 Then
  69.          FlashSerial = sLetra & Split(UCase$(DTL.strDevicePath), "#")(2)
  70.          Exit Do
  71.        End If
  72.      End If
  73.    End If
  74.    lCount = lCount + 1
  75.  Loop
  76.  
  77.  Call SetupDiDestroyDeviceInfoList(hDev)
  78.  
  79. End Function
  80.  
  81. Public Function DeviceIndex(ByVal sLetra As String, Optional strDevicePath As Boolean) As Long
  82.  
  83.  Dim hdh As Long, br As Long, SDN As STORAGE_DEVICE_NUMBER
  84.  
  85.  If Not strDevicePath Then sLetra = "\\.\" & Left$(UCase$(sLetra), 1) & ":"
  86.  
  87.  hdh = CreateFile(sLetra, &H0&, &H3&, ByVal &H0&, &H3&, &H0&, &H0&) ': MsgBox hdh, , "hdh"
  88.  If Not (hdh = -1) Then
  89.      If DeviceIoControl(hdh, &H2D1080, &H0&, &H0&, SDN, Len(SDN), br, ByVal &H0&) Then
  90.          If SDN.DeviceType = 7 Then
  91.              DeviceIndex = SDN.DiskNumber  ' Retorno DeviceIndex
  92.          Else
  93.              DeviceIndex = -3   ' No es GUID 53f56307-b6bf-11d0-94f2-00a0c91efb8b
  94.          End If
  95.      Else
  96.          DeviceIndex = -2  ' Floppy o DeviceIoControl = 0 (GetLastError)
  97.      End If
  98.      Call CloseHandle(hdh)
  99.  Else
  100.      DeviceIndex = -1  ' Unidad sin dispositivo o CreateFile = -1 (GetLastError)
  101.  End If
  102.  
  103. End Function
  104.  
  105.  
  106.  



Código
  1.  
  2. Option Explicit
  3.  
  4. Private Sub Form_Load()
  5.  
  6.      MsgBox FlashSerial("f")
  7.  
  8. End Sub
  9.  
  10.  
  11.  







« Última modificación: 17 Septiembre 2011, 13:09 pm por Hasseds » En línea

Sergio Desanti
Maurice_Lupin


Desconectado Desconectado

Mensajes: 353

GPS


Ver Perfil WWW
Re: Seriales de Pen-Drives conectados (SRC)
« Respuesta #4 en: 6 Octubre 2011, 22:04 pm »

Funciona en una cuenta de usuario, cuando usas WMI necesitas permisos  :D lo utilizaré, aún no entiendo que es eso de hook en el formulario. Pero averiguaré.

Saludos.
En línea

Un error se comete al equivocarse.
Hasseds

Desconectado Desconectado

Mensajes: 145



Ver Perfil
Re: Seriales de Pen-Drives conectados (SRC)
« Respuesta #5 en: 7 Octubre 2011, 02:57 am »

Si , creo que tambien funciona con UAC activado (tal vez alguien que lo pueda probar en W7 nos informe de esto)

Un ejemplo de Hook de lo mas de lo mas simple, si te sirve... te toca optimizar y adaptar a lo tuyo.



MODULO

Código:

Option Explicit

'Function: FlashSerials
'Autor   : Sergio Desanti (Hasseds)
'Thank   : Seba , Cobein, A.Desanti
'Test    : XP (32 BIT) - W7 (32 BIT)
'Return  : Serial(ESN) de Pen-Drives conectados
'

Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

Private Const GWL_WNDPROC = -4
Private Const WM_DEVICECHANGE As Long = 537              'Cambios en un dispositivo
Private Const DBT_DEVICEARRIVAL As Long = 32768          'Cuando se conecta uno nuevo
Private Const DBT_DEVICEREMOVECOMPLETE As Long = 32772   'Cuando se desconecta uno
Private Const DBT_DEVTYP_VOLUME As Integer = 2           'Logical volume, cualquier unidad de almacenamiento nueva.

Private Declare Function IIDFromString Lib "ole32" (ByVal lpsz As Long, ByRef lpiid As GUID) As Long
Private Declare Function SetupDiGetClassDevs Lib "setupapi.dll" Alias "SetupDiGetClassDevsA" (ByRef ClassGuid As GUID, ByVal Enumerator As Long, ByVal hwndParent As Long, ByVal flags As Long) As Long
Private Declare Function SetupDiEnumDeviceInterfaces Lib "setupapi.dll" (ByVal DeviceInfoSet As Long, ByVal DeviceInfoData As Long, ByRef InterfaceClassGuid As GUID, ByVal MemberIndex As Long, ByRef DeviceInterfaceData As SP_DEVICE_INTERFACE_DATA) As Long
Private Declare Function SetupDiGetDeviceInterfaceDetail Lib "setupapi.dll" Alias "SetupDiGetDeviceInterfaceDetailA" (ByVal DeviceInfoSet As Long, ByRef DeviceInterfaceData As SP_DEVICE_INTERFACE_DATA, DeviceInterfaceDetailData As Any, ByVal DeviceInterfaceDetailDataSize As Long, ByRef RequiredSize As Long, DeviceInfoData As Any) As Long
Private Declare Function SetupDiDestroyDeviceInfoList Lib "setupapi.dll" (ByVal DeviceInfoSet As Long) As Long
 
Private Type GUID
   Data1 As Long: Data2 As Integer: Data3 As Integer: Data4(7) As Byte
End Type
 
Private Type SP_DEVICE_INTERFACE_DATA
   cbSize As Long: InterfaceClassGuid As GUID: flags As Long: Reserved As Long
End Type

Private Type SP_DEVICE_INTERFACE_DETAIL_DATA
   cbSize As Long: strDevicePath As String * 260
End Type

Dim hHook As Long

Public Sub StartHook(hWnd As Long)
    hHook = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub

Public Sub StopHook(hWnd As Long)
    SetWindowLong hWnd, GWL_WNDPROC, hHook
    hHook = 0
End Sub

Private Function WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    WindowProc = CallWindowProc(hHook, hWnd, uMsg, wParam, lParam)
    If uMsg = WM_DEVICECHANGE Then
      If wParam = DBT_DEVICEARRIVAL Then
        Form1.Cls
        Form1.Print "Conectaron", Time
        Form1.Print
        Form1.Print FlashSerials
      ElseIf wParam = DBT_DEVICEREMOVECOMPLETE Then
        Form1.Cls
        Form1.Print "Desconectaron", Time
        Form1.Print
        Form1.Print FlashSerials
      End If
    End If
End Function
 
Public Function FlashSerials() As String
 
   Dim TGUID As GUID
 
   Call IIDFromString(StrPtr("{a5dcbf10-6530-11d2-901f-00c04fb951ed}"), TGUID)
 
   Dim hDev As Long
   hDev = SetupDiGetClassDevs(TGUID, &H0, &H0, &H12)
   If hDev = -1 Then Exit Function
 
   Dim lCount       As Long
   Dim lSize        As Long
   Dim DTL          As SP_DEVICE_INTERFACE_DETAIL_DATA
   Dim DTA          As SP_DEVICE_INTERFACE_DATA
 
   DTA.cbSize = Len(DTA)
   DTL.cbSize = &H5
 
   While Not (SetupDiEnumDeviceInterfaces(hDev, &H0, TGUID, lCount, DTA) = &H0)
     Call SetupDiGetDeviceInterfaceDetail(hDev, DTA, ByVal &H0, &H0, lSize, ByVal &H0)
     Call SetupDiGetDeviceInterfaceDetail(hDev, DTA, DTL, ByVal lSize, &H0, ByVal &H0)
     If UBound(Split(DTL.strDevicePath, "#")) > 1 Then
       FlashSerials = FlashSerials & Split(UCase$(DTL.strDevicePath), "#")(2) & Chr$(&HD)
     End If
     lCount = lCount + 1
   Wend
 
   Call SetupDiDestroyDeviceInfoList(hDev)
  
   If FlashSerials = "" Then FlashSerials = "No hay conexiones"
  
End Function




FORM

Código:

Option Explicit

Private Sub Form_Load()
 AutoRedraw = True
 Print FlashSerials
 Call SetWindowPos(Form1.hWnd, &HFFFF, &H0, &H0, &H0, &H0, &H3) 'form on top
 Call StartHook(hWnd)
End Sub

Private Sub Form_Unload(Cancel As Integer)
   Call StopHook(hWnd)
End Sub





http://www.virustotal.com/file-scan/report.html?id=4e03da8a806215953259ea3291bc79d7cab8226fdabb14765efdd81b4b94eae1-1317934469




« Última modificación: 7 Octubre 2011, 03:20 am por Hasseds » En línea

Sergio Desanti
BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 3.144


I'Love...!¡.


Ver Perfil WWW
Re: Seriales de Pen-Drives conectados (SRC)
« Respuesta #6 en: 7 Octubre 2011, 03:30 am »

.
No recuerdo bien pero ya habia visto un codigo asi hace tiempo... igual no recuerdo donde... jaja a mi biblioteca.

Dulces Lunas!¡.
En línea




CScript (Actualizado 26/06/2013).

FileX <-- Re-modelando...
Web Principal-->[ Blog(VB6/C/C++) | Host File | Scan Port) ]

The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilit y el metal mi relig
Maurice_Lupin


Desconectado Desconectado

Mensajes: 353

GPS


Ver Perfil WWW
Re: Seriales de Pen-Drives conectados (SRC)
« Respuesta #7 en: 7 Octubre 2011, 03:40 am »

Entendi que hook es detectar las acciones que el usuario realiza mientras el programa esta activo, en este caso el USB conectado o no.

Me sirve, claro que si, como decimos en mi barrio: Gracielas  ;D

En línea

Un error se comete al equivocarse.
Hasseds

Desconectado Desconectado

Mensajes: 145



Ver Perfil
Re: Seriales de Pen-Drives conectados (SRC)
« Respuesta #8 en: 7 Octubre 2011, 03:43 am »

mmm... me parece q me fuí al carajo  >:D


« Última modificación: 7 Octubre 2011, 05:04 am por Hasseds » En línea

Sergio Desanti
.:UND3R:.
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.118


Ingeniería inversa / MASM


Ver Perfil WWW
Re: Seriales de Pen-Drives conectados (SRC)
« Respuesta #9 en: 7 Octubre 2011, 05:52 am »

es una excelente herramienta para evitar el cracking de alguna forma, vender un software con dongle en donde el programa pide un serial y un pendrive conectado este serial es algún algoritmo del serial del pendrive por lo que si se coloca el serial este al pasar por algunos cálculos debería ser el mismo serial que el del pendrive, si no retorna serial incorrecto o llave USB incorrecta


aclaro que es una idea de la funcionalidad que se le puede dar, no necesariamente es para eso,Saludos

PD: un programa que permita una serie de pendrive determinados conectarce al PC

sistema de seguirdad para aislar troyanos.

etc

Saludos

Saludos
« Última modificación: 7 Octubre 2011, 14:23 pm por raul338 » En línea


Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)
Páginas: [1] 2 3 Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines