usb disklerle serial üretmek

1 2
19/04/2011, 16:58

vetaltan

değerli arkadaşlar
access üzerinde yapmış olduğum programın dağıtımını güvenle yapmak istiyorum.hdd,anakart vb serial üreten ve accesstr de paylaşılan progamlar müşterinin anakart,harddisc vb gibi değişikliklerinde tekrar şifre almasını gerektiriyor.
Forumda birkaç konuda rastlamış olduğum usb flash diskten serial üretme hakkında detaylı bilgi ve kod göremedim.(belkide var ama ben rastlayamadım.)usb flash disk ten serial üretme ve programı bu şekilde güvenlik altına almakla ilgili benim göremediğim bir konu yada bu güvenlik şeklini kullanan varmı?
19/04/2011, 17:02

mehmetdemiral

Yani flash diskin seri nosuna göre çalışan bir program mı demek istiyorsunuz? Program flasha yüklenecek ve sadece o takılıyken çalışacak öyle mi?
19/04/2011, 17:08

alpeki99

Dağıtımınımı güvenle yapmak istiyorsunuz yoksa lisans numarasını üretmek için USB bellekmi kullanmak istiyorsunuz? Eğer amaç lisans numarası üretmek ise mehmet abinin konuları ile birlikte bir kaç konu daha var sitede. Maksadınız kırılmasını zorlaştırmak ise özel program desteği kullanmanız lazım.
19/04/2011, 17:10

mehmetdemiral

Bu forumda benim serial üretimi ile ilgili geniş bir çalışmam var. İsterseniz ondaki disk modülünde yer alan hdd serial modülünde değişiklik yaparak şu modüllerden birini kullanabilirsiniz. (Tabii ki bazı değişklikler yapmak gerekiyor)

1. örnek modül

