軟磁碟反拷貝加密技術 [1] (4千字)

看雪資料發表於2002-05-04

看到一位朋友尋找軟磁碟的加密資料,這個我也很感興趣,所以就把以前從書本和網上的資料整理了一下,希望對正在尋找和學習此方面技術的朋友有所幫助^_^


軟磁碟反拷貝加密技術

    軟磁碟反拷貝實質上就是在磁碟中製作一些特殊的標記,這種標記不能被輕易複製,可以由被加密程式識別,由此來達到軟體加密的目的。
    軟磁碟反拷貝技術在多年來的發展過程中不斷成熟,湧現出多種方法,但由於拷貝工具也在發展,有些反拷貝技術已不能抵禦功能強大的拷貝工具的進攻而逐漸被淘汰。但也有一些經典的加密技術,至盡仍被廣泛運用。
   
    1、超級扇區法
   
    這種方法利用專用裝置在軟盤上寫上一些超長(往往接近一個磁軌)扇區,正常情況下這種長扇區磁碟控制器無法在磁碟上寫出,但可以在程式的控制下在其中讀出資訊。將金鑰存放在正常情況下扇區間隙的位置處,這樣,一般的複製程式就無法將其複製,而在被加密程式中卻可以將間隙處的金鑰作為超級扇區的一部分讀出,判斷讀出資訊的正確性就可以確定該盤是否是原盤,從而獲得加密效果。
    設超級扇區位元組長度為4096,所在磁軌為0面0道。讀出的資訊放在DS段偏移1000H開始的區域中。

    C:\DEBUG
    -E 0:0525                  ;修改磁碟技術表
    0000:0525  02.05  09.01
    -A  100
    1180:0100  MOV  AX,0201    ;讀一個扇區
    1180:0103  MOV  BX,1000    ;讀出資料緩衝區指標
    1180:0106  MOV  CX,0        ;0道0扇
    1180:0109  MOV  DX,0        ;A道0扇
    1180:010C  INT  13
    1180:010E  INT  3
    1180:010F
    -G=100

    2、異常ID法

    扇區中的ID欄位由柱面號(C)、磁頭號(H)、扇區號(R)和扇區位元組長度(N)四個引數組成。對於5.25in雙面低密度軟盤來講,這四個引數的正常取值的範圍是:C(0~39),H(0,1),R(1~8或9),N=2。異常ID的扇區是不能正確讀寫的,而ID在格式化寫入時不作正確性檢查,於是就可以用這一點來人為地製造異常ID扇區,阻止一般拷貝軟體的複製。
    有很多種方法來產生異常ID扇區,如:使扇區長度不等於512位元組(即使N≠2);將扇區號取大雨9的值;打亂磁軌上扇區的排列順序;使磁頭的邏輯號與物理號不相符,等等。
    對於打亂磁軌上扇區的排列順序的方法可以採取以下步驟來實現,這段程式在A盤第20道0面進行格式話時,把9個扇區的順序完全顛倒了。

    C:\DEBUG
    -E  1000
    2884:1000 00.14 00.00 00.09 00.02 00.14 00.00 00.08 00.02
    2884:1008 00.14 00.00 00.07 00.02 00.14 00.00 00.06 00.02
    2884:1010 00.14 00.00 00.05 00.02 00.14 00.00 00.04 00.02
    2884:1018 00.14 00.00 00.03 00.02 00.14 00.00 00.02 00.02
    2884:1020 00.14 00.00 00.01 00.02
    -A 100    格式化A盤0面20道
    2884:0100 MOV AX, 0509
    2884:0103 MOV BX, 1000
    2884:0106 MOV CX, 1401
    2884:0109 MOV DX, 0
    2884:010C INT 13
    2884:010E INT 3
    2884:010F
    -G=100

    3、額外扇區法
   
    一個扇區由標識區(長度為22位元組,對5.25in雙面低密軟盤而言)和資料區(長度為512+16+2=530位元組)以及兩個間隙(GAP2和GAP3,長度分別為22和84位元組)組成,其實際長度為22+22+530+84=658位元組,9個扇區在加上前置區和後置區的長度,一個磁軌的容量大約有6224位元組,而其中的GAP3和後置區的長度都是可改變的,尤其是GAP的調整可以在格式化時通過修改磁碟基數表位移07處的值來設定,所以完全可以通過減小GAP3 長度來減少一個扇區所佔的位元組數,從而在一個磁軌內多裝入一個扇區。例如取GAP3的長度為10(不能小於5,否則有可能出現磁碟故障)時,每扇區長度為625-(84-10)=584,10×584+32=5872,所以一個磁軌內足以裝下10個扇區。
    如此格式化出的第10個扇區,常規拷貝軟體無法訪問,如果把金鑰放在這一額外扇區中,就可以防止磁碟被複制。

    C:\DEBUG
    -E 0:526                ;修改磁軌基數表
    0000:0526 09.0A 2A      ;每道扇區數改為10~~~~~~~~~~~~~~~~
    0000:0528 FF    54.0A  ;GAP3長度改為10
    -E 10000                ;格式化所需的扇區ID引數
    5068:1000 00.14 00.00 00.01 00.02 00.14 00.00 00.02 00.02
    5068:1008 00.14 00.00 00.03 00.02 00.14 00.00 00.04 00.02
    5068:1010 00.14 00.00 00.05 00.02 00.14 00.00 00.06 00.02
    5068:1018 00.14 00.00 00.07 00.02 00.14 00.00 00.08 00.02
    5068:1020 00.14 00.00 00.09 00.02 00.14 00.00 00.0A 00.02
    -A 100:                ;格式化A盤0面20道
    5068:0100 MOV AX,050A
    5068:0103 MOV BX,1000
    5068:0106 MOV CX,1401
    5068:0109 MOV DX,0
    5068:010C INT 13
    5068:010E INT 3
    5068:010F
    -G 100

    格式化額外扇區

    C:\DEBUG
    -E 0:526                ;修改磁軌基數表
    0000:0526 09.0A 2A    ;每道扇區數改為10
    0000:0528 FF    54.0A  ;GAP3長度改為10
    -A 100                  ;讀A盤0面20道第10扇區
    5068:0100  MOV AX,0201
    5068:0103  MOV BX,1000
    5068:0106  MOV CX,140A
    5068:0109  MOV DX,0
    5068:010C  INT 13
    5068:010E  INT 3
    5068:010F
    -G=100

4、偽扇區法
   
    該方法在一磁軌上按扇區的標準格式順序存放若干扇區頭標誌,後邊不跟資料。當拷貝軟體複製這一磁軌時,要在其緩衝區內分配足夠的記憶體來存放這些偽扇區的資料值,於是很快就會使緩衝區溢位,從而保護了偽扇區後面真正有用的關鍵資料。

    5、扇區對齊法

    絕大多數PC機及其相容機使用的磁碟都是軟分段的。所謂軟分段,就是在整張磁碟上只有一個索引孔,通過磁碟的旋轉以及磁頭的步進來存取資訊。磁碟每轉一週,磁碟驅動器將自動產生一個索引脈衝訊號,以次標記磁軌的開始。在索引脈衝訊號之後,依次為每個扇區寫上扇區識別標誌(ID),這些標誌能標誌磁軌的開始。傳統的磁碟複製實際上就是一個讀寫交錯的過程,它將讀到的磁碟的資訊全部寫到目標盤的對應磁軌上,而全然不顧扇段與扇段是否對期。這裡的扇段對齊是指每個磁軌的磁偏角相等。因而,如果有了對齊的扇段,便可以通過一些檢測手段達到加密的目的。
    有了這種想法,如何製作一張扇段對齊的磁碟呢?這可以通過精確磁軌位置(即按相同的磁偏角)將相應的扇段寫到每個相應的磁軌中,來完成扇段的對齊操作。由於傳統的複製程式的“非智慧性”(即全然不管扇段是否對齊),以及磁碟機的轉速存在著誤差,因而利用傳統的自複製程式複製的磁碟必然導致扇段的磁偏角不再相等,即扇段不再對齊。可以在被加密程式中安排一段程式碼,用它來讀一個磁軌上的某個扇段,步入下一個磁軌,等待確定的時間,讀它找到的下一個扇段的號碼來檢查扇段是否對齊,從而可以判斷是否為原盤,達到加密的目的。可以通過精確控制磁碟驅動器的磁頭,將相應的扇區以相對於索引孔的精確偏移寫到每個對應的磁軌來實現扇區對齊。
    扇段對齊技術是一種十分有效的磁碟軟加密方法。但是由於要精密依靠磁碟的轉動速度來判斷扇段對齊,而磁碟的轉動速度實際上時時刻刻都不相同,因而這種加密技術實施難度大,也較難得到高可靠性。因此在實際應用中,扇區對齊技術的使用並不多見。

    6、未格式化扇區法

    眾所周知,微機上使用的軟盤必須經過格式化處理後才能儲存資訊,未格式化的磁碟是無法使用的。未格式化扇區的加密原理就是利用這個特點,該方法在製作原盤時對某一磁軌的部分扇區不作格式化處理,這部分扇區無法儲存資訊,一般的拷貝軟體無法拷貝,這樣,在被加密程式中對某一特定的磁軌進行檢查,看其是否為正常磁軌,即不含未格式化的扇區,若是正常磁軌,則必定為複製盤。下面提供一段製作含未格式化扇區原盤的程式:

    GSH_BUF  DB 27H, 00, 01, 02    ;格式化時所需的標識欄位集合
            DB 27H, 00, 02, 02
            DB 27H, 00, 03, 02
            DB 27H, 00, 04, 02
            DB 27H, 00, 05, 02
            DB 27H, 00, 06, 02
            DB 27H, 00, 07, 02
            DB 27H, 00, 04, 02
            ... ...
            PUSH ES
            MOV  AH,35H
            INT  21H
            MOV  AL,07H
            ADD  BX,04H
            MOV  ES:[BX],AL
            POP  ES
            MOV  DL,0
            MOV  DH,0
            MOV  CH,27H
            MOV  BX,OFFSET GSH_BUF
            MOV  AH,05
            INT  13H
            PUSH ES
            MOV  AH,35H
            MOV  AL,1EH
            INT  21H
            MOV  AL,09H
            MOV  BX,04H
            MOV  ES:[BX],AL
            POP  ES
            ... ...

    在被加密程式中可以安排一段專門程式,用來檢查磁碟是否為原盤。具體做法是:檢查磁碟上的39道上扇區數是否大於7。若大於7,則此盤為拷貝盤;否則為原盤。下面給出檢查程式:

    MOV  AX, SEG MY_BUF
    MOV  ES, AX
    MOV  BX,OFFSET MY_BUF
    MOV  AL,01H
    MOV  DL,00H
    MOV  DH,00H
    MOV  CH,27H
    MOV  CL,08H
    MOV  AH,02H
    INT  13H
    CMP  AX,0400
    JNZ  ILLEGL_DISKETTE

    應當注意,上面這段程式很容易受到攻擊。首先,程式是透明的,攻擊者用除錯程式可將其輕易抹掉;其次,由於某些高階拷貝工具軟體功能強大,能完全複製一張磁碟,從而使這段程式失去作用。因而,這段程式還有待於進一步改進,如在應用程式中增加回寫操作、明文變密文等。這裡就不再一一說明。

    7、螺線型磁軌法

    磁碟上的磁軌是一個個同心圓,當磁頭從一個磁軌移到另一個磁軌進行讀寫時,必須由FDC控制磁頭步進,並等待一段時間,待其穩定後,再進行正常的讀寫操作。通常,這一等待時間稱為安頓時間。
    螺線型磁軌法就是在磁碟上生成一些螺線型磁軌,使磁頭步進和讀寫操作同時進行,從而徹底擾亂一般拷貝軟體的複製。
    螺線型磁軌加密技術是將資訊寫入非標準格式的磁碟,使得普通的拷貝工具無法複製,因而這種方法是一種十分有效的加密方法,但要成功地讀寫螺線型磁軌,必須掌握步進速率和轉動速率之間的精確的比率,這是很難做到的,故這種方法可靠性不是很高。
8、磁軌間距不規則變化法

    在一般的磁軌密度為48TPI的軟盤驅動器中,磁軌間距為529μm,其讀寫磁軌寬度為330μ沒,抹去寬度為150μm。磁軌間距通常是相同的,一般的拷貝軟體就是直接控制磁軌驅動器的步進電機,使讀寫磁頭在磁軌間距相等的磁軌上來回移動進行拷貝的。磁軌間距不規則變化方法就是抓住拷貝軟體這一漏洞。利用軟體控制步進電機,使磁頭在磁碟上產生不規則的磁軌間距,使拷貝軟體無法正常拷貝。
    該方法是一種很有效的加密方法,但其製作涉及到的驅動器硬體結構,所需專門編制軟體來控制步進電機的動作,因而在實際中應用不廣。

    9、寬磁軌法

    有些磁碟複製機構中配有寬磁頭,這種磁頭可以在多個磁軌上同時寫入資料,也可以在相鄰的兩個磁軌及其間隙寫入相同內容,從而產生一個相當寬的磁軌。在被加密程式讀磁碟的程式碼中,讓磁碟驅動器的讀寫磁頭在這個“寬磁軌”的兩個寫有相同資料的磁軌之間來回步進,資料流是不會中斷的,但如果是複製的磁碟,讀/寫磁頭外側的消磁磁頭的抹除作用會使這個寬磁軌在物理上分開,成為兩個普通磁軌,兩個之間的間隙中充滿了噪音訊號,會導致資料流中斷。利用這一點即可判斷所讀取的磁碟是否是原盤。

    10、磁軌接縫軟指紋技術

    所謂磁軌接縫,指的就是每個磁軌中位於索引孔兩邊的前置區和後置區。前置區和各個扇區的長度不變,後置區(GAP4)的長度是隨機變化的,從200位元組到300位元組不等,其中包含的資訊也是隨機的,不同磁軌後置區的長度和內容不同,即使是同一軟盤的同一磁軌,每格式化一次,其後置區的長度和內容就變化一次。後置區的這一特性就保證了其不可複製性,其內容就像人的指紋一樣具有唯一性,完全可以用來加密。
    如何將不定長度的後置區取出以作為鑑別的依據,是利用磁軌接縫軟指紋加密技術進行加密的關鍵。一般來說,對於標準的磁軌要讀取後置區是比較困難的,除非用埠讀磁軌命令來實現,而埠讀磁軌命令又是十分煩瑣的。
    讀取磁軌接縫中的“指紋”有一種巧妙的方法,因為GAP4的長度不超過300位元組,又緊跟在第9扇區之後,所以只需在格式化時對第9扇區ID標誌中的N改為3(磁碟基數表中的N不變),這樣格式化出的第9扇區實際資料長度仍為512位元組,但在讀第9扇區時,將磁碟基數表中的N改為3,就可讀出1024位元組的內容,其中就有GAP4的資訊。
    這種方法目前是較強的一種反拷貝方法,可以防止任何拷貝工具的複製,讀者可以從此為基礎,結合其他方法,設計出更強的反拷貝技術。

    11、扇區軟指紋法

    通常所講的每扇區512位元組指的只是扇區中資料區的長度,但除資料區之外,每個扇區還有其他區域。正常格式化的磁碟,扇區的各個扇區都是可以複製的,但經過特殊格式化的扇區,其某些域上的值就不能被一般的拷貝軟體複製,通過檢驗這些域上資料的正確性就可以判斷是否原盤。
    一種製作讀取這種扇區指紋的方法如下(假定在30道0面1扇區上製作):
    製作:對30道0面進行特殊格式化,取第1扇區ID欄位的N為4(其餘扇區的均為2),格式化時不修改磁碟基數表,使每個扇區的資料仍為512位元組。
    讀取:先修改磁碟技術表中的N值為4,而後讀30道0面1扇區,同時也就把第2扇區的內容全部讀出。對原盤和複製盤上讀出的內容加以比較就可發現其中有些內容不同,因此來判斷是否原盤。

    12、弱位方法

    磁碟是用不同的磁化單位來記錄資訊的。磁碟機讀取磁碟時,將磁碟上不同的介質磁場轉換成磁頭讀/寫線圈中強度不同的電流,而後由電流訊號判斷讀取的資訊是0還是1,電平幅度高於某閥值電平時為1,遠低於閥值電平時為0;磁碟機寫資料到磁碟時,則是將電流訊號轉化為磁介質記錄的磁場強度,與讀過程相反。
    弱位方法就是在寫盤時,採用特殊的技術使磁介質記錄的磁場強度變小,使磁碟機在讀資料時產生的讀出電平恰在閥值電平附近,即比1訊號弱,又比0訊號強(這一位就叫弱位),再加上鑑別電路的穩定性與精確性有限,使之對讀出值產生誤判有時判0,有時判1。這樣的弱位可作為軟指紋來防止拷貝。一般的拷貝軟體在複製帶有弱位的磁碟時,讀出的弱位非0即1,寫在複製盤上的就是0或1(而不是弱位),在被加密程式中對這些位進行是否弱位的判斷就可得知該盤是否是原盤。判斷方法很簡單,只需對這些位多讀幾次,看每次讀出的結果是否一致,若每次相同,則是非弱位,否則是弱位。

    13、錯誤CRC法

    每個扇區的標識區和資料區的後面都有兩個位元組的迴圈冗餘碼校驗碼CRC。CRC是FDC在寫完最後一個資料位元組時自動產生並寫入的,用來校驗扇區記錄資訊是否出錯。正常情況下,FDC產生的CRC都是絕對正確的,除非軟盤有物理性的損壞。如果人為地在某一個扇區產生錯誤的CRC,那麼一般拷貝軟體按通常的拷貝方法所製出的複製盤中肯定不會無法複製的。於是在被加密程式中判斷某一特定的扇區是否有錯誤的CRC就可以知道該盤是否原盤。
    有一個簡單的方法可用來生成錯誤的CRC,即當FDC正在寫某一扇區時,人為地打斷FDC的寫入過程(如復位FDC),這個時刻可由修改後的時鐘中斷程式不斷檢測FDC的主狀態暫存器得到。這樣就會打亂正常資料的寫入,從而在該扇區得到一錯誤的CRC碼。檢測這一特定扇區的CRC是否正確的方法也很簡單,用INT 13H的1號讀扇區功能讀該扇區,而後判斷AH的值,若是10H,則CRC錯,否則CRC正確。
14、磁軌噪音法

    磁碟上的資訊通常採用FM或MFM格式進行編碼,這種編碼實際上就是在0,1序列中按一定格式插入一定的同步脈衝,從而形成一個新的脈衝序列,所插入的同步脈衝對所存的資訊本身來說並無什麼重要意義,只是為了讀出時提取同步資訊。同步脈衝改善了全0或全1脈衝的頻率特性,使讀出資訊時不易出錯。磁軌噪聲法就是採用一種特殊的手段在磁碟上寫入一種特殊的編碼(即噪聲),使系統在對其讀寫時產生同步混亂,使讀出的資訊出錯,阻止拷貝軟體的複製。

    15、FDC移花接木法

    FDC是CPU與軟盤驅動器之間的介面,種類很多,採用的記錄方式和功能都不完全相同,而且用一種FDC在磁碟上製作的標記,可用另一種FDC讀出,但卻不能被複制,這就給加密者一個可乘之機,可以利用兩種不同的FDC在同一原盤上製作兩個不同的標記,這兩個標記可用其中任一種讀出並檢測,但卻不能只用一種FDC來製作,於是可防止拷貝。

    16、扇區交錯保密法

    在一個磁軌內,不將扇區按$0―$F編號存放,而是按任意順序存放,這叫做扇區交錯法,採用此方法,提高了DOS向磁碟存取檔案時的速度。
    APPLE的DOS3.3作業系統中,扇區交錯是由軟體來完成的,用DOS3.3格式化的磁碟上,16個扇區完全按$0―$F順序排列,並無交錯,但在記憶體$BFB8―$BFC7處存放著另一個轉換表,此表將磁碟上的實際扇區編號一一對應到另一組假的扇區編號來供給DOS3.3使用,見下表:

    真實編號  0 1 2 3 4 5 6 7 8 9 A B C D E F
    對應編號  0 D B 9 7 5 3 1 E C A 8 6 4 2 F

    假設修改了$BFB8―$BFC7轉換表後,再用修改過的DOS3.3來INIT新盤,可以想象,如果在這個盤上存入程式,用標準的DOS3.3將無法正常存取這些程式,因為它們之間扇區轉換表不相同。
    “扇區交錯”程式保密法可以利用上述辦法來製作出能保密程式的保密磁碟。
    製作保密磁碟對硬體的要求是:APPLE機的記憶體為48K,6號槽口接上磁碟機,磁碟機的編號為1。製作方法如下:
    (1)製作一個不同於DOS3.3的扇區轉換表。將16進位制數字0至F間除去0剩餘的15個數隨意添入下表橫線上(儘量不與標準DOS3.3的轉換表一致):
    00__________________
    假設你添入的是:
    00 07 0D 04 05 09 0E 01 06 0A 02 0C 08 0F 03
    在紙上記下這組數字,然後根據APPLE機的顯示ASCⅡ碼錶,把每個數字加上C0後所得的值轉化成字母,本例應為:
    @ G M K D E I N A F J B L H O C
    這就是以後使用保密盤時所必須給出的通行口令。有了這個口令,才能往保密盤上存入或取出程式。記住這個密碼。
    (2)將標準DOS3.3引入記憶體,用CALL-151進入監控後,把剛才記在紙上的16個數輸入從$BFB8開始的單元中。

    *BFB8: 00 07 0D 0B 04 05
    09 0E 01 06 0A 02
    0C 08 0F 03
    *(敲入CTRL―C)
    I NEW
    ]
    再將一個空盤插入接在6號槽口的1號驅動器中。
    ]I NI T HELLO
    ]CALL―151
    *6000: 01 60 01 00 00 11 60 00 40 00 00 01 00 00 60 01 00 01 EF D8
    *7000: A0 00 A9 60 4C D9 03 N 7 0 0 0 G
    *404E: <4 04 D 4 05 B M
    *404E8: A2 01 20 1B FD 29 0F 9D 4C 08 E8 E0 11 D0 F3 A5 2B 4A 60
    *4007: 20 E8 08 N 4 0 4 A :4C 69 BA N 60 0 C :02 N 7 0 0 0 G
    *600C: 01 N 60 05: 09 N 7 0 0 0 G
    40B9 <40B8 40 C 6 M N 600C: 02 N 7000G
    *600C: 01 N 6005: 04 N 7 0 0 0 G
    *4069: 84 FF A0 10 B9 4C 08 99 B7 88 D0 F7 A4 FF 6C FD 6C FD 08 N 60 0C: 02 N 7 0 0 0 G
   
    至此,加密盤已製作好。

    上面所說的是軟磁碟的一些加密資料,關於解密方面的資料 軟蛀 和 俞煌男 的解密教程中有很多,我就不累述了,希望朋友們有好的經驗或資料時不惜賜教,我對這個也很感興趣(正如 看雪 所說:“在DOS時代之前就有些比較好的軟體保護技術,而在DOS中使用得最多的恐怕要算軟盤指紋防拷貝技術了。由於DOS作業系統的脆弱性,在其中執行的普通應用程式幾乎可以訪問系統中的任何資源,如直接訪問任何實體記憶體、直接讀寫任何磁碟扇區、直接讀寫任何I/O埠等,這給軟體保護者提供了極大的自由度,使其可以設計出一些至今仍為人稱道的保護技術;”),歡迎來信交流,謝謝。[ fnlq@263.net ]

相關文章