首先用一點兒時間來談談什麼是加密狗(dongle),dongle經常被認為是硬體保護,它是一個可被附加在計算機並口、串列埠或USB上的小外掛,它包含廠家燒製的EPROM和定製的專用積體電路。dongle保護的的原理就是軟體開發者在程式裡經常檢查dongle中的單元(Cell)的並對比返回值,這種檢查可以是直接讀單元或者是使用某種內部演算法(此時單元受到保護無法直接讀)。儘管任何稱職的硬體工程師都能很容易地分析出dongle是如何實現的,但是實際上並不用那麼麻煩,dongle保護最薄弱的環節在於應用程式要透過dongle廠家提供的函式庫來訪問dongle,而應用程式和這些函式的連線通常是很弱的,因為軟體開發人員不管這些函式如何訪問dongle,它只檢查函式的返回值是表示成功還是失敗,那麼只要打補丁讓所有函式返回成功即可,而且這些函式通常並不多,從廠家提供的API手冊中很容易查到這些函式的定義(引數和返回值)。一般來說dongle解密不需要原來的正版狗。
必須指出從(西方)法律上來說,破解狗與除錯獨立的程式有一些細微的不同,後者是完全合法的,但前者在德國有被判為非法的案例(即使你已經購買了正版的軟體),我不知道我國法律是如何規定的,這種涉嫌侵權的情況當然是民不告、官不糾,好在我們不討論國產軟體,你如果被引渡到美國或德國本站不負任何責任。
下面是一些著名dongle廠商的官方網站,從中可以下載使用者手冊,應用程式介面(API)和其它相關資料,也可以瞭解dongle技術的最新進展。
比如說,從彩虹公司提供的API文件中我們可以瞭解到Sentinel Superpro(以下簡稱 sspro)的一些情況,sspro有64個記憶體單元(memory
cells),其中56個可以被使用者使用,這些單元中的每一個都可以被用為三種型別之一:演算法、資料值和計數器。
演算法(algorithm)是這樣一種技術,你用sproQuery(queryData)函式訪問它,其中
queryData是查詢值,上述函式有一個返回值,被加密的程式知道一組這樣的查詢值/返回值對,在需要加密的地方,用上述函式檢查狗的存在和真偽。對於被指定為演算法的單元,軟體上是無法讀和修改的,即使你是合法的使用者也是如此,我理解這種技術除了增加程式複雜性以外,主要是為了對付使用模擬器技術的破解。
資料值和計數器就比較好理解了,資料值使用者儲存在可讀寫的單元中的數,使用者可以用它儲存自己的資訊,計數器(counter)是這樣一種單元,軟體開發商在其軟體中使用sproDecrement函式可以把其值減一,當計數器和某種活動的(active)演算法關聯時,計數器為零則會封閉(deactive)
這個演算法。
下面是sspro的所有API函式:
RNBOsproActivate()
啟用或反啟用一個演算法以便它能被RNBOsproQuery()函式使用。
RNBOsproDecrement() 把計數器或一個可讀寫的單元減一。
RNBOsproExtendedRead() 讀任一非隱藏單元的值和連線碼(access code)
RNBOsproFindFirstUnit() 查詢指定的狗。
RNBOsproFindNextUnit()
查詢同一ID的下一個狗。
RNBOsproFormatPacket() 初始化一些資料結構,這個函式必須在其他API函式之前呼叫。
RNBOsproGetVersion() 返回驅動程式的版本。
RNBOsproInitialize()
驅動程式初始化。
RNBOsproOverwrite() 可以修改除保留單元00C07之外的任何單元的值和連線碼。
RNBOsproQuery() 提供一個查詢值,給應用程式返回一個加密的返回值。
RNBOsproRead()
讀非隱藏單元的值。
RNBOsproWrite() 改變某單元的值。
DesKey的API函式就更簡單了: Dk2DriverInstalled 檢查驅動程式是否安裝
findDk2 檢查DK2狗是否安裝
dk2readmemory 讀DK2某個單元的內容
dk2readdowncounter 讀計數器的值
dk2decrementDowncounter 計數器減一
具體的函式細節可以檢視sspro和Deskey的開發者指南(本站有下載)
瞭解了上述函式之後,你就可以使用IDA對你的目標進行分析,然後應用相應的sig符號表(本站有下載),IDA就可以在反彙編的結果中找到上述函式(如果有的話),接下來就看你的組合語言工夫和思維是否清晰了。