Kod:
Public Function GetSerialNumber(ByVal DriveLetter As String) As String
   Dim wmi_ld, wmi_dp, wmi_dd As ManagementObject
   Dim temp, parts(), ans As String

   ans = ""
   ' get the Logical Disk for that drive letter
   wmi_ld = New ManagementObject("Win32_LogicalDisk.DeviceID='" & _
    DriveLetter.TrimEnd("\"c) & "'")
   ' get the associated DiskPartition
      For Each wmi_dp In wmi_ld.GetRelated("Win32_DiskPartition")
      ' get the associated DiskDrive
      For Each wmi_dd In wmi_dp.GetRelated("Win32_DiskDrive")
      '  the serial number is embedded in the PnPDeviceID
         temp = wmi_dd("PnPDeviceID").ToString
         If Not temp.StartsWith("USBSTOR") Then
            Throw New ApplicationException(DriveLetter & " doesn't appear to be USB Device")
         End If
         parts = temp.Split("\&".ToCharArray)
         ' The serial number should be the next to the last element
         ans = parts(parts.Length - 2)
      Next
   Next

   Return ans
End Functionl number should be the next to the last element
         ans = parts(parts.Length - 2)
      Next
   Next

   Return ans
End Function


Sorun çıkartan Vista veya win7 için şu şekilde değiştirilmiş:

Kod:
Public Function GetSerialNumber(ByVal DriveLetter As String) As String
   Dim wmi_ld, wmi_dp, wmi_dd As ManagementObject
   Dim temp, parts(), ans As String

   ans = ""
   ' get the Logical Disk for that drive letter
   wmi_ld = New ManagementObject("Win32_LogicalDisk.DeviceID='" & _
    DriveLetter.TrimEnd("\"c) & "'")
   ' get the associated DiskPartition
      For Each wmi_dp In wmi_ld.GetRelated("Win32_DiskPartition")
      ' get the associated DiskDrive
      For Each wmi_dd In wmi_dp.GetRelated("Win32_DiskDrive")
         ' There is a bug in WinVista that corrupts some of the fields
         ' of the Win32_DiskDrive class if you instantiate the class via
         ' its primary key (as in the example above) and the device is
         ' a USB disk. Oh well... so we have go thru this extra step
         Dim wmi As New ManagementClass("Win32_DiskDrive")
         ' loop thru all of the instances. This is silly, we shouldn't
         ' have to loop thru them all, when we know which one we want.
         For Each obj As ManagementObject In wmi.GetInstances
            ' do the DeviceID fields match?
            If obj("DeviceID").ToString = wmi_dd("DeviceID").ToString Then
               ' the serial number is embedded in the PnPDeviceID
                temp = obj("PnPDeviceID").ToString
                If Not temp.StartsWith("USBSTOR") Then
                   Throw New ApplicationException(DriveLetter & " doesn't appear to be USB Device")
                End If
                parts = temp.Split("\&".ToCharArray)
                ' The serial number should be the next to the last element
                ans = parts(parts.Length - 2)
            End If
         Next
      Next
   Next

   Return ans
End Function


Bu da bir başka örnek

Kod:
Function GetSerialNumber(ByVal DriveLetter As String) As String
   Dim SerialNumber As String = ""
   Dim InstanceID As String = ""
   Dim HubDevicePath As String = ""
   Dim HubPortCount As Integer

   ' HubDevicePath and InstanceID are passed by reference
   If Not FindDiskDevice(DriveLetter, HubDevicePath, InstanceID) Then
      Throw New ApplicationException("Can't find the device instance")
   End If
   If Not InstanceID.StartsWith("USB\") Then
      Throw New ApplicationException("This drive doesn't appear to be a USB device")
   End If

   ' how many ports are there?
   HubPortCount = GetPortCount(HubDevicePath)
   If HubPortCount = 0 Then
      Throw New ApplicationException("Can't get the number of ports on the hub")
   End If

   ' loop thru all of the ports hunting for a matching InstanceID
   ' BTW: Port numbers start at 1
   For i As Integer = 1 To HubPortCount
      ' does the device match the InstanceID we're looking for?
      If FindInstanceIDByKeyName(GetDriverKeyName(HubDevicePath, i)) = InstanceID Then

         ' get the "index" for the serial number
         Dim DeviceDescriptor As USB_DEVICE_DESCRIPTOR = _
          GetDeviceDescriptor(HubDevicePath, i)

         ' a iSerialNumber of 0 means there is no serial number
         If DeviceDescriptor.iSerialNumber > 0 Then
            SerialNumber = GetStringDescriptor(HubDevicePath, i, _
             DeviceDescriptor.iSerialNumber)
            Exit For
         End If
      End If
   Next

   Return SerialNumber
End Function


Ve bu:

Kod:
Private Function GetDeviceNumber(ByVal DevicePath As String) As Integer
   Dim ans As Integer = -1

   Dim h As IntPtr = CreateFile(DevicePath.TrimEnd("\"c), 0, 0, Nothing, _
    OPEN_EXISTING, 0, Nothing)
   If h.ToInt32 <> INVALID_HANDLE_VALUE Then
      Dim reqSize As Integer = 0
      Dim Sdn As New STORAGE_DEVICE_NUMBER
      Dim nBytes As Integer = Marshal.SizeOf(Sdn)
      Dim ptrSdn As IntPtr = Marshal.AllocHGlobal(nBytes)

       If DeviceIoControl(h, IOCTL_STORAGE_GET_DEVICE_NUMBER, IntPtr.Zero, 0, _
        ptrSdn, Marshal.SizeOf(Sdn), reqSize, Nothing) Then
          Sdn = CType(Marshal.PtrToStructure(ptrSdn, GetType( _
           STORAGE_DEVICE_NUMBER)), STORAGE_DEVICE_NUMBER)
          ' just my way of combining the relevant parts of the
          ' STORAGE_DEVICE_NUMBER into a single number
          ans = (Sdn.DeviceType << 8) + Sdn.DeviceNumber
      End If
      Marshal.FreeHGlobal(ptrSdn)
      CloseHandle(h)
   End If

   Return ans
End Function

Bir başkası:

Kod:
Private Function FindDiskDevice(ByVal DriveLetter As String, ByRef HubDevicePath As _
String, ByRef InstanceID As String) As Boolean
   Dim ans As Boolean = False

   ' Get the DeviceNumber using the drive letter (without a trailing
   ' backslash, ie "C:"). We'll use this later to match the DeviceNumber
   ' of each of the device's Symbolic Name
   Dim DeviceNumber As Integer = GetDeviceNumber("\\.\" &  DriveLetter.TrimEnd("\"c))
   If DeviceNumber < 0 Then
      Return ans
   End If

   Dim DiskGUID As New Guid(GUID_DEVINTERFACE_DISK)

   ' We start at the "root" of the device tree and look for all
   ' devices that match the interface GUID of a disk
   Dim hSetup As IntPtr = SetupDiGetClassDevs(DiskGUID, 0, IntPtr.Zero, DIGCF_PRESENT _
    Or DIGCF_DEVICEINTERFACE)
   If hSetup.ToInt32 <> INVALID_HANDLE_VALUE Then

      Dim Success As Boolean
      Dim i As Integer = 0
      do
         ' create a Device Interface Data structure
         Dim dia As New SP_DEVICE_INTERFACE_DATA
         dia.cbSize = Marshal.SizeOf(dia)

         ' start the enumeration
         Success = SetupDiEnumDeviceInterfaces(hSetup, IntPtr.Zero, DiskGUID, i, dia)
         If Success Then
            ' prepare a Devinfo Data structure
            Dim da As New SP_DEVINFO_DATA
            da.cbSize = Marshal.SizeOf(da)

            ' prepare a Device Interface Detail Data structure
            Dim didd As New SP_DEVICE_INTERFACE_DETAIL_DATA
            didd.cbSize = 4 + Marshal.SystemDefaultCharSize ' trust me :)

            ' now we can get some more detailed information
            Dim nBytes As Integer = BUFFER_SIZE
            Dim nRequiredSize As Integer = 0
            If SetupDiGetDeviceInterfaceDetail(hSetup, dia, didd, nBytes, nRequiredSize, da) Then

              ' OK, let's get the Device Number again... this time using
              ' the device's "Symbolic Name". If the numbers match, we've
              ' found the one we're looking for.
              If GetDeviceNumber(didd.DevicePath) = DeviceNumber Then

                 ' This should get us to the USBSTOR "level"
                 Dim ptrPrevious As IntPtr
                 CM_Get_Parent(ptrPrevious, da.DevInst, 0)

                 ' Get the InstanceID
                 Dim ptrBuf As IntPtr = Marshal.AllocHGlobal(nBytes)
                 CM_Get_Device_ID(ptrPrevious, ptrBuf, nBytes, 0)
                 InstanceID = Marshal.PtrToStringAuto(ptrBuf)

                 ' This should get us to the USB "level" (the USB hub)
                CM_Get_Parent(ptrPrevious, ptrPrevious, 0)

                ' Now get the ID of the hub
                CM_Get_Device_ID(ptrPrevious, ptrBuf, nBytes, 0)
                Dim temp As String = Marshal.PtrToStringAuto(ptrBuf)
                Marshal.FreeHGlobal(ptrBuf)

                ' Build the final string that represents the full "Symbolic Name"
                ' of the USB Hub using its ID
                HubDevicePath = "\\.\" & temp.Replace("\", "#") &  "#{" &  _
                 GUID_DEVINTERFACE_USB_HUB &  "}"
                ans = True
                Exit Do
            End If
         End If
      End If
      i += 1
      Loop While Success
   End If

   SetupDiDestroyDeviceInfoList(hSetup)
   Return ans
End Function


Bir başka modül:

Kod:
Private Function GetDriverKeyName(ByVal HubPath As String, ByVal PortNumber _
As Integer) As String
   Dim ans As String = ""

   ' open a handle to the USB hub
   Dim hHub As IntPtr = CreateFile(HubPath, GENERIC_WRITE, FILE_SHARE_WRITE, _
    IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero)
   If hHub.ToInt32 <> INVALID_HANDLE_VALUE Then
      Dim nBytesReturned As Integer
      Dim nBytes As Integer = Marshal.SizeOf(GetType( _
       USB_NODE_CONNECTION_INFORMATION_EX))
      Dim ptrNodeConnection As IntPtr = Marshal.AllocHGlobal(nBytes)

      Dim NodeConnection As New USB_NODE_CONNECTION_INFORMATION_EX
      NodeConnection.ConnectionIndex = PortNumber
      Marshal.StructureToPtr(NodeConnection, ptrNodeConnection, True)

      ' let's check to see if there is something plugged in first
      If DeviceIoControl(hHub, IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX, _
       ptrNodeConnection, nBytes, ptrNodeConnection, nBytes, nBytesReturned, _
       IntPtr.Zero) Then
          NodeConnection = CType(Marshal.PtrToStructure(ptrNodeConnection, _
          GetType(USB_NODE_CONNECTION_INFORMATION_EX)), _
           USB_NODE_CONNECTION_INFORMATION_EX)

         If NodeConnection.ConnectionStatus = _
          USB_CONNECTION_STATUS.DeviceConnected Then

            ' now let's get the Driver Key Name
            Dim DriverKey As New USB_NODE_CONNECTION_DRIVERKEY_NAME
            DriverKey.ConnectionIndex = PortNumber
            nBytes = Marshal.SizeOf(DriverKey)
            Dim ptrDriverKey As IntPtr = Marshal.AllocHGlobal(nBytes)
            Marshal.StructureToPtr(DriverKey, ptrDriverKey, True)

            'Use an IOCTL call to request the Driver Key Name
            If DeviceIoControl(hHub, IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME, _
             ptrDriverKey, nBytes, ptrDriverKey, nBytes, nBytesReturned, IntPtr.Zero) Then
               DriverKey = CType(Marshal.PtrToStructure(ptrDriverKey, GetType( _
                USB_NODE_CONNECTION_DRIVERKEY_NAME)), _
                USB_NODE_CONNECTION_DRIVERKEY_NAME)
               ans = DriverKey.DriverKeyName
            End If
            Marshal.FreeHGlobal(ptrDriverKey)
         End If
      End If

      ' Clean up and go home
      Marshal.FreeHGlobal(ptrNodeConnection)
      CloseHandle(hHub)
   End If

   Return ans
End Function

Bir diğeri:

Kod:
Private Function GetPortCount(ByVal HubDevicePath As String) As Integer
   Dim ans As Integer = 0

   ' open a connection to the HubDevice (that we just found)
   Dim hHub As IntPtr = CreateFile(HubDevicePath, GENERIC_WRITE, _
    FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero)
   If hHub.ToInt32 <> INVALID_HANDLE_VALUE Then
      Dim nBytesReturned As Integer = 0
      Dim NodeInfo As New USB_NODE_INFORMATION
      NodeInfo.NodeType = USB_HUB_NODE.UsbHub
      Dim nBytes As Integer = Marshal.SizeOf(NodeInfo)
      Dim ptrNodeInfo As IntPtr = Marshal.AllocHGlobal(nBytes)
      Marshal.StructureToPtr(NodeInfo, ptrNodeInfo, True)

      ' get the number of ports on the hub
      If DeviceIoControl(hHub, IOCTL_USB_GET_NODE_INFORMATION, ptrNodeInfo, _
       nBytes, ptrNodeInfo, nBytes, nBytesReturned, IntPtr.Zero) Then
         NodeInfo = CType(Marshal.PtrToStructure(ptrNodeInfo, GetType( _
          USB_NODE_INFORMATION)), USB_NODE_INFORMATION)
         ans = NodeInfo.HubInformation.HubDescriptor.bNumberOfPorts
      End If

      Marshal.FreeHGlobal(ptrNodeInfo)
      CloseHandle(hHub)
   End If

   Return ans
End Function

Diğer bir çalışma daha:
Kod:
Private Function FindInstanceIDByKeyName(ByVal DriverKeyName As String) As String
   Dim ans As String = ""
   Dim DevEnum As String = REGSTR_KEY_USB

   ' Use the "enumerator form" of the SetupDiGetClassDevs API
   ' to generate a list of all USB devices
   Dim h As IntPtr = SetupDiGetClassDevs(0, DevEnum, IntPtr.Zero, DIGCF_PRESENT _
    Or DIGCF_ALLCLASSES)
   If h.ToInt32 <> INVALID_HANDLE_VALUE Then
      Dim ptrBuf As IntPtr = Marshal.AllocHGlobal(BUFFER_SIZE)
      Dim KeyName As String
      Dim Success As Boolean
      Dim i As Integer = 0

      Do
         ' create a Device Interface Data structure
         Dim da As New SP_DEVINFO_DATA
         da.cbSize = Marshal.SizeOf(da)

         ' start the enumeration
         Success = SetupDiEnumDeviceInfo(h, i, da)
         If Success Then
            Dim RequiredSize As Integer = 0
            Dim RegType As Integer = REG_SZ

            KeyName = ""
            ' get the driver key name
            If SetupDiGetDeviceRegistryProperty(h, da, SPDRP_DRIVER, RegType, ptrBuf, _
             BUFFER_SIZE, RequiredSize) Then
               KeyName = Marshal.PtrToStringAuto(ptrBuf)
            End If

            ' do we have a match?
            If KeyName = DriverKeyName Then
               Dim nBytes As Integer = BUFFER_SIZE
               Dim sb As New StringBuilder(nBytes)

               SetupDiGetDeviceInstanceId(h, da, sb, nBytes, RequiredSize)
               ans = sb.ToString()
               Exit Do
           End If
      End If
      i += 1
      Loop While Success

      CloseHandle(ptrBuf)
      SetupDiDestroyDeviceInfoList(h)
   End If

   Return ans
End Function

Vallahi bitmiyor
Kod:
Private Function GetDeviceDescriptor(ByVal HubPath As String, ByVal PortNumber As _
Integer) As USB_DEVICE_DESCRIPTOR
   Dim ans As New USB_DEVICE_DESCRIPTOR
   Dim hHub, ptrDescReq, ptrDevDesc As IntPtr
   Dim DescReq As New USB_DESCRIPTOR_REQUEST
   Dim DevDesc As New USB_DEVICE_DESCRIPTOR
   Dim nBytesReturned, nBytes As Integer

   ' open a handle to the USB hub
   hHub = CreateFile(HubPath, GENERIC_WRITE, FILE_SHARE_WRITE, IntPtr.Zero, _
    OPEN_EXISTING, 0, IntPtr.Zero)
   If hHub.ToInt32 <> INVALID_HANDLE_VALUE Then
      nBytes = BUFFER_SIZE

      ' build a "request" packet for a Device Descriptor
      DescReq = New USB_DESCRIPTOR_REQUEST
      DescReq.ConnectionIndex = PortNumber ' the "port number" on the hub
      DescReq.SetupPacket.wValue = USB_DEVICE_DESCRIPTOR_TYPE << 8
      DescReq.SetupPacket.wLength = CShort(nBytes - Marshal.SizeOf(DescReq))
      ptrDescReq = Marshal.AllocHGlobal(BUFFER_SIZE)
      Marshal.StructureToPtr(DescReq, ptrDescReq, True)

      ' Use an IOCTL call to request the Device Descriptor
      If DeviceIoControl(hHub, IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, _
       ptrDescReq, nBytes, ptrDescReq, nBytes, nBytesReturned, IntPtr.Zero) Then
         ' the pointer to the Device Descriptor is just "off the edge" of
         ' the descriptor request packet.
         ptrDevDesc = New IntPtr(ptrDescReq.ToInt32 + Marshal.SizeOf(DescReq))
         ans = CType(Marshal.PtrToStructure(ptrDevDesc, GetType( _
          USB_DEVICE_DESCRIPTOR)), USB_DEVICE_DESCRIPTOR)
      End If

      ' Clean up and go home
      Marshal.FreeHGlobal(ptrDescReq)
      CloseHandle(hHub)
   End If

   Return ans
End Function

Aha yine
Kod:
Private Function GetStringDescriptor(ByVal HubPath As String, ByVal PortNumber As _
Integer, ByVal Index As Integer) As String
   Dim ans As String = ""
   Dim hHub, ptrDescReq, ptrStrDesc As IntPtr
   Dim DescReq As New USB_DESCRIPTOR_REQUEST
   Dim StrDesc As New USB_STRING_DESCRIPTOR
   Dim nBytesReturned, nBytes As Integer

   ' open a handle to the USB hub
   hHub = CreateFile(HubPath, GENERIC_WRITE, FILE_SHARE_WRITE, IntPtr.Zero, _
    OPEN_EXISTING, 0, IntPtr.Zero)
   If hHub.ToInt32 <> INVALID_HANDLE_VALUE Then
      nBytes = BUFFER_SIZE

      ' build a "request" packet for a StringDescriptor
      DescReq = New USB_DESCRIPTOR_REQUEST
      DescReq.ConnectionIndex = PortNumber
      DescReq.SetupPacket.wValue = CShort((USB_STRING_DESCRIPTOR_TYPE << 8) + _
       Index)
      DescReq.SetupPacket.wLength = CShort(nBytes - Marshal.SizeOf(DescReq))
      DescReq.SetupPacket.wIndex = &H409 ' Language Code

      ' we have to be a bit creative on how we "zero out" the buffer
      Dim NullString As New String(Chr(0), BUFFER_SIZE \ Marshal.SystemDefaultCharSize)
      ptrDescReq = Marshal.StringToHGlobalAuto(NullString)
      Marshal.StructureToPtr(DescReq, ptrDescReq, True)

      ' Use an IOCTL call to request the String Descriptor
      If DeviceIoControl(hHub, IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, _
       ptrDescReq, nBytes, ptrDescReq, nBytes, nBytesReturned, IntPtr.Zero) Then
         ' the pointer to the String Descriptor is just "off the edge" of
         ' the descriptor request packet.
         ptrStrDesc = New IntPtr(ptrDescReq.ToInt32 + Marshal.SizeOf(DescReq))
         StrDesc = CType(Marshal.PtrToStructure(ptrStrDesc, GetType( _
          USB_STRING_DESCRIPTOR)), USB_STRING_DESCRIPTOR)
         ans = StrDesc.bString
      End If

      ' Clean up and go home
      Marshal.FreeHGlobal(ptrDescReq)
      CloseHandle(hHub)
   End If

   Return ans
End Function

Şaka bir yana bu bilgiler aşağıdaki adresten alındı:
http://www.emmet-gray.com/Articles/USB_S...umbers.htm
19/04/2011, 18:07

vetaltan

cevaplar için teşekkürler,
benim yapmak istediğim,programın c:\\ de yüklü olması ve orada çalışması ama serial üretmeyi flash diskten yapmasını.böylece programı her alan kişiye yanında birde flash disk vermek böylece flash disk olmadan başka bilgisayarda programı çalıştırmasını engellemek.
20/04/2011, 08:20

emturker

Auton Cam Programının Bilgisayarda Çalıştırması İçin,
Usb / Dongle İçinde Emulator Gerekir Sanırım Böyle Bir Sistem Arıyorsunuz..
1 2