Dongle İleri Teknolojisi Ve Tersinir Mühendislik Mimarisi

SafeNET Microdog

Genel Bakış

SafeNET Microdog (orijinal olarak RainbowChina’ya aittir), düşük maliyeti ve çok çeşitli platformlar arası uyumluluğu nedeniyle tarihsel olarak popüler olan USB / Paralel tabanlı bir donanım güvenlik modülüdür.

Özellikleri

  • Flash bellek 200 bayt oku / yaz
  • Parola korumasıyla Erişim Kontrolü
  • Temel gizleme ve hata ayıklama önleme özelliklerini içeren istemci kitaplığı
  • Benzersiz üretici seri numarası
  • Bir yazılım paketini belirli bir dongle çalıştırma ile bağlamak için Satıcı Kimliği
  • Gömülü kripto işlemci
  • Sırayla birden fazla dongle kullanımı desteği (kademeli)

Bileşenler

  1. Dongle’ın kendisi, sürücü / daemon’dan HID aracılığıyla özel bir protokol aracılığıyla erişilen bir şifreleme işlemcisi içerir.
  2. Sürücü / arka plan programı, herhangi bir istemci kitaplığı çağrıları ile donanım arayüzü arasında bir aracıdır. Belirli bir platform verilen tüm revizyonlar için bu katman değişmez.
  3. İstemci kitaplığı, belirli bir kullanıcı alanı sürecinin bir kripto talebini gerçekleştirmek için etkileşime girdiği en uzak soyut katmandır. Microdog, bu istemci kitaplığının iki ana revizyonundan yararlandı.a. 3.4 revizyonu, işlemleri gerçekleştirmek için ioctl / DeviceIoControl aracılığıyla doğrudan sürücü erişimi gerektirir. Linux için bu, çekirdek modülüyle iletişim anlamına geliyordu – benzer şekilde Windows bir sürücü kullanıyor.b. Revizyon 4.0, platform uyumluluğu amacıyla, bu çekirdek modülünü kaldırdı ve yalnızca bir kullanıcı alanı arka plan programı ve soketler üzerinden IPC aracılığıyla açığa çıkan doğrudan HID çağrılarında çalışır. Bununla birlikte, Windows’un bu revizyon için hala bir sürücü kullandığına dikkat edilmelidir.

Sürücüye giden paketlerin protokolünün aynı olduğuna dikkat edilmelidir; revizyondan bağımsız olarak.

İstemci Kitaplığını hacklemek

Arka fon

İstemci kitaplığı, bir geliştirici için birincil etkileşim noktasıdır.

SafeNET, bir başlık dosyası (gsmh.h) ve bir statik kitaplık (örn. Mhwin.lib / mhlinux.o) sağlar. Kitaplık, dongle’ın geliştirici şifresini değiştirmek, dongle’ın flash alanına yazmak, üretici seri numarasını almak, dongle’ın Satıcı Kimliğini almak veya herhangi bir bayt akışını 4 bayt yanıtına dönüştürmek için bazı yönetimsel ve kullanıcı tabanlı işlevleri ortaya çıkarır (DogConvert ) bazı yonga üzerinde kara kutu algoritması ve geliştirici tarafından tanımlanan tohum üretiminden yararlanan güvenli bir karma işlem yoluyla.

Sonuç olarak, DogConvert, gizleme için veya genişletilmiş bir şifreleme işlevine ilkel olarak kullanılan birincil işlevdir. Elbette kendi başına 32 bitlik bir değer oldukça zayıftır. Sonuç olarak, bu işlev kendi başına kullanılmak üzere tasarlanmamıştır.

Sürüm 4.0

Normal çalışma sayesinde, istemci kitaplığının her kopyası belirli bir satıcı kimliği ve dongle satırına bağlanır. Sonuç olarak, bir istemci kitaplığı, aynı satıcı hattına ait bir donanım kilidi olmadan tam olarak çalışmayacaktır.

Sonuç olarak, yapılacak ilk şey, belirli bir istemci kitaplığının diğerinden ne kadar farklı olduğunu belirlemek olacaktır. İkisini karşılaştırmak, tek fark olarak aşağıdaki bloğu verir:

Şeritlenmemiş varyantlarda buna Veri Havuzu denir – dongle (Satıcı Kimliği, dahili kimlikler, vb.) Hakkında şifrelenmiş meta veriler içerir. Bu verileri doğru konumdaki bir program üzerine kopyalayarak (bu bloğu belirli bir ikili dosyada bulmak oldukça kolaydır), hedef alternatif dongle ile iletişim kurmalıdır. Bununla birlikte, DogConvert’ın, yapılandırılabilir bir baytın hangi tohumun kullanılacağına karar verdiği bir değerler tablosundan alınan hash ile aynı yanıtı vermeyeceği unutulmamalıdır.

Bazı durumlarda, bir uygulama yalnızca bir API çağrısı aracılığıyla dongle’ın varlığını kontrol edebilir. Bu durumda, DataPool’u değiştirmek, bir kişinin belirli bir donanım kilidini kullanmasına ve belirli bir yazılım parçası için gerçek bir donanım kilidinin varlığını yanıltmasına izin verebilir.

Bunu kopyalamak ilginç değil, ancak … aslında bloğun şifresini çözelim ve ne olduğunu görelim:

Not olarak, mhlinux.o (linux statik kitaplıkları) genellikle bu bloğun anahtarını 0xB500’e koyar.

Tüm blok 112 baytlık bir dizidir: 000-> 016 (iv) 016-> 096 (şifreli metin) 096-> 112 (anahtar)

Şifreli metin Rijndael bloğu şifrelenmiştir (128 bit blok boyutu) – şifresini çözmek birkaç alan verir, ancak en çok ilgilendiğimiz şey satıcı kimliği (DogID olarak da bilinir):

Bu DogID değerinin (örnekte 0xF9BDE), yeni bir dongle desteğiyle bir kitaplığı hızlı bir şekilde yeniden paketlemek için kullanılabilecek cihaz tanımlayıcısı aracılığıyla alınabileceği de not edilmelidir.

Sürüm 3.4

Eski istemci kitaplığı, AES veya herhangi bir karma kullanmayan Dongle Serisini ve kimliğini gizlemek için farklı bir yöntem kullandı.

Bu durumda “DataPool”, “NEIWAIJM” ile başlar. Bundan çok sonra, “PickupDogID” ve “PickupSerialNo” fonksiyonları tarafından referans verilen iki bloğumuz var. Bloklar sırasıyla 48 bayt ve 96 bayttır.

Bu gizlemenin arkasındaki … algoritma nispeten basittir.

Temelde, bloklar 12 baytlık dizilere ayrılır. Her sıra okundukça, ya mevcut değerden çıkarılır, eklenir ya da bir döngüde XORlanır.

Get_serial için:

  • bayt 0,3,6,9 eklenir
  • bayt 1,4,7,10 çıkarılır
  • bayt 2,5,8,11 XORed

Get_dog_id için:

  • bayt 0,3,6,9 eklenir
  • bayt 1,4,7,10 XOR’dur
  • bayt 2,5,8,11 çıkarılır

def get_serial(indata):
out = bytearray(4)
v3 = 0
for i in range(0,4):
out[i] = 0
for j in range(0,12):
v2 = j % 3
if(j % 3 == 1):
out[i] = (out[i] – indata[v3]) & 0xFF
v3 +=1
elif(v2 > 1):
if(v2 == 2):
out[i] ^= indata[v3]
v3 +=1
elif(v2 == 0):
out[i] = ( out[i] + indata[v3]) & 0xFF
v3 +=1
return out

def get_dog_id(indata):
out = bytearray(8)
v3 = 0
for i in range(0,8):
out[i] = 0
for j in range(0,12):
v2 = j % 3
if(j % 3 == 1):
out[i] ^= indata[v3]
v3 +=1
elif(v2 > 1):
if(v2 == 2):
out[i] = (out[i] – indata[v3]) & 0xFF
v3 +=1
elif(v2 == 0):
out[i] = ( out[i] + indata[v3]) & 0xFF
v3 +=1
return out

Nasıl yeniden paketleriz?

Bu algoritmayı tersine çevirebiliriz, ancak algoritmanın kendisi doğası gereği zayıftır …

Şunu bir düşünün: Toplama, Çıkarma veya XOR 0 yaptığınızda ne olur? Bu doğru, hiçbir şey !!!

Teknik olarak, 8 baytlık bir DogID ve 4 baytlık bir seri alabilir, baytları bölebilir ve her 12 bayt satırın başına bir tane yapıştırabilirdik ve işe yarardı! Bunun gibi bir şey:

def enc_vals(indata):
out = bytearray(len(indata) * 12)
for i in range(0,len(indata)):
out[i*12] = indata[i]
return out

3.4 İstemci Kitaplığını taklit etme

Bir şeyi bir dereceye kadar doğrulukla taklit etmek için önce ne olduğunu ve ne yaptığını anlamalıyız. Bu durumda:

  • Hata ayıklamadan önce kütüphane hakkında elimizden gelen her şeyi öğrenmek istiyoruz.
  • İsteğe bağlı olarak gerçek bir dongle ile değiştirilmiş bir istemci kitaplığı çalıştırmak istiyoruz (eğer varsa) ve bazı işlem sonucu veri örnekleri dahil olmak üzere gerçekte nasıl çalışması gerektiğine dair bazı veriler toplamak istiyoruz.
  • Tersine çevrilmiş işlevselliğimizi daha iyi anlamamıza yardımcı olacak her türlü dokümantasyonu bulmak istiyoruz.
  • Sürücünün kendisini taklit etmek istiyoruz – istemci lib’nin tüm işlemleri gerçekleştirdiği uç nokta.
  • Ayrıca, sürücüdeki sözde dongle işlevselliğini, muhtemelen en karmaşık kısım olacak gerçek donanımla konuşuyormuş gibi davranacak şekilde yeniden oluşturmak istiyoruz.

Genel tasarım

Çoğu durumda, istemci kitaplığı şeritlenmemiş ve karıştırılmamış. Sonuç olarak, işlevler ve bazı statik değerler orijinal adlarını koruyacaktır.

Şimdi, buna saldırmanın birkaç yolu var, biz de şunları yapabiliriz:

A. Dışa aktarım tablosuna bakın, arayüzlerin haritasını çıkarın ve kendimiz bir başlık bulun.

B. Tamamen çevrimiçi olan geliştirici belgelerini araştırın.

Sorunu kurtarmak için, aradığımız şey budur (süper sözcüklerle ifade edilmiştir):

[Globals]

1.unsigned short DogAddr

200 baytlık dahili flash belleğin adresi bir okuma / yazma işlemi başlamalıdır.

2.unsigned short DogBytes

DogData’daki bayt sayısı – okuyor / yazıyorsa, 200-DogAddr’yi geçemez. Normalde 0-200 arasındadır, ancak DogConvert () işlemleri yalnızca 1-63’e izin verir.

3.unsigned long DogPassword

Yeni bir parola ayarlama, flash bellek okuma veya yazma gibi bazı işlevlerin çalışması için bir parola gerekir. Parola fabrikadan 0x00000000’dür.

4.unsigned long NewPassword

Yalnızca SetPassword () ile yeni bir parola ayarlamak için kullanılan bir arabellek

5.unsigned long DogResult

DogConvert () sonuçlarının depolandığı bir arabellek.

6.unsigned char DogCascade

LPT Mikro Günlükleri için, maksimum 16 ile zincirleme bağlanabilirler. Bu değer (0-15) bir dizin numarası tutar, böylece kitaplık hangisinden bahsettiğinizi bilir. Bu her zaman USB için 0x00 olarak ayarlanmıştır.

7.void *DogData

Verileri dönüştürmek veya flash belleğe / bellekten veri okumak / yazmak için kullanılabilen bir arabellek.

[Dışa Aktarılan İşlevler]

1.DogCheck()

1. Köpek Kontrolü () Okur: DogCascade Yazıyor: Yok Başarı durumunda 0 döndürür, aksi takdirde hata kodu döner. Tanım: Kısacası, bu sürücüye dongle ile konuşup konuşamayacağını sorar. Çok güvenli olmasa da basit bir isDonglePresent () denetimi için kullanışlıdır.

2.ReadDog()

2. ReadDog () Okur: DogCascade, DogAddr, DogBytes, DogData, DogPassword Yazıyor: DogData Başarı durumunda 0 döndürür, aksi takdirde hata kodu döner. Açıklama: n’nin DogBytes ve y’nin DogAddr olduğu y’den başlayarak 200 bayt flash bellek alanından n bayt okur. Düzgün çalışması için Dongle şifresi gereklidir.

3.WriteDog()

3.WriteDog () Okur: DogCascade, DogAddr, DogBytes, DogData, DogPassword Yazıyor: Yok Başarı durumunda 0 döndürür, aksi takdirde hata kodu döner. Açıklama: n’nin DogBytes ve y’nin DogAddr olduğu y’den başlayarak 200 bayt flash bellek alanına n bayt yazar. Dongle şifresinin düzgün çalışması için gereklidir.

4.DogConvert()

4. DogConvert () Okur: DogCascade, DogBytes, DogData Yazıyor: DogResult Başarı durumunda 0 döndürür, aksi takdirde hata kodu döner. Açıklama: DogData’da 1-63 baytlık tamponu alın ve seçilen mevcut algoritmaya bağlı olarak 4 baytlık bir veri hashini döndürdüğü dongle’a gönderin. 200 baytlık dahili flaş belleğin son 4 baytı algoritmayı belirler; Bayt 196, algoritmaya karar verir ve baytlar 197, 198 ve 199, algoritma tanımlayıcısına karar verir. Sonuç olarak, 16.777.216 olası algoritma mevcuttur.

5.DisableShare()

5. Paylaşımı Devre Dışı Bırak () Okur: DogCascade Yazıyor: Yok Başarı durumunda 0 döndürür, aksi takdirde hata kodu döner. Açıklama: Bir dongle’ın paralel bağlantı noktası paylaşım çözümleri arasında paylaşılma özelliğini devre dışı bırakır … yalnızca paralel bağlantı noktası donanım kilitleri için kullanılır.

6.GetCurrentNo()

6.GetCurrentNo () Okur: DogCascade, DogData Yazıyor: DogData Başarı durumunda 0 döndürür, aksi takdirde hata kodu döner. Açıklama: Donanım kilidinden benzersiz bir üretici seri numarasını okuyun. Satıcı kimliğinden farklı olarak, bu her zaman TEK bir özel dongle’a özgüdür. Müşterileri vb. Tanımlamak için kullanışlıdır ve normalde 4 bayt.

7.SetPassword()

7. SetPassword () Okur: DogCascade, DogPassword, NewPassword Yazıyor: Yok Başarı durumunda 0 döndürür, aksi takdirde hata kodu döner. Açıklama: Yeni bir dongle şifresi belirler.

8.SetDogCascade()

8. SetDogCascade () Okur: DogCascade, DogPassword, DogData Yazıyor: Yok Başarı durumunda 0 döndürür, aksi takdirde hata kodu döner. Açıklama: Dongle kademesini, DogData’daki bayta göre belirlenen 0-15’e ayarlar.

[İstemci Kitaplığı için Dahili İşlevler]

Aşağıdaki işlevler kitaplıkta mevcuttur, ancak yalnızca dahili olarak kullanılır.

  1. EnableShare () Takılan donanım kilidinin kullanılmamasını ve programımızla paylaşılabilmesini sağlamak için herhangi bir DogConvert işleminden önce çağrılır.
  2. ProcessInput () Bu, sürücünün ihtiyaç duyduğu işlem kodunu belirleyen şeydir, böylece dongle’ın kendisi ne yapacağını bilir, ayrıca dongle’a 200 bayttan fazla göndermeye çalışmadığımızdan emin olmak için kontroller yapar (istemci tarafı giriş doğrulaması) ve temel olarak, küresel değişkenlerin akıl sağlığı kontrol edildiğini ve devam etmeden önce mantıklı olduğu.
  3. ProcessOutput () 0 döndüren bir saplama – amaç yok.
  4. ProtectEntry () Küresellerimizi bir paket yürütmek üzere gizlemenin her adımında hangi sırayı belirler. Ayrıca, dongle’ın doğru şekilde mi yoksa hiç yanıt verdiğini ve ardından globalleri geçerli verilere göre doldurduğunu belirlemek için yanıtımıza yönelik tüm denetim kodunu içerir. Buna daha sonra bakmak çok önemli olacak.
  5. PickupDogID () Önceki blog gönderisinden bu, istemci kütüphanesinden gelen 8 baytlık kimliğin şifresini çözer ve onu bellekte tutar, nedenini daha sonra göreceksiniz.
  6. PickupSerialNo () Önceki blog gönderisinden bu, istemci kütüphanesinden 4 baytlık DogSerial’ın şifresini çözer ve sürücüye göndermek için saklar. Buradaki fikir, serinin, sürücümüzün USB aygıt tanımlayıcısını aradığında ve onu istediğinde bulduğu seri ile eşleşmesi gerektiğidir, ancak ben kendimin önüne geçiyorum.
  7. PlatformEntry0-9 () Cehennemin on adımı (işlevleri) – esasen insanlarla sevişmek için bir labirent. Sonunda, tersine çevrilmemiş HİÇBİR ŞEY değiştirilmez. Bunu insanları kızdırmak için yaptılar. Platform girişi 9 en ilginç olanıdır, çünkü aslında verilerin şifrelenmesini ve dongle sürücüsüne bir paket biçiminde gönderilmesini çağıran noktadır … Bu seride GERÇEKTEN her şeyi yapan tek işlev budur.
  8. ResetDriverData () Dongle sürücüsünden bir yanıt geldiğinde, şifresinin çözülmesi gerekir … Bunu yapan şey budur.
  9. InitializeDriverInData () Tersine mühendislerin canını sıkmak için tüm küresel değişkenlerimizi bir kod tasarımı labirenti boyunca ilerleten bir olaylar zinciri başlatır. Ayrıca rasgele bir sayı oluşturur, bu sayıya 0x646C6F47 ekler ve ilk 8 bayttan sonra paketteki tüm verileri bir kayan anahtar olarak XOR’tur.

10. GetMaskKey () Çekirdek maske anahtarını alın ve ona 0x646C6F47 (veya ‘dloG) ekleyin.

11.GenerateRand () Günün saatini alın ve bunu bir tohum maskesi anahtarı olarak döndürün.

12.LinuxDriverEntry () / dev / mhdog’a bir dosya tanımlayıcı açın, 8 baytlık bir argümanla bir 0x6B00 ioctl çağrısı yapın (bellek, bir istek paket arabelleğine ve bir yanıt paketi arabelleğine kaydırmalar).

13.LinuxUSBDriverEntry () / dev / usbdog için bir dosya tanımlayıcı açın, ardından LinuxDriverEntry () ile aynı akışı izleyin.

30.000 fitten, içinde bir yerde aşağıdaki verileri içeren bir cihazımız var:

  • 200 bayt flash bellek
  • 4 bayt Satıcı Kimliği Vendor ID (DogSerial)
  • 8 bayt DogID
  • 4 bayt Üretici Kimliği Manufacturer ID
  • 4 bayt DogPassword
  • 1 bayt DogCascade
  • 1 baytlık DogShare

Sadece bu bilgilerle, dongle’ın dahili bellek gereksinimlerini soyutlayarak emülatörümüzü oluşturmaya başlayabiliriz.

//Even though the last two values are byte, I’m super lazy and don’t want to deal //with alignment issues later.

struct MicroDog_Memory{
unsigned int vendor_id;
unsigned char dog_id[8];
unsigned int mfg_serial;
unsigned int dog_password;
unsigned int dog_cascade;
unsigned int dog_share;
};

//We also know that every DogConvert request is going to deal with a 4 byte response and 1-63 bytes of data based on DogBytes.

struct MicroDog_Convert_Tx{
unsigned int DogResponse;
unsigned int DogBytes;
//yes, this should be a short. unsigned char DogRequest[64];
};

İstemci kitaplığı elimizdeyken, hedefimiz artık istemci kitaplığını kendi kodumuzla konuşturmaya kayıyor. Dışa aktarılan her işlemle başlayalım, dongle istemci kitaplığının bunu nasıl işlediğine ve ardından sürücüye neyin gönderildiğine bakalım.

DogCheck

Buradan başlamak için iyi bir yer, örnek bir program oluşturmak ve onu istemci kütüphanemizle bağlamaktır.

include

include “gsmh.h”

int main(){
int errcode = DogCheck();
if(errcode){
printf(“Fail! Errcode :%d \n”, errcode);
return -1;
}
printf(“Success!\n”);
return 0;

Tamam, oldukça basit – dongle’a bir çağrı yapıyoruz ve varsa sıfır, yoksa 1 döndürüyor. İstemci kitaplığında ne yapar?

return ProtectEntry(1, (int)ProcessInput, (int)ProcessOutput);

Yani ProtectEntry 3 parametre alır: 1. İşlem kodu ile ilişkili bir sayı (1 DogCheck) 2. ProcessInput’un sonucu (bir hata kodu) 3. ProcessOutput’un sonucu her zaman 0’dır çünkü hepsi bu kadar.

Yukarıdaki notları okumak size her bir işlevin ne yaptığını söyleyecektir, ancak yığın izleme DogCheck’in yolunun şu şekilde göründüğünü gösterecektir:

DogCheck->ProcessInput()->ProcessOutput()->ProtectEntry()-> PlatformEntry0-8 (in calculated pseudorandom order) -> PlatformEntry9->InitializeDriverInData()->LinuxDriverEntry/LinuxUsbDriverEntry()->PlatformEntry9->P rotectEntry()->ResetDriverData()

Tüm platformEntry0-8 zırvalarını atlayarak ve baytları değiştirerek, sürücüye göndermek için globallerden istek paketimizi oluşturan PlatformEntry9’a geliyoruz.

InitializeDriverInData, sürücüye gönderilen istek paketini oluşturmaktan sorumludur. İşte bir şekilde yeniden yapılandırılmış gibi görünüyor:

Kısacası bu, paketimizi ProcessInput () ile oluşturulan başka bir veri yapısından oluşturmaktır. İşleri biraz daha okunaklı hale getirmek için IDA’da yapıyı oluşturdum:

struct_request_buffer {
_WORD magic; // 0x484D
_WORD opcode; // Depends on what we’re doing – for DogCheck, this would be 0x01
_DWORD VendorID; // Our vendor ID from the library.
_DWORD MaskKey; // Pseudo-random number used as an IV to encrypt the packet.
_WORD DogAddr; // Our dog address (used for read/write) _WORD DogBytes; // Number of bytes to read/write
_BYTE DogData[256]; // Our payload… why 256? Why anything.
_DWORD DogPassword; // Because this is where we put that. _BYTE DogCascade; // The cascade value.
};

Sürücü açısından en çok ilgilendiğimiz kısım:

Bu adam sihrin gerçekleştiği yer. Kernel modülümüze ioctl aracılığıyla iki işaretçi gönderiyoruz.

İlk işaretçi 277 (280’e hizalı) bayta ‘paket’ isteğimiz olarak gider. İkinci işaretçi, programın sürücünün yanıt ‘paketini’ yazmasını beklediği yerde 268 baytlık bir bloğa gider.

Paketleri boşaltmak ve incelemek için Linux’ta basit bir ioctl kancası oluşturacağız – programın verilerin kullanıcı alanından çıkmasına izin vermesini önleyeceğiz.

/* The Hook */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <dlfcn.h>#define MICRODOG_XACT 0x6B00 //Globalsstatic void *io;static void (*realIOCTL)(int fd, int request, unsigned long data); typedef struct request_packet{ unsigned short magic; unsigned short opcode; unsigned int dog_serial; unsigned int mask_key; unsigned short dog_addr; unsigned short dog_bytes; unsigned char payload[256]; unsigned int dog_password; unsigned char dog_cascade;}; //Setting our real ioctl function.void __attribute__((constructor)) initialize(void) { io = dlopen(“libc.so.6”, RTLD_NOW); realIOCTL = dlsym(io, “ioctl”); } int ioctl(int fd, int request, unsigned long* data){ if(request == MICRODOG_XACT){ /* DO SOMETHING ALREADY */ return 0; } //Any other ioctl we don’t care about. realIOCTL(fd,request,data); }

/* The Hook */

include

include

include

include

define MICRODOG_XACT 0x6B00

//Globals
static void io; static void (realIOCTL)(int fd, int request, unsigned long data);

typedef struct request_packet{
unsigned short magic;
unsigned short opcode;
unsigned int dog_serial;
unsigned int mask_key;
unsigned short dog_addr;
unsigned short dog_bytes;
unsigned char payload[256];
unsigned int dog_password;
unsigned char dog_cascade;
};

//Setting our real ioctl function.
void attribute((constructor)) initialize(void) {
io = dlopen(“libc.so.6”, RTLD_NOW);
realIOCTL = dlsym(io, “ioctl”);
}

int ioctl(int fd, int request, unsigned long* data){
if(request == MICRODOG_XACT){ /* DO SOMETHING ALREADY */ return 0;
}
//Any other ioctl we don’t care about. realIOCTL(fd,request,data);
}

Hedef uygulamamızı çalıştırmak bu kütüphaneye bağlı ve:

RetCode is 20019
DogResult is 0000

Oooooook … bu belirli hata kodu hiçbir yerde belgelenmemiştir, ancak bunun özel ioctl setine sahip bir çekirdek modülünü sonlandırmayı beklediğini hatırlarsanız anlamak nispeten kolaydır. Çekirdek geri gelir ve ‘gerçekten, / dev / usbdog sadece bir dosyadır, bir chardev dosyası değildir ve sizinle konuşacak bir modül yüklü değildir’ derse, bu hata atılır.

Hızlı bir çekirdek modülü yapmak, RetCode’un başka bir belgelenmemiş kod olan 43210’a değişmesine neden olacaktır, ancak şu anda çok fazla şeyin olmasını bekleyemeyiz. Sonuçta, biz bile değildir yapıyor bir şey.

Bir sonraki adım, bir istek paketini boşaltmak ve ne olduğunu görmek. Bir DogCheck () paketini boşaltmak bize şunu sağlar:

Bir şeyler henüz doğru değil … Oh evet! Hala InitializeDriverInData’yı tersine çevirmemiz gerekiyor.

Temelde, DogAddr’den başlayarak paketin sonuna kadar her bir değeri alırız ve her bir değeri anahtarımıza karşı XOR (mask_key + 0x646C6F47) bu bize şunu verir:

Tüm değerler karışmış durumda, işlem kodu 0x14’tür ki … kütüphanemizde bile yok … bu nasıl olabilir !? ne s … k .. M şey oluyo burda? Şoföre bakana kadar bunu beklemeye alalım.

Hafif Sapma – Sürücünün Şifre Çözme İsteği

Chardev kullanan herhangi bir kmod gibi, ioctl kullanırsak dosya işlemlerinden başka genişletilmiş işlemlere sahip olabiliriz.

Sürücü için izimiz (2.4 redhat için olduğu gibi çalıştırabilirsek) şöyle görünecektir:

ioctl_usbdog0->DecodeInParam()->UsbDendOutputData->UsbRecvInputData->USBAKernelEntry()-> EncodeOutParam()

İstek tamponumuzu çeker, şifresini çözer, verileri doğrular, başlangıçta dongle’a giriş yapmak için bazı kısımlarını kullanır ve bazı şeyler yapar, bazı şeyler ayarlar, şeyleri dönüştürür, her neyse.

Ardından, dongle’dan yanıt alıyoruz, bir yanıt paketi oluşturuyoruz, bunu anahtarımızla (istek paketiyle aynı) kodluyoruz ve ardından yanıtı programımızın belleğindeki bir tampona kopyalıyoruz … bitti!

Paketi incelemeden önce şifresinin çözülmesi gerekir. Paketin nasıl şifrelendiğini zaten bilmemize rağmen (InitializeDriverInData), emin olmak için sürücümüze (usbdog.o) da bakabiliriz.

Kod çözme, zaman tohumlamalı bir mask_key’den yararlanır, statik bir değer ekler, ardından girdi paketini ona karşı xorlar.

Artık paketin doğru bir şekilde çözüldüğünü doğrulayabiliriz … o zaman opcode 0x14 nedir? Ne istiyor 0x43210 hata kodu ne anlama geliyor?

İstemci Kitaplığına Geri Dön

İstemci kitaplığında hata kodunu aramak aşağıdaki sonucu verir:

Eh, bu ilginç! Yukarıdaki mantık, paket alındıktan ve şifresi çözüldükten sonra yürütülür; bu, sorunun, talep yükümüzle ilgili bir şey olduğu anlamına gelir.

8 baytlık bir döngüdeki bir şey, IdBuffer_0 genel adıyla 8 baytlık başka bir tamponla eşleşmezse, bu bir hata durumuna benziyor. bu değerin ardından, mantığın satıcı kimliğine başvurduğu ortaya çıkar.

Bu işlem kodu (0x14) o zaman bir tür “oturum açma” işlevidir – bir oturum açma talep eder, dongle 8 baytlık satıcı kimliğini geri gönderir ve sonra istemci kitaplığında eşleşirse kontrol edilir … eşleşme yok, gitme yok.

Bu dahili bir işlev olduğundan, hata kodunu belgelemekle uğraşmadıkları mantıklıdır. Bu komutu sürücüde işlediği yeri daha sonra ele alacağız. Şimdilik, bir hata ayıklayıcı ile epeyce geçiş yaptıktan sonra, GERÇEKTEN olan şeyin bu olduğunu kabul edin.

Bu, dongle satıcı kimliğini yük olarak geri göndermek için öykünücümüzde opcode 0x14 için ek bir işleyiciye ihtiyacımız olduğu anlamına gelir. gözden geçirmek için şu ana kadar desteklememiz gereken tüm işlem kodları şunlardır:

0x01 – DogCheck()

0x02 – ReadDog()

0x03 – WriteDog()

0x04 – DogConvert()

0x0B – GetCurrentNo()

0x14 – Login NEW

0x15 – SetDogCascade

0x64 – DisableShare()

0x65 – EnableShare()

Tamam, şimdi yanıt paketini bulmalıyız … Yanıt paketi şu şekilde başlatılır:

typedef struct response_packet{
unsigned int dog_serial;
unsigned int return_code;
unsigned char payload[256];
};

Aslında, istek paketi bellek adresinin her zaman SAĞ üzerinde olması nedeniyle başka bir şeye sahip olamaz.

Return_code değeri her zaman sıfır olmalıdır … Aksi takdirde, istemci kitaplığı, içerisindeki sayıyı döndürür … Bu, istemci kütüphanesinin kendisiyle aynı hata işlemesidir, ancak sürücüde tek tiptir.

Yanıtta 8 bayt vendor_id değerimiz ile bir paket oluşturduktan, yükü (DogData) şifreledikten, return_code’u 0’a ayarladıktan, dog_serial’imizi ayarladıktan ve belleğe yazdıktan sonra programımız bize başka bir paket verir.

Tamam – şimdi bir yere varıyoruz! Bu, DogCheck olan 0x1 opcode’dur … şimdi açıklamamız, dog_check’in dönüş değeri olarak dongle varsa, verileri veya herhangi bir şeyi kullanmaması durumunda 0 döndürdüğünü söylüyor … değer ve istemci lib bunu kabul edecektir. Test etmek için buna benzer bir şey yapacağız:

Bir test çalıştırmak, işlemi şimdi tamamlayabileceğimizi gösteriyor:

Artık köpek kontrolümüz var, gerisini halledelim!

  • X 0x01 – DogCheck()
  • 0x02 – ReadDog()
  • 0x03 – WriteDog()
  • 0x04 – DogConvert()
  • 0x0B – GetCurrentNo()
  • 0x14 – Login NEW
  • 0x15 – SetDogCascade
  • 0x64 – DisableShare()
  • 0x65 – EnableShare()

ReadDog / WriteDog()

Şimdilik, ioctl sarmalayıcımızda 200 baytlık bir tampon oluşturalım ve DogAddr’den başlayarak DogBytes’i alıp yük olarak geri gönderelim:

Tamam, okumak işe yarıyor – elbette, statik bir tamponla yazmak işe yaramayacak, bunu daha sonra düzelteceğiz.

Şimdi, bir şekilde tamamlanmak için çekim yaptığımız için … şifremizi bir değere karşı kontrol etmeye ne dersiniz …

Şifre yanlışsa dongle’dan geri atılan hata kodu 10053 olur – sonuç olarak bu dongle için şifremizi şu şekilde ayarlayalım:

unsigned int dog_pass = 0xBADF00D;

ve sonra arabelleği kopyalamak yerine eşleşmezse 10053 döndürür.

Yazma benzerdir, ancak aynı kontroller ve bölgeye yazı yazma da aynıdır.

DogConvert()

Paketi atıyoruz ve alıyoruz.

Bir dakika bekle!? Opcode 0x08?!? Bu olmamalı … wtf bu mu ?!

Belgelenmemiş başka bir işlem kodumuz var gibi görünüyor. Sürücüde paylaşım bitini etkinleştiren veya devre dışı bırakan bir global vardır. Bizim sürümümüz MD_SETSHARE olarak adlandırılacak ve durumu 1 baytlık bir değer olarak istediğiniz şekilde ayarlamanıza izin verecek.

Bunu hallettikten sonra şunu elde ederiz:

Şimdi yemek yapıyoruz!

Bunu simüle etmek için, aldığımız herhangi bir girdi verisini CRC32 ile 4 baytlık bir yanıt oluşturabiliriz. Algoritmalar ve çekirdek değerleri, analiz etmediğimiz donanımda bulunduğundan, belirli bir dongle için doğru olmayacaktır. Ancak işlevsel olarak yeterince yakın olacaktır.

Ayrıca, simülasyonu belirli durumlarda doğru yapmak için gerçek bir dongle ile konuşmak, yanıtları kaydetmek ve daha sonra bunları tekrar çalmak isteyebiliriz.

Bunu yapmak için bir gökkuşağı masa tasarımı hazırlayabiliriz:

Özünde, bu, istek / yanıt çiftlerini kaydetmek ve varsa uygun bir yanıt için önbelleğe alınmış bir tabloda arama yapmak için ikili bir biçimi açıklar.

Örneğin, gökkuşağı tablomda 0x10101010 yanıtına ayarladığım 0xBB 0xBB 0xBB 0xCD’den oluşan 4 baytlık bir isteğimiz var, sonuç:

İlk yöntem için (kendi hashinginiz), sadece verilere hashing uygulayın ve bir int’i yüke geri atın, bu komik çünkü bir sonraki yöntem:

GetCurrentNo()

Basit – DogConvert () gibi düşünün, ancak her zaman statik 4 baytlık bir tamsayı geçirerek.

unsigned static int DogMfg = 0xBADDEAD;

Recap

Nasıl olduğumuzu görelim:

X 0x01 – DogCheck()

X 0x02 – ReadDog()

X 0x03 – WriteDog()

X 0x04 – DogConvert()

X 0x0B – GetCurrentNo()

X 0x14 – Login NEW

X 0x15 – SetDogCascade()

X 0x64 – DisableShare()

X 0x65 – EnableShare()

Login()

Önceden gizli işlev – kullanım oldukça basittir. Aygıt tanımlayıcısından veya istemci kitaplığında döküldüğü yerden 8 bayt vendor_id’i kopyalayın, return’i 0’a ayarlayın.

SetDogCascade()

MD_SETSHARE ile aynı şey – istek yükündeki tek baytı alıyoruz ve dongle’ın dahili kademeli durumunu buna değiştiriyoruz … sadece 0-16 olabilir. Hata işlemeyi bile yapmamıza gerek yok çünkü kütüphane bunu bizim için yapacak.

SetPassword()

Bu işlem kodu 4.0 kitaplığına kadar görünmedi. Windows için son 3.4 kitaplıktan birkaçı bu komutu ve 0x07 opcode’u destekler.

Buradaki uygulama oldukça basittir:

ÇOK GÜVENLİK – ÇOK MİKRODOG – BÖYLE HACK WOW

Gerçek bir dongle ile iletişim kurmadan önce, paketleri daha iyi test etmek için muhtemelen ilk olarak bir yanıtlayıcı oluşturmak en iyisidir.

Durumla ilgili olmayan diskte saklamak istediğimiz birkaç öğe var:

  • Dongle Seri
  • Üretici Seri
  • Satıcı kimliği
  • Dongle Şifresi
  • 200 bayt flash bellek (bunun son 4 baytı algoritmadır)

Ek olarak, gerçek yanıtları kaydedeceksek, gökkuşağı tablo formatı bulmamız gerekecek – bunun gibi bir şey:

API’yi genişletme

Orijinal API’nin kapsamının ötesine geçebilir ve vendor_id, mfg_serial, dog_serial’ı yazmanın yanı sıra gökkuşağı tablosu girişlerini anında eklemeyi destekleyebilir ve belki de görmemiz için bu güzel verileri yazdırabiliriz.

[MD_RTADD] işlem kodu: 0x539 unsigned long RTAdd () Okur: DogData, DogBytes, DogPassword Yazıyor: Yok Dönüş Değeri – başarılıysa 0, değilse 13371337. Açıklama: Bu, DogConvert’e benziyor, ancak köpeğin yanıtının DogPassword olmasını istediğimiz şeyi geçeceğiz. Sürücüde, algoritmayı belirlemek için flash belleğin son 4 baytını okuyacağız, yeni bir gökkuşağı tablosu girişi oluşturacağız ve bunu dog.key dosyamızda saklayacağız.

[MD_SETDOGSERIAL] opcode: 0x53A unsigned long SetDogSerial () Okur: DogData Yazıyor: Yok Dönüş Değeri: başarılıysa 0, değilse 13381338. Açıklama: Dog_Serial değerini DogData’da depolanan int değerine ayarlar.

[MD_SETMFGSERIAL] unsigned long SetMgfSerial () Okur: DogData Yazıyor: Yok Dönüş Değeri: Başarılıysa 0, değilse 13391339. Açıklama: Mfg_Serial değerini DogData’da depolanan int değerine ayarlar.

[MD_SETVID] unsigned long SetVendorID () Okur: DogData Yazıyor: Yok Dönüş Değeri: Başarılıysa 0, değilse 13401340. Açıklama: Dongle VendorID değerini DogData’da depolanan 8 bayt arabelleğe ayarlar.

[MD_RLRT] unsigned long ReloadRainbowTable () Okur: Yok Yazıyor: Yok Dönüş Değeri: Başarılıysa 0, yoksa 13411341. Açıklama: Rainbow tablosunu diskten yeniden yüklemek için emu’ya bir sinyal gönderir.

Elbette bu, şuna benzeyen kendi istek paketimizi de oluşturmamız gerektiği anlamına gelir:

https://github.com/batteryshark/microdoge/blob/068c137524865ce803f9c785944af6ad5801a938/3.4/usbdog.c

Biraz daha karmaşık olsa da, hala kanca metodolojisini kullanıyoruz.

Kontrol akışı oldukça basittir – dongle aramamızı bağlarız, paketin şifresini çözeriz, ne istediğini bulur ve aynı şekilde bir yanıt oluşturur, şifreler ve programa geri yazarız.

Fonksiyondaki switch deyimi, hayali sürücüye yapılan her çağrıyı kontrol eder. Basit bir dönüştürmeyle bir test programı çalıştırmak, eklediğimiz anahtarların gerçekten yeni sürümde çalıştığını gösterir:

Test uygulamasının kendisi, dongle’ın işlevselliğini test ettiğimiz orijinal bir C programından başka bir şey değildir (tabii ki genişletilmiş API’mize göre derlenmiştir)

Sonunda, başlangıçtaki bir dongle’ı tohumlayabilen ve sizin için uygun gökkuşağı tablosu değerlerini oluşturabilen bir python programı yapmak muhtemelen daha kolaydır (bkz. ‘Makedoge.py’).

Bir Kancanın Ötesinde

Elbette, önceki örneğimizde olduğu gibi önceden yüklenmiş bir paylaşılan kitaplık pek de optimal bir çözüm değildir. Bu çözüm, ioctl işlev çağrılarının ele geçirilmesini içerir ve ayrıca yürütme ortamını değiştirmemizi gerektirir.

Haydi, bunu daha çok gerçek sürücünün yaptığı gibi yapalım … iyi … bir sürücü!

Sürücü işlemlerinin gerçekte nasıl çalıştığının ayrıntılarını korumak (tekrarları caydırmak için başka bir paket protokolü) çünkü gerçek dongle ile arayüz oluşturmamıza gerek yok.

Bunun yerine, bir uç nokta görevi gören ve işlemi tamamlamak için paketi soketler aracılığıyla başka bir programa ileten bir çekirdek modülü oluşturabiliriz.

Amaçlarımız için, soketler aracılığıyla bir programla konuşan ve işlem analizi ve gökkuşağı tablosu araması yapan bir analiz kancası yazabiliriz.

Daha sonra, sonuçlar bir çekirdek modülünü paket iletici olarak kullanıcı alanına geri yazmak için kullanılabilir ki bu da MD4.0’ın yaptığı şeydir:

https://github.com/batteryshark/microdoge/blob/068c137524865ce803f9c785944af6ad5801a938/3.4/usbdog_kmod.c

–===>Device Information<===—
English product name: “Copylock-USB2 “

ConnectionStatus:
Current Config Value: 0x01 -> Device Bus Speed: Low
Device Address: 0x01
Open Pipes: 2

===>Endpoint Descriptor<===
bLength: 0x07
bDescriptorType: 0x05
bEndpointAddress: 0x01 -> Direction: OUT – EndpointID: 1
bmAttributes: 0x03 -> Interrupt Transfer Type
wMaxPacketSize: 0x0008 = Invalid bus speed for USB Video Class
bInterval: 0x0A

===>Endpoint Descriptor<===
bLength: 0x07
bDescriptorType: 0x05
bEndpointAddress: 0x82 -> Direction: IN – EndpointID: 2
bmAttributes: 0x03 -> Interrupt Transfer Type
wMaxPacketSize: 0x0008 = Invalid bus speed for USB Video Class
bInterval: 0x0A

===>Device Descriptor<===
bLength: 0x12
bDescriptorType: 0x01
bcdUSB: 0x0200
bDeviceClass: 0x00 -> This is an Interface Class Defined Device
bDeviceSubClass: 0x00
bDeviceProtocol: 0x00
bMaxPacketSize0: 0x08 = (8) Bytes
idVendor: 0x0925idProduct: 0x23E0
bcdDevice: 0x0100
iManufacturer: 0x01
English (United States) “Intec Systems”
iProduct: 0x02
English (United States) “Copylock-USB2 “
iSerialNumber: 0x00
bNumConfigurations: 0x01

===>Configuration Descriptor<===
bLength: 0x09
bDescriptorType: 0x02
wTotalLength: 0x0029 -> Validated
bNumInterfaces: 0x01
bConfigurationValue: 0x01
iConfiguration: 0x00
bmAttributes: 0x80 -> Bus Powered
MaxPower: 0x32 = 100 mA

===>Interface Descriptor<===
bLength: 0x09
bDescriptorType: 0x04
bInterfaceNumber: 0x00
bAlternateSetting: 0x00
bNumEndpoints: 0x02
bInterfaceClass: 0x03 -> HID Interface Class
bInterfaceSubClass: 0x00
bInterfaceProtocol: 0x00
CAUTION: This may be an invalid bInterfaceProtocol
iInterface: 0x00

===>HID Descriptor<===
bLength: 0x09
bDescriptorType: 0x21
bcdHID: 0x0111
bCountryCode: 0x00
bNumDescriptors: 0x01
bDescriptorType: 0x22
wDescriptorLength: 0x0035

===>Endpoint Descriptor<===
bLength: 0x07
bDescriptorType: 0x05
bEndpointAddress: 0x01 -> Direction: OUT – EndpointID: 1
bmAttributes: 0x03 -> Interrupt Transfer Type
wMaxPacketSize: 0x0008 = Invalid bus speed for USB Video Class
bInterval: 0x0A

===>Endpoint Descriptor<===
bLength: 0x07
bDescriptorType: 0x05
bEndpointAddress: 0x82 -> Direction: IN – EndpointID: 2
bmAttributes: 0x03 -> Interrupt Transfer Type
wMaxPacketSize: 0x0008 = Invalid bus speed for USB Video Class
bInterval: 0x0A

Sadece sentinel pro dongle’ınızı USB’ye takın, aktif hale gelene kadar birkaç saniye bekleyin, şimdi sağlanan .exe dosyasını çıkarın ve çalıştırın.
ekli dongle’ınız için bir .dmp dosyası veya dökümü oluşturur.
Yeni oluşturulan .dmp dosyasını .dng olarak yeniden adlandırın,
şimdi bunu çözmek için edgepro11.exe’yi kullanın.
sadece edgepro11.exe sentinel bölümüne yükleyin, örneğin “speba4_0.dmp” gibi döküm dosyanızın adının bir parçası olan geliştirici kimliğini girin.
burada EBA4 geliştirici kimliğidir.
şimdi boşalt ve çöz düğmesine basın.
dongle’ınız için bir .dng dosyası alacaksınız.
bu .dng sentemul’da öykünme için kullanılabilir.
öykünme için SENTEMUL2007.exe
kurulum sürücüsünü, hizmeti başlatın, dökümü yükleyin (yeni oluşturduğunuz .dng dosyası) ve çalışır durumda kullanın.
emülatörü otomatik başlatma moduna kaydedin ve her şey yolunda giderse, artık dongle’ınıza ihtiyacınız olmayacak.
Daha fazla yardım için bana PM atın.

MicroDogu Klonlamak

Basit bir prosedür:
1. PCB almak için dongle’ınızı sökün.
2. Selvi ve I2C çiplerini lehimsiz hale getirin.
3. Cypress çipinin şifresini çözün ve içeriği programcı tarafından okuyun.
4. Yeni IC satın alın ve okunan içerikle programlayın.
5. I2C yongası için aynı prosedür ancak şifresinin çözülmesine gerek yoktur.
6. Yeni dongle oluşturun, tamam!

Dongle (Hardlock) Ve Tersinir Mühendislik (Reverse Engineer)

HASPHL2007 32 Bit İşletim sisteminde İşlem Yapmaktadır. Programınız Bilgisayarda Kuruluyken Dongle Kiliti Bİlgisayara Takın.Daha Sonra HASPHL2007 Adlı Dosyayı çalıştırın Driver Bölümünden İnstal Driver Deyin.Sonra Emulator Kısmından Start Service Butonuna Tıklayın.Daha Sonra Dumper Kısmına Gelin Refresh e Tıklayın Hasp/HLDongles Yazan Yerde Dongle Id Niz Görünecek Eğer Görünmez İse Programınızı Çalıştırın Program açılırken Refresh e Tıklamaya Devam Edin… Dongle Idniz Görünecektir.Ardından Dump Butonuna Basın.. Bilgisayarınızın Hızına Göre 5-10 Dk Arasında Dongle Kilidinizin Kopyasını Bİlgisayara Kopyalayıp HASPHL2007 Programının Bulundugu Klasöre (.dmp Veya .BIN) Olarak Kaydedecektir… Daha Sonra HASPHL2007 Kapatın. Edgehasp Programını Çalıştırın Hasp Veya Hasp HL Bölümünden ( Bu Dongle Kilidinize Göre Değişir) Dump File Location Bölümünden BIN Veya Dmp Formatlı Dosyanızı Seçin Ardından Dng File Location Kısmından Dng Dosyasını Kayıt Edeceğiniz Yeri Ve İsmini Belirleyin… Ardından Solve Butonuna Tıklayın. Dng Dosyanız Muhtemelen Oluşturulmuştur… Dongle kiliti Bilgisayarınızdan Çıkartın… Bİlgisayarınızı Yeniden Başlatın… Bilgisayar Açıldıktan sonra HASPHL2007 Programını Çalıştırın Driver Kısmından İnstall a Tıklayın Ki Büyük İhtimal Driver Yüklü Olacaktır… Sonra Emulator Kısmından Start Service e Tıklayın…Daha Daha Sonra Dongleskısmından Load Dump Butonuna Tıklayın Ve En Son oluşturdugunuz Dng Dosyasını Seçin…. Emulator Kısmına Gelin Programın İd si Ve Şifreler Görünecektir…. HASPHL2007 Kapatın Programınızı Çalıştırın…. ( Program çalışacaktır. Yazılım 32 bit olan tüm windows işletim sistemlerinde çalışır bizzat denedim test ettim( en düşük win xp ve win vista-7-8 vs. gibi sistemlerde sentemul programını uygulama özelliklerinden yönetici olarak çalıştır ı işaretlemeniz gerekir ) 64 bitte çalışmaz ancak onuda çözdüm sanal dongle yaptım aygıt yöneticisinde dongle aygıt var gibi görmektedir. 64 bit sistemde driver tanıtabilmek için Sürücü imzası zorlamasını devre dışı bırakmalısınız.
Windows 8’de Sürücü İmzası Zorlamasını Devre Dışı Bırakma
Windows’da hatalı ve uyumsuz sürücüler işletim sisteminin çökmesine neden olduğundan imzasız sürücülerin yüklenmesi varsayılan olarak kapalıdır. Windows XP, Vista ve 7’de sürücü imzası zorlaması bilgisayar ayarlarından kapatılabiliyorken Windows 8’de daha farklı bir yol izlenmesi gerekmektedir.Eğer Windows 8 kullanıyorsanız aşağıdaki adımları takip ederek sürücü imzası zorlamasını devre dışı bırakarak imzasız sürücüleri bilgisayarınıza yükleyebilirsiniz.
Not: İmzasız sürücüler işletim sisteminizde sorunlara neden olabileceğinden başlamadan önce sistem geri yükleme noktası oluşturmanızı tavsiye ediyorum. Bir sorun olması durumunda bu geri yükleme noktasını kullanarak bilgisayarınızı çalışır hale getirebilirsiniz.

1. Windows tuşu + R kısayolu ile çalıştır penceresini açın ve “shutdown /o /r -t 00” yazıp “Tamam” a tıklayın. Programlarınız kapatılacak ve gelişmiş başlangıç seçenekleri karşınıza gelecektir.
Dongle Kopyalama
Elinizde bir dongle ile calısan program var bunu baska pcde calıstırmak istiyonuz öncelikle kullandıgınız programın hangi marka model dongle kullanıyor ona bakmalısınız örnek vermek gerekirse sizin donglenız wibubox o zaman siz wibubox sitesinden driverını indirmeniz gerekli ve sitede hangi dosyaları windows altında kullanıyor ona bakın.
İnternetten caglarin geliştirmeleri sitesinden o donglenın emülatörünü indirin ve bu adreste her marka dongle emülatörü mevcuttur. Wibunun dongle emülatörü dataton_v4_t dur ve bunu indirin.
Pcnizde kurulu programınızn donglelını kopyalamaya başlayabilirsiniz.
Yükleyeceğiniz pcde varsayım olarak elinizde setubı yok, ozaman elinizde kurulu olan programa hedef bul deyin ve kurulu dizini kopyalayın ve lisansı kopyalayın.
Windowsun altında programın ve donglelın kullandıgı dosyaları kopyalayın bunlar windows sistem dosyasında kayıtlıdır ve kullandıgınız programın dongle sitesinde programın kullandığı dosya uzantıları mevcuttur. Bunları windowsa aratırıp bulup kopyalayın.
lpf dongel tool indirip usb device view diyerek dongle kimline bakın ve bu kodu bir kenara yazıp daha sonra karşılaştıracağız.
Open regedit diyerek kayıt defteri düzenleyicisine girin burada bulduğunuzu dizini ver diyerek regedit olarak kaydedin ve bu kayıt defteri girişi başka pcde lazım olacaktır.
Emulatörü çalıştırın devcon exe’ye tıklayıp donglelınızı emdrin uninstall driver diyerek donglenızı kaldırın ve dongle çıkarın.
Install driver diyerek driverı tekrar yükleyin burada sanal sürücü oluşacaktır.
ıfp dongle toolu tekrar acın usb view diyerek dongleınız kopya dongle kimliği ile uyuşuyormu diye bir bakın. Bir yanlışlık yapmasanız uyuşur eğer uyuşmazsa uninstall driver diyerek tüm işlemleri tekrar bastan yapın.
Pcnizden aldığınız kayıt defteri girdisini çalıştırın windows’tan aldığınız dosyaları yükleyeceğiniz pc’ye aynı yolu izleyerek aynı yere kopyalayın bu dosyalar mevcut yazısına tümüne evet deyin.
Artık programı çalıştırabilirsiniz. Programın exesine tıklayın. Artık hata yapmazsanız uygulama çalışacaktır.
Dongle Mimarisi
Dongle kullanan programlar anakarta özgü çalışır, öncelikle anakartın biosunu güncellediğinde dongle yazılımı bilgisayarı başka bir makina gibi algılar. Bunun için dongle kullanan yazılımlarda bios güncellemesine dikkat etmek gerekir. Başka bir özellik de makina üzerindeki PC de bulunan programlardaki simulasyonların çalışabilmesi için dongle kurulmasına ihtiyaç var. Dongle ile olan haberleşmeyi rainbow driver isminde bir program ile yapılıyor. Siz dongle ı satın aldığınızda PC nizde bulunan bir program ile o PC’ye ait bir kod oluşturan programı çalıştırıp çıkan kodu üreticiye gönderiyorsunuz.. Onlarda size programın çalışması için gereken şifreyi. Daha sonra programın tüm özelliklerini kullanabiliyorsunuz. Donglelar, bilgisayarınızda USB noktasına , LPT bağlantı noktasına (veya bazen COM bağlantı noktasına) bağlı küçük kutulardır. Onlar programcılar için görünmez olmalıdır. (aslında% 99’dur).Bu bağlantı noktasına bağlı. Bilgisayarın içine dongle çeşitleri takılmıştır.Fakat benim için dongle’ın tam görünümü önemli değildir. Dongle’ın içinde bir EEPROM veya ASIC veya belki bir ölü bölge vardır. Benim için önemli olan budur. Dongle yalnızca bir kara kutu, uygulamanızdan veri gönderen / gönderen yazılım geliştiricilere dongle ile satılan bir yazılım (dongle API). Uygulama yazarları, API’yi çağırır ve iyi / kötü adam yapmak için geri verilen değerleri kontrol eder atlar.
En popüler dongle’lar şunlardır:
– Rainbow Technologies’den (ABD) Sentinel (büyük aile)
– Aladin’den (İsrail’den) hasp (fena değil)
– Fest (Almanya’da yapıldı.)
– Actikey (Fransa) ve onlarca diğerleri …
Gerekli araçlar her zamanki gibi: IDA, SoftICE, HIEW. Ve tabii ki üreticiye başvurumuz. Hiçbir mantık analizörü, osiloskop, belki de gerçekten istersen LED monitör.
* 1 * Karşılaştığınız zekayı tanımlayın. Çoğu durumda o kadar da zor değil. Varsa, dongle’a bak. Erişim veya yazılım ile birlikte yüklediğiniz tüm dosyalara bakarsanız, tüm .DLL’lerin, .VXD’lerin vb. telif hakkı başvuru yazarları dışındaki metinler için arama yapın. Neredeyse her durumda çabucak bulursunuz.
* 2 * Dongle satıcısının www sayfalarından tüm olası bilgileri toplayın. Bu çok önemli bir basamaktır! Tam API, çoğunlukla kaynak, demo yazılım,gelecekteki en büyük programınızla birlikte API nasıl kullanılacağı örnekleri vardır. Hepsi bir araya getirin ve dikkatlice çalışın.Unutmayın: TÜM bilgisayarın donanım / yazılım tedarikçileri Net’tedir ve onları bulun.Dongle güvenliği hakkındaki tüm bilgileri okuduyun. Onlar güvenlidir ve sizi bilgi sahibi yapar.RSA şifrelemesini okuyun, tek yönlü işlevler bakın. Dongle apisinde basit ve karma şekilde soru ve cevap işlemleri vardır. Durum bundan ibarettir. Ama şimdi kimse bu karmaşık karma soru cevap işlemlerini kullanmıyor. Dongle apisinde basit şekilde sadece Kontrol / Seri Numarası / Oku ve / veya bazen Yaz fonksiyonları kullanılmaktadır.
* 3 * Ayrıca, dongle bayinizden bir değerlendirme dongle edinebilirsiniz. Bedavadır. Ücretsiz değilse, 14 günlük kiralamayı isteyin. İşe yarıyor! Bu dongle satmak istiyorlar. Bu 0-800 veya 0130 numaralarını arayın. Bir şey söylemediğin sürece sana yardım etmek isteyeceklerdir. Korumak istediğiniz yazılım sorulduğunda. Rainbow ve Aladin bayilerinde insanlar son derece yardımcı oluyorlar.
* 4 * Artık, programı kırmasını ve sahip olduğunuz eklentiyi biliyorsunuz.
call DONGLE
or ax, ax
jz goodguy
Bazen biraz daha ileri giderler ancak çoğu halde şunu tekrar ederim:
Ancak zincir, en zayıf halkası kadar güçlüdür. Ve tüm 4 farklı prog’da farklı dongle’larla korunan en zayıf bağlantı arayüzü oldu:
Uygulama – Dongle API’si (çoğunlukla bir DLL’de bulunur)
Dongle üreticileri akıllı kişilerdir, verileri nasıl şifreleyeceğini bilirler, kendi kendini değiştiren kod, hata ayıklama önlemeli hile vb. tavsiye ederim: Kodlarını olduğu haliyle bırakın. Uygulama tarafının kırılması çok daha kolaydır.
Gerçekten kırmış olduğunuz ilk şey, aramayı call fonksiyonunu(nadiren birden fazla) bulmaktır. Dongle API’si, Use IDA veya WDASM kullanın ve Dongle API’sindeki .DLL’in adını hatırlayın ve birkaç dakika sonra (son 2 saat ve 40MB .IDB dosyası!) ona sahip olursun. DLL dosyasındaki cağrıları kırabilmek için çalıştırılabilir dosyaya statik olarak bağlı bir API parçası olmalıdır. Aladdin’deki çalısanlar burada kendi-mod kodunu üretir, bu yüzden hedefimizi biraz daha ilerletmeliyiz.
QuickCheckIfDonglePresent()
GetDongleSerialNumber()
ReadDongleByte( addr ) – or word, or dword, or even full table
WriteDongleByte( addr, value )
Belki donglelar adına göre ihraç edilebilir. Belki adı dongle veya benzeri olabilir. IDA’nın verdiği referanslara dikkatle bakın. Kesinlikle onu buluyorsunuz. Yalnızca bir kez çağrılan procsleri bulmalısınız – uygulama veya api arasında bir arayüz olmalıdır. Bir fonksiyona veya işleve iki sarmalayıcı kim yazar?
Çoğu durumda dongle API’sı çok iyi yapılandırılmıştır, işlev numarası açıkça verilmiştir, 0 – kontrol et, 1 – sayı al (numara), 2 – oku, 3 – yaz, vb … Parametrelerin veya sonuçların nerede olduğunu belirleyin. Ve bu şey yazılımı kırmamıza yardımcı olacaktır. Ayrıca API dokümanlarınada sahibiz! API üreticileri, API’yı maksimum düzeyde kullanıcı dostu yapmak istemektedir. Bu durum yazılımı daha kırılgan hale getirmektedir. API çağrılarını ve sonrasında ‘cmp ax’ ile inceleyerek uygulamanın beklediği şeyin ne olduğunu hızlı bir şekilde bulabiliriz.

* 5 * Sonra etkin kısım gelir (kısa süreliğine dongle’a ihtiyacınız olabilir) ‘Uygulama –API Arabirimi’ alanlarına bir CC baytı yerleştiren kodu ekleyin.
SoftICE ile BPINT 3’ü çalıştırın.
INT 3’ü orijinal baytla değiştirin, sonra BPX’i bu adrese ayarlayın, izleyin …Dongle olup olmaması durumlarında ne olduğunu görebilirsin. Şansın varsa kötü / iyi geçişli bir kontrol noktasını çabucak bulabilirsin. Diğer yönden gitmeye çalışın ve ne olduğunu görün olur (belki uygulamanız çalışmaya başlar).QuickCheckIfDonglePresent işlevini taklit etmek için kodu düzeltin.Sadece proc çağrısını sağlayan bir değeri döndürmeniz yeterlidir.
Sonra GetSerial # rutini öykünmeye emulate etmeye çalışın. Unutmayın ki dongle seri # numarası olabilir ve #da depolanır. Hakkında kutusuna # görüntülenmesi için kullanılır. IDA’nın size verdiği referansları görün. Tüm dongle’larda GetSerial # proc’u bulunmamaktadır. Bazen seri numarası normal gibi okunur. Dongle’dan gelen veriler sonra da okunmaya başlar. Birkaç bayt okunur, saklandıkları yer ve buradaki tüm referansları bulduğunuzu varsayıyorum. Dongle tarafından etkinleştirilen / devre dışı bırakılan seçeneklerle çeşitli kontroller gerçekleşebilir ve kesinlikle farklı programlarda gerçekleşir.
Belki de öyledir (önde gelen SCADA programlarından birine gerçek örnek)
cmp eax, some_value1
je is_model_1
cmp eax, some_value2
je is_model_2
vb.
ya da belki öylesine (İsrail programı ile İsrail dongle’la gerçek örneği)
test eax, mask_1
jz lab1
call enable_option_1
lab1:
vb.
ya da belki de (Fransa’da dongle ile Fransa’da yapılmış elektrik mühendisliği araçları)

Dongle’den okunan 12 kelime [ebx] adresinden saklanır;
mov ecx, 12
lab1:
cmp word ptr [ebx], 1
jne lab2
call enable_option(cx)
lab2:
inc ebx
loop lab1
Çalışmakta olan bir dongle’ınız varsa tüm değerlerini okuyun ve sizde emulate de yani öykünmede ne yapacağınızı bilirsiniz. (API okuma işlevi işini tamamladıktan ve notu aldıktan sonra BPX’i ayarlayın). İşte gerçek örnek. Uygulama sizin için işe yaramaz, özgürce mevcut değildir,her yerde bulamazsınız. O halde sizin için hazırladığım disassemblyi inceleyelim.
* 1 * Bizim dongle fransız Actikey ve DLL CCNMMNT.DLL
* 2 * Hedefimizin disasseblysi (40 MB) yapar ve .idata bölümüne bakarız.
Sonuç şaşırtıcı, ancak TÜM referanslar görüntülenene kadar bekliyorum.
* 3 * Crtl-S ve .idata bölümüne gidin. CCNMMNT.DLL’den dıştan içe aktarılan öğeleri bulun ve o referansa gidin.
00594510 ; Imports from CCNMMNT.dll
00594510
00594510 extrn CCNMM:dword ; DATA XREF: j_CCNMMr
Sadece bir referans! J_CCNMM ismi IDA tarafından atanmıştır!
sonra:
00408770 ; S u b r o u t i n e
00408770
00408770 j_CCNMM proc near ; CODE XREF: key_io+6Fp
00408770 jmp ds:CCNMM ; jump to Dongle DLL
00408770 j_CCNMM endp
Key_io ve diğer adlar benden atandı; ihraç edilmedi 

Bir adım önde gidelim. Bakınız: Sadece bir referans. Yeşil ışık! Bizde
iyi bir yol.
sonra:
0040BA10 key_io proc near ; CODE XREF: main_key_check+8
0040BA10 ; main_key_check+18Cp
0040BA10 ; key_check2+45p
Kontrol ettikten sonra, key_check2’nin yalnızca main_key_check’den çağrıldığını fark ettim,
Dolayısıyla hala burada yalnızca bir referansımız var. Hala dongle API kodunun içindeyiz.
Hadi yukarı gidelim.
0040B840 ; S u b r o u t i n e
0040B840
0040B840 main_key_check proc near ; CODE XREF: key_fun_00+4Dp
0040B840 ; keyfn_18_sernum+68p
0040B840 ; keyfn_02_write+5Bp
0040B840 ; keyfn_03_read+56p
0040B840 ; key_fun_1b+50p
0040B840 ; key_fun_1c+54p
0040B840 ; key_fun_1d+5Cp
Tabii ki, bunun bir API olduğunu ve bizim bir uygulamamız olmadığını nasıl bilebilirim? Hızlı cevap: Funcs 1b, 1c ve 1d çağrılmadı!Hiç çağırılmayan sarıcıları mı yazdığınızı hayal ettiniz? Çünkü onlar dongle yapımcıları tarafından yazıldı ve uygulamayla bağlandı.Aslında keyfn_02_write da çağrılmaz. Bu iyi haber, anahtara daima aynı veriyle yanıt verin. Arayanların isimleri açıklayıcıdır. Onları nereden buldum? Procs’u inceleyerek, hepsi bu, örneğe bakın:
0040A250 keyfn_18_sernum proc near ; CODE XREF: (several)
0040A250
0040A250 arg_0 = dword ptr 8
0040A250
0040A250 push esi
0040A251 call key_fun_00
0040A256 cmp ax, 1
0040A25A jnz short skc110
0040A25C mov ax, 1 ; 1 – error?
0040A260 pop esi
0040A261 retn

0040A262 skc110:
0040A262 mov word ptr ds:key_fun, 18h ; function 18!!!
0040A26B xor eax, eax
0040A26D mov esi, [esp+4+arg_0]
0040A271 mov word ptr ds:key_result_1, magic1
0040A27A mov word ptr ds:key_par3, ax
0040A280 push offset key_par4
0040A285 mov word ptr ds:key_par4, ax
0040A28B push offset key_par3
0040A290 mov word ptr ds:key_par1, magic2
0040A299 mov word ptr ds:key_par2, magic3
0040A2A2 push offset key_par2
0040A2A7 mov [esi], eax
0040A2A9 push offset key_par1
0040A2AE push offset key_result_1
0040A2B3 push offset key_fun
0040A2B8 call main_key_check ; here our call
0040A2BD mov word ptr ds:main_result, ax
0040A2C3 add esp, 18h
….store results…
Sihirli değerler dongle’ı ve ürünü tanımlıyor, bu yüzden onları çıkardım. Onlar bizim crackimiz için önemsizdir.
Ve bu, dongle API’sinin en üstü. Şimdi ne zaman API’nin geri dönmesi beklendiğini tanımlamak gerekiyor. Birkaç ‘cmp ax, something’ ve benim taklit edebildiğim API işlevleri 00 (quick check) and 18 (get serial). Bu işlevleri taklit etmek için HIEW’yi kullanarak kısa bir yama uyguladım. Bundan sonra programın devre dışı bırakılmış tüm seçenekleri çalışmaya başladı.Diğer yandan “cmp ax, something” analizi neredeyse önemsiz oldu. Bu yüzden key_fn_02_read’in kısa bir emülatörünü yazdım ve şimdi proggy nin tüm seçenekleri açıldı.

Sanal Makine – USB Cihaz Kullanimi–Dongle
USB dongle ile lisanslanan yazilimlar veya USB dongle kullanan E-Imza uygulamalari nedeniyle uygulama sorumlulari tarafindan sanal makineye USB stick atama talebi ile karsilasabiliyoruz. Ancak bunun da cozumu cok basit. Birinci yontem, ESXI host ‘a takili olan USB cihazini VM ‘e passthrough özelligi ile atayabilirsiniz. vSphere ESXi 5.0 ile USB Controller’a tanittiginiz bu aygita bagli olan VM’i ayni cluster içerisindeki ESXI host’lar arasinda vMotion ozelligi ile tasiyabilirsiniz. Bu da cok onemli bir ozellik, ancak kapali VM’e USB Controller eklerken bu özelligi aktif etmeniz gerekiyor.
1. Yöntem: 52/5000ESXi / ESX 4.1, ESXi 5.x ve ESXi 6.x’te USB desteği.
Amaç;
ESXi / ESX 4.1, ESXi 5.x ve ESXi 6.x, ESXi / ESX ana bilgisayarından sanal bir makineye USB aygıt passtrosunu desteklemesinin sağlanması. USB cihazı passthrough gereksinimleri ve sınırlamaları. USB denetleyicisi ve USB aygıtı ekleme
USB cihazı passthrough gereksinimleri:
Sanal donanım sürümü 7 veya üzeri
Bir USB denetleyicisi
USB aygıtı veya aygıt hub’ı
USB, ext3 veya FAT32 formatında olmalıdır
VSphere 5.0’ın piyasaya sürülmesiyle, şu anda iki tür USB geçidi var:
Ana Bilgisayara Bağlı: Bu, vSphere 4.1’den beri mevcuttur ve doğrudan ESXi / ESX ana makinenize takılı bir USB aygıtının sanal bir makineden geçirilmesini sağlar.
İstemci Bağlantılı: Bu özellik, vSphere 5.0’ın kullanıma sunulmasıyla birlikte sunuldu ve bir kullanıcının iş istasyonuna takılı bir USB aygıtının, vSphere İstemcisi aracılığıyla bir sanal makineden geçirilmesini sağladı.
Ayrıca, sanal makineleri kullanmak için kullanılabilen iki tür USB denetleyicisi bulunmaktadır:
EHCI + UHCI denetleyici: USB 2.0 ve USB 1.1 aygıtlarının kullanılmasına izin veren klasik USB denetleyicisidir.
xHCI denetleyicisi: Bu, daha hızlı USB 3.0 aygıtlarının kullanılmasına izin veren yeni denetleyici türüdür. Bu denetleyiciyi kullanmak için sanal donanım sürümü 8 gereklidir.
Genel sınırlamalar:
USB Denetleyicisinin sınırlamaları şunlardır:
Minimum sanal donanım sürüm 7 gereklidir.
Her türün yalnızca bir USB denetleyicisi sanal makineye eklenebilir.
USB arbitratör maksimum 15 USB denetleyicisini izleyebilir. Sisteminiz 15’den fazla denetleyiciyi içeriyorsa ve USB aygıtlarını bu denetleyicilere bağlarsanız, aygıtlar bir sanal makineden geçirilemez.
USB aygıtı ekleyebilmeniz için sanal bir makineye bir USB denetleyicisi eklemeniz gerekir.
Denetleyiciyi kaldırmadan önce tüm USB aygıtlarını bir sanal makineden çıkarmalısınız.
USB aygıtlarının bu sınırlamaları vardır:
Sanal bir makinede 20’ye kadar USB aygıtı takılı olabilir, ancak her bir benzersiz USB aygıtı aynı anda yalnızca bir sanal makinede takılabilir.
Desteklenmeyen USB aygıtları, diğer ESXi / ESX özellikleri ile beklendiği gibi etkileşime girmeyebilir. Desteklenen USB aygıtlarının bir listesi için, bkz. ESX veya ESXi sunucusundan sanal bir makineye geçiş için desteklenen USB aygıtı modelleri.
Bellek, CPU veya PCI aygıtlarını eklemeden önce herhangi bir USB aygıtını kaldırmanız gerekir. Bu kaynakların eklenmesi, USB aygıtlarının bağlantısını keser, bu da veri kaybına neden olabilir.
Sanal bir makineyi askıya aldığınızda ve devam ettirdiğinizde, USB aygıtları bağlantı kesilmiş gibi davranıp tekrar bağlanır.
Sanal makine bağlı USB aygıtından önyükleme yapamıyor sorunu;
Ana Bilgisayara Bağlı USB Geçişi:

Sınırlamalar:
USB 2.0 ve USB 1.1 aygıtlarını destekleyen USB denetleyici donanımı ve modülleri fiziksel ana bilgisayarda bulunmalıdır.
ESXi 5.5 Patch 3’ten önce fiziksel ESXi ana makinelerine bağlı bir USB 3.0 aygıtından yararlanmak mümkün değildir; cihaz göz ardı edilir. (Bunun yerine, istemci tarafından bağlı USB geçidi kullanın.)

İstemciye Bağlı USB Geçişi:
VSphere Client 5.0+, ESXi 5.x / 6.x ana makinelerinde bu tür passthrough’u kullanmanıza izin verir.
Hem EHCI + UHCI hem de xHCI USB denetleyicisi, istemci tarafından bağlı USB geçişi ile uyumludur.
Sınırlamalar:
Bir xHCI denetleyicisi (sanal donanım sürüm 8 ile) kullanan bir USB 3.0 aygıtının geçişi, konuk işletim sisteminin çalışmakta olan bir xHCI sürücüsüne sahip olmasını gerektirir. Misafir işletim sistemine bir sürücü yüklenmemişse, USB 3.0 aygıtlarını kullanamazsınız. USB 3.0 desteği hakkında daha fazla bilgi için VMware vSphere 5.0 Sürüm Notları’na bakın.
Algılanmamış USB aygıtları için, BIOS bu seçenekleri sağlıyorsa xHCI seçeneğini Devre Dışı veya Otomatik olarak ayarlayın. Aksi halde, ayrıntılar için donanım satıcısına başvurun.
Bu çalışmayı yazdığım sırada şu anda Windows için bilinen bir xHCI sürücüsü yoktu.
İstemci tarafındaki USB bağlantısını başlatan vSphere İstemcisini kapatmak, USB aygıtını sanal makineden çıkarır.

Bu tablo, uyumlu yapılandırmaların bir özetini sunar:
Sürüm ESXi / ESX 4.1 ESXi 5.0 ESXi 5.1 ESXi 5.5 ESXi 6.0 ESXi 6.5
USB 2.0 / 1.1 Ana Bilgisayara Bağlı Var Var Var Var Var Var
USB 2.0 / 1.1 İstemci Bağlantılı Yok Var Var Var Var Var
USB 3.0 Ana Bilgisayara Bağlı Yok Yok Yok Var Var Var
USB 3.0 Client Bağlantılı Yok Var (xHCI sürücüsü ile) Var (xHCI sürücüsü ile) Var (xHCI sürücüsü ile) Var (xHCI sürücüsü ile) Var (xHCI sürücüsü ile)
ESXi 5.x / 6.x ana makinelerinde xHCI modülünü etkinleştirme
Bir SSH oturumu ile ana bilgisayara bağlanın. Daha fazla bilgi için bkz. Bir ESX ana bilgisayarında kök SSH oturum açmayı etkinleştirme (caglararli.com.tr).
XHCI modülünü etkinleştirmek için aşağıdaki komutları çalıştırın:

esxcfg-modülü -e xhci
echo “vmkload_mod xhci” >> /etc/rc.local.d/local.sh
USB denetleyicisi ve USB aygıtı ekleme
Windows çalıştıran sanal bir makineye bir USB denetleyicisi eklemek için:
Sanal makineyi sağ tıklatın ve Ayarları Düzenle’yi tıklatın.
Ekle’yi tıklayın.
USB Denetleyicisi’ni tıklatın ve İleri’yi tıklatın.
Tamam’ı tıklayın.
Ana Bilgisayar Bağlantılı USB aygıtı eklemek için:
Sanal makineyi sağ tıklatın ve Ayarları Düzenle’yi tıklatın.
Ekle’yi tıklayın.
İstediğiniz USB aygıtını tıklayın ve İleri’yi tıklayın.
Tamam’ı tıklayın.

Not: Ana Makineye Bağlı cihazlar için vMotion’u desteklemek için Cihaz bağlıyken Destek vMotion’u seçin. Daha fazla bilgi için http://www.caglararli.com.tr bakın.
İstemci Bağlantılı bir USB cihazı eklemek için:
Sanal makineyi vSphere Client’ı (5.0 veya daha yenisi) kullanarak tıklatın (veya konsolu açın).
VSphere Client araç çubuğunda, USB aygıtlarını sanal makineye bağlamak / bağlantısını kesmek için simgeyi (anahtarlı bir USB aygıtına benzer) tıklatın.
Bağlanmak istediğiniz USB cihazını seçin.
Tamam’ı tıklayın.
Not: vMotion, İstemci-Bağlı USB aygıtları için varsayılan olarak desteklenir.
2. yöntem ise Anywhere USB kullanmak. Yaptigim bir projede birden fazla USB dongle kullanmam gerektigi için asagidaki cihaz ile sorunu cozmustum. Uzun sure oldu hala calisiyor. Bu cihazin yaptigi is ise; USB over IP.
AnywhereUSB cihazini aldiktan sonra ethernet portundan network’e baglayip, cihazin web arayüzünden ayarlarini yapiyorsunuz. Cihaza USB aygitinizi takip, bu USB aygitini kullanacak sanal makineye (Windows) AnywhereUSB ile birlikte gelen driver’i yukluyorsunuz. Bu driver VM’in AnywhereUSB cihazini network’te bulmasini ve onun uzerindeki USB cihazina erismesini sagliyor. Yani VM bu USB cihazinin kendine takiliymis gibi goruyor. Halbuki o network’te bir yerde takili.
Ben 5 USB cihazi baglayabildigim modelini yurtdisindan getirtmistim. Sitesinde de gorebileceginiz uzere daha buyuk modeli de var.
Ortaminizda birden fazla USB dongle kullanilacaksa sanirim en iyi yontem Anywhere USB, ama bir yada iki USB dongle isinizi goruyorsa yukarida bahsettigim gibi cluster ortaminda bir ESXI host’a takip, USB controller ile VM’e assign edip, “Support vMotion while device is connected” secegini secip, kullanabilirsiniz. Bu secenek sayesinde VM’i cluster icerisinde diger ESXi hostlar arasindan vMotion ile tasiyabilirsiniz. Belli bir sure bu ozelligi de vSphere 5.1 ortaminda kullandim. Gayet iyi calisiyor.