查看單個文章
舊 2003-11-11, 08:24 PM   #1
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設 破解加密鎖狗(key)?

Q:如何破解深思3的狗? 幫一個朋友,不知道誰可以幫忙?

破解教程,供參考:



【深思3亂彈(一)——密碼】
深思3狗,有兩套密碼,一個叫開發密碼,一個叫套用密碼,都是由三個整數
組成的。我們知道,任何一種加密狗,都不可能對不同的人賣相同的加密狗,
這個區別,在聖天諾狗裡叫ID號,在HASP狗裡是密碼,在深思3狗就是這個開
發密碼了,不同的人或者公司,買到的深思狗的開發密碼肯定是不同的,但
是,深思狗的開發密碼,只是在編輯和寫入程序時用,在用戶程序中不用,
在用戶程序中只用套用密碼,這是深思狗的一個嚴重的漏洞!我們可以用不
同的開發密碼的狗,寫入相同的程序和資料(包括套用密碼),這就可以完
全複製深思狗了!!!
要破解深思狗或者複製深思狗,第一步就是找到「套用密碼」。用狗加密的
軟體,判斷是否有加密狗,第一步就是找狗,在深思狗中就是「開啟加密鎖」
——OpenSense3。這個操作,在大部分反彙編中可以找到「OpenSense3」字
符串,在CALL語句的上一行,是PUSH語句,其後的資料就是深思使用函數接
口參數表的位址。看一下這個位址,第一個字元是返回值,從第二個字元開
始的連續六個字元,就是「套用密碼」了。如果在反彙編中找不到
「OpenSense3」字串串,可以在動態偵錯器(如TRW2000)中,下BPIO 378,
攔下後,按F12十幾次,返回到主程序中,上一行的CALL就是「開啟加密鎖」
的使用了。如果要複製狗,把這三個密碼記下來,以後,其他資料收集齊了,
就可以寫狗了;如果是破解,只需要把深思使用函數接頭參數表的第一個字
節置為0即可破解掉第一不了。
****說明:本文只是為初學破解加密狗的朋友而做,諸位高手見笑了,如果
沒有人扔臭雞蛋之類,還會續下去,否則,獻醜到此為止了。
【深思3亂彈(二)——資料】
在深思3亂彈(一)——密碼中,我們已經談了深思3的套用密碼,可以并且
只能在程序中得到。在這裡,我們談一下深思3的資料單元的問題。
深思3的標準版,提供了128個字元的資料區。除了極個別的軟體狗,大多數
軟體狗都有資料區,如金天地的各種狗,都有100字元的資料區,有人可能
會問,為什麼是100字元,應該是64、128、256字元才對呀。存儲器本身的
容量,確實應該是64、128、256等,那麼,金天地提供100字元的資料區,
少了28個字元,這少的28個字元,被用來做系統資料區了,用來儲存序列號、
密碼之類的東西了。那麼深思3為什麼沒有佔用資料區?深思3還有48字元的
程式碼區,與64相比,少了16字元,這就是他存放密碼等系統資料的所在了。
對於狗中的資料,在被加密程序中的使用,各種狗的情況基本上是相同的。
一是,讀出資料,簡單的比較;二是,讀出資料,不做比較,而是作為參數
或位址,供程序下一步使用。如果被加密程序,處理狗內的資料是前一種情
況,則在無狗的情況下,我們從程序中即可得到資料了。對於後一種情況,
則必須在有狗的情況下,才可以得到資料,即無狗是無法破解的。
如果有狗,要複製的話,在知道了「套用密碼」後,讀出狗中的全部資料,
不是很難的事了。
深思3的狗,讀寫資料的指令,和開啟鎖的指令是相同的,只是資料接頭的
具體參數不同而已。
深思3狗,開啟鎖的指令格式是:
PUSH 位址1
CALL 位址2
這裡,位址1,是深思3資料接頭的首位址(即程序設計中的資料接頭的游標),
位址2,是深思3狗驅動程式的使用位址。讀寫資料的指令與此完全相同,所
以,找到了一處,就不難找到其他的了。
這裡說明一下,深思3狗的資料接頭(前文「深思3亂彈(一)——密碼」中
的敘述有誤,以此為準)
2字元返回標誌,2字元功能程式碼,6字元套用密碼,2字元輸出記數,8字元輸
出內容,2字元接受記數,8字元接受內容,2字元備用輸入,64字元系統保留。
這樣,4-9字元為套用密碼,20-21為讀狗資料的字數,22-29為讀狗的資料。

【深思3亂彈(三)——程式碼】
可以把程序(程式碼)寫入狗內,是深思3狗引以為榮的特色。也是我們破解或
複製深思3狗的難點。
前兩段短文已經將了,我們可以從程序中找到狗的套用密碼,可以從狗中讀
出全部資料區的內容,但程式碼區是可寫不可讀的,怎麼辦呢?
把程式碼寫入狗中,實際上是一種資料變換,不過就是這個變換可以由用戶自
己編程而已。
所謂資料變換,就是向狗發出一個資料,狗則返回一個同樣長度的資料,返
回的資料就是變換的結果,變換的規則,就是狗內的算法,聖天諾的SUPERPRO
狗的算法是類BIOS的,但算法因子可以由用戶寫入;深思3的算法,就是用戶寫
入的程式碼。
既然變換的結果是資料,被加密程序,怎麼判斷返回值是否正確呢?
對於深思3而言,有三種情況:
1、用碼表
所謂碼表,就是加密者事先準備的資料變換前後的對照表。這種方法是聖天
諾狗必用的方法。這種方法的缺點是,容易被WKPE等仿真類軟體攔截,除非
準備的碼表很長,使得多次攔截後的資料合并起來龐大得無法使用。碼表法
是深思公司極力反對的。所以,在深思狗加密中很少見,但也不排除有習慣
用此方法加密的人,使用深思狗後仍然沿用這種方法。
2、副本法
所謂副本法,就是在被加密程序中有一個與狗中程式碼功能相同的程式碼的副本
存在,被加密程序,做資料變換,採用隨機數,把產生的隨機數,發到狗內,
變換返回的資料1,在把同一個資料送到程序內的副本處,進行變換,得到
返回資料2,比較資料1和資料2,判斷是否是正版狗。
這種方法,可以有效防止WKPE等仿真器攔截。但這種方法,為我們複製狗留
下了漏洞,我們只要找到這個副本,把他翻譯成深思3的彙編語言,就得到
了狗內程序程式碼。
3、逆變換法
所謂逆變換法,就是狗內的程式碼,有變換和逆變換兩個入口,被加密程序產
生一個隨機數,先送到變換區返回一個資料,再把這個返回值送到逆變換區,
返回一個逆變換資料,把這個資料與最初的隨機數比較,相同就是有正版狗。
這種方法,也可以有效防止WKPR類仿真器的攔截,而且,無法從程序中得到
狗內的程式碼。但是我們可以在狗內隨便寫一段程式碼,只要變換和逆變換的入
口與原狗的一致就可以了。
綜上所述,只要有了程序,基本上可以複製出深思3的狗了。只是資料區的
問題,如果是把從狗內讀到的資料,不進行對比,則我們就無法知道資料區
的內容,必須要讀狗。
****好了,關於深思3狗的一點研究心得,就寫這些了,錯漏之處在所難免,
只是給初學破解加密狗的朋友做參考。現醜到此結束。

【深思3亂彈(四)--JAVA】
JAVA由於可以反編譯,所以他的加密很難,深思狗為JVAV加密。專門作了一
個動態庫S3DLL.DLL,有提供了一個加密的樣板:JAVASENSE3.JAVA,我們要
破解用深思狗加密的JVVA軟體,就從這裡下手。
把JAVA程序的CLASS文件的ZIP文件解壓,可能有上千個文件,但一定可以找
到一個名為:JAVASENSE3的文件,把他反編譯,我們看看怎樣。
在這個文件裡,定義了一個類:JAVASENSE3,成員變數有:P1,P2,P3,
P4,P5,成員函數是:
CALLSENSE3,入口參數:
short FunctionCode: Sense3 Call FunctionCodenit(-1),
Call(0-47),Exit(1024);
short OutWords: Invalid for Init&Exit Function;
short OutBuff0: Invalid for Init&Exit Function;
short OutBuff1: Invalid for Init&Exit Function;
short OutBuff2: Invalid for Init&Exit Function;
short OutBuff3: Invalid for Init&Exit Function;
返回值:無;
再往下看,一定可以找到多處使用函數CALLSENSE3的地方,這些就是對狗*作
的地方。我們要特別注意函數的第一個參數。當第一個參數為1024時,這是
關閉加密狗,不用管他;當第一個參數為-1時,這是開啟加密狗,使用函數
下面就是一個返回語句:RETURN 參數X,把他的參數X改為0,這個找狗的調
用就解掉了;當第一個參數為其他的值時(0-47),就有四種*作的可能了,
讀資料、寫資料、變換、逆變換,具體是哪一種操作,無法判斷,其實也無
須判斷,我們只要知道返回的參數值就可以了,在這些語句下面,加上可以
儲存資料或顯示資料的語句(這個應該很簡單了),把6個參數都儲存或顯
示出來,編譯,加到原來的ZIP文件中去,帶狗執行,就會得到這些參數值,
把他們寫行程序中,去掉儲存或顯示的語句,破解就全部OK了。

【深思3亂彈(五)——讀出資料】
讀深思3的資料,依賴於狗內的程式碼。
說到讀,就不能不說寫,因為讀寫是互逆的操作。
因為大部分加密者很懶,都用自動產生的程式碼,所以,我們先來看看深思3
自動產生的程式碼是什麼樣的:
1、簡單隨機度:
; (C) Copyright 1998 SenseLock Technologies Inc.
developerpass*,*,* ;開發密碼
userpass111,222,333 ;用戶密碼
casesensitive1
code1segmentcode ;程式碼段開始
Encrypt:subbx1,ax1 ;資料變換
xchgax0,bx1
rorax0,8
xchgax0,bx1
addax1,bx1
xchgax0,ax1
rorax0,3
xchgax0,ax1
addbx1,ax1
xchgax0,bx1
rolax0,8
xchgax0,bx1
subax1,bx1
xchgax0,ax1
rolax0,8
xchgax0,ax1
ret4
WriteMemory:xchgbx1,[ax1] ;寫資料
ret4
ReadMemory:movbx1,[ax1] ;讀資料
ret4
Decrypt:xchgax0,ax1 ;資料逆變換
rorax0,8
xchgax0,ax1
addax1,bx1
xchgax0,bx1
rorax0,8
xchgax0,bx1
subbx1,ax1
xchgax0,ax1
rolax0,3
xchgax0,ax1
subax1,bx1
xchgax0,bx1
rolax0,8
xchgax0,bx1
addbx1,ax1
ret4
code1ends ;程式碼段結束
data1segmentdata ;資料段開始
dw0
dw1
dw2
data1ends ;資料段結束
我們看到,整個程式碼分為四段,有兩個互為逆運算的資料變換段,一個讀數
據段,一個寫資料段。我們要研究的是讀資料,所以,只看讀、寫兩個段:
ReadMemory:movbx1,[ax1] ;讀資料
ret4
WriteMemory:xchgbx1,[ax1] ;寫資料
ret4
他們共同的特點是:只有兩行,并且第二行都是返回。
先看讀資料,需要輸入兩個資料,bx1,ax1,把位址為ax1的資料區的資料給
bx1,返回的資料中,ax1不變,bx1變。bx1就是位址為ax1的資料的值。
再看寫資料,需要輸入兩個資料,bx1,ax1,把位址為ax1的資料區的資料與
bx1的值交換,返回的資料中,bx1,ax1交換了位置,并且bx1的數值變化了。
如果我們手裡有一個軟體和它的狗,如何找到讀資料的程式碼?
用靜態反彙編工具軟體,把軟體反彙編,找到所有對狗操作的地方,可以把
所有狗內的程式碼段位址找到,其中程式碼只有兩行的程式碼段,就是讀、寫程式碼
段了。然後再來區分讀、寫。
進入動態跟蹤偵錯工具(如TRW2000等),跟蹤這兩個程式碼段,看返回資料
的變化,按前面的分析,就可以區分出讀、寫了。
找到了讀資料的程式碼位址,就可以利用原軟體或者自己編一個軟體來讀出狗
內的資料了。
2、普通隨機度:
; (C) Copyright 1998 SenseLock Technologies Inc.
developerpass*,*,* ;開發密碼
userpass111,222,123 ;用戶密碼
casesensitive1
code1segmentcode ;程式碼段開始
ret4
Encrypt:subax1,bx1 ;資料變換
addbx1,ax1
subbx1,ax1
addax1,bx1
jmpLabel1
ReadMemory:movax1,[bx1] ;讀資料
Label1:jmpLabel2
Decrypt:subax1,bx1 ;資料逆變換
addbx1,ax1
subbx1,ax1
addax1,bx1
Label2:jmpLabel3
WriteMemory:xchgax1,[bx1] ;寫資料
Label3:movbx0,rand ;隨機干擾
xchgax0,bx0
clrbx0
subbx1,ax0 ;通訊變換入口
xchgax1,bx1
addbx1,ax0
xchgbx1,ax1
subax0,bx1
xchgax0,ax1
rolax0,3
xchgax1,ax0
xchgax1,bx1
addbx1,ax0
xchgbx1,ax1
xchgax0,bx1
rolax0,4
xchgbx1,ax0
xorbx1,ax0
xchgax0,bx1
xorbx1,ax1
xchgbx1,ax0
subbx1,ax1
xchgax0,bx1
xorbx1,ax1
xchgbx1,ax0
xorax1,bx1
jmpbx0
code1ends ;程式碼段結束
data1segmentdata ;資料段開始
dw64dup(0)
data1ends ;資料段結束
我們看到,整個程式碼分為五段,比簡單隨機度多了一個通訊變換段(通訊變
換段前面還有三行隨機干擾,不算一個單獨的段),有兩個互為逆運算的數
據變換段,一個讀資料段,一個寫資料段。我們要研究的是讀資料,所以,
只看讀、寫兩個段:
WriteMemory:xchgax1,[bx1] ;寫資料
ReadMemory:movax1,[bx1] ;讀資料
Label1:jmpLabel2
他們的共同特點是,一般有兩行組成,如果是在通訊變換前面的,則只有一
行。第二行是轉移語句。第一行與前面介紹的簡單隨機度相同,所以,這裡
就不在細說了。
開頭說了,一般的加密者很懶,往往用自動產生的程式碼。如果不用自動產生
的程式碼,又如何呢?
例如,程式碼段是這樣的:
mov ax0, bx1
mov bx0, ax1
mov ax1, [bx0]
mov bx1, [ax0]
add ax1, bx1
add bx1, ax1
ret 4
這實際是每次讀兩個資料,然後再進去行簡單計算,然後返回。這樣,就不可
能直接讀出資料區的資料了。這就需要猜出程式碼來,如果知道程式碼,其實不
是很簡單嘛?至於如何猜到狗內的程式碼,我準備在下一個問題裡回答。

【深思3亂彈(六)——分析程式碼】
深思3狗內的程式碼不能讀出來,只能分析出來,就是猜出來。
沒有什麼技巧,也不用自己編程序去讀一下狗。
很多人都問過類似的問題,我都是這樣回答的。難免有人認為我保守。
你看了下面的內容,就知道我說的是實話。確實是猜出來的。
深思3狗內的程式碼部分的結構,前面已經介紹了。下面看看他的彙編語言。

深思3狗的程式碼部分,有48個字元(0-47),他的彙編語言是單字元指令,
所以可以有48個彙編語句,我們把他叫做48個行。語句的種類,他的說明
書有詳細介紹,這裡就不詳述了。按使用頻率分:

加法——ADD;
減法——SUB;
異或——XOR;
循環左移1-8位——ROL;
循環右移1-8位——ROR;
傳送——MOV;
交換——HCXG;
上面7個最常用;

加1——INC;
減1——DEC;
左移1位——RCL;
右移1位——RCR;
取反——NOT;
這5個次常用;

與——AND;
或——OR;
這2個很少用;

跳轉——JMP;
返回——RET;
清0——CLR;
隨機賦值——MOV bx0, rand;
這4個是類BIOS格式的,可以不管他。

看了這些語句,就可以知道了,我們猜他的某移段算法,只是5個語句(最
前面7個語句,其中傳送、交換不是計算,所以,計算語句就只有5個最常用
的)的可能性最大,就在上面5個語句上猜就可以了。

下面看一個例子。

某軟體(請原諒,不能提名字),經過分析,已經找到用戶密碼,再經過靜
態反編譯,知道他的程式碼是所謂「簡單隨機度」的,各段情況如下:

0-1;2-3;4-6;7-9;10-16(AH-10H);17-21(11H-15H);22-28(16H-1CH);
29-35(1DH-23H);36-41(24H-29H)。

下面用TRW2000跟蹤,發現在使用16H時,輸入的4個數是:
BX1=1AA0;BX0=453A;AX1=0319;AX0=4FE1
返回的4個數是;
BX1=0319;BX0=4FEI;AX1=E646;AX0=0AA6
一眼就看到了,返回的BX1等於輸入的AX1,返回的BX0等於輸入的AX0,所以
這段程式碼可以知道3行了:
22:XCHG BX1,AX1
23:XCHG BX0,AX0
24:
25:
26:
27:
28:RET 4
還有4行不知道。
可能你會說,為什麼用交換XCHG,不用傳送MOV?因為交換沒有破壞另外兩
個數,傳送必然要破壞另外兩個數,所以,只能是交換XCHG。
這時,到了24行了,資料是這樣的:
BX1=0319;BX0=4FE1;AX1=1AA0;AX0=453A
返回的4個數是;
BX1=0319;BX0=4FEI;AX1=E646;AX0=0AA6
先求AX1的算法,按照加、減、異或的順序試算:
AX1=AX1+BX1=1AA0+0319=1DB9;
AX1=AX1+BX0=1AA0+4FE1=6A81;
AX1=AX1+AX0=1AA0+453A=5FDA;
AX1=AX1-BX1=1AA0-0319=1787;
AX1=AX1-BX0=1AA0-4FE1=CABF;(說明:狗內的資料是16位的,所有借位、
進位只改變標誌位)
AX1=AX1-AX0=1AA0-453A=D566;
AX1=AX1 XOR BX1=1AA0 XOR 0319=19B9;
AX1=AX1 XOR BX0=1AA0 XOR 4FE1=5541;
AX1=AX1 XOR AX0=1AA0 XOR 453A=5F9A;
現在,讓我們來看看上面的9個結果,那一個與輸出的AX1=E646最接近?是19B9!
為什麼? 19B9取反就是E646!
好了,現在24、25兩行程式碼知道了。
24:XOR AX1,BX1
25:NOT AX1
或者:
24:NOT AX1
25:XOR AX1,BX1
現在這段程式碼是這樣的了:
22:XCHG BX1,AX1
23:XCHG BX0,AX0
24:XOR AX1,BX1
25:NOT AX1
26:
27:
28:RET 4
還差兩行。當執行到26行時,這時資料是:
BX1=0319;BX0=4FE1;AX1=E646;AX0=453A
返回的4個數是;
BX1=0319;BX0=4FEI;AX1=E646;AX0=0AA6
只有AX0還沒有求出算法來,和上面求AX1的算法相同,對AX0,按照加、減、
異或運算進行試算:
AX0=AX0+BX1=453A+0319=4853;
AX0=AX0+BX0=453A+4FE1=951B;
AX0=AX0+AX1=453A+E646=2B80;
AX0=AX0-BX1=453A-0319=4221;
AX0=AX0-BX0=453A-4FE1=F559;
AX0=AX0-AX1=453A-E646=5EF4;
AX0=AX0 XOR BX1=453A XOR 0319=4623;
AX0=AX0 XOR BX0=453A XOR 4FE1=0ABD;
AX0=AX0 XOR AX1=453A XOR E646=A37C;
看看這9個結果,和輸出的AX0=0AA6最接近的是F559!同樣是取反。
所以,這段程式碼是:
22:XCHG BX1,AX1
23:XCHG BX0,AX0
24:XOR AX1,BX1
25:NOT AX1
26:SUB AX0,BX0
27:NOT AX0
28:RET 4
其他各段程式碼的求發,與這個大同小異。
程式碼行數少的就相應簡單一些,行數多的,就相應複雜一些。
這個軟體的加密者,就犯了一個錯誤,狗內程式碼分段太多了,使每段的長度
太小了,所以分析起來很容易。如果一段程式碼有20行,呵呵,分析起來,就
非常難了。這難度是和程式碼行長度成幾何級數關係的。

破解程式:
HASP.Emulator.V2.07.D027.Win2kXP.Cracked-CPHV
HASP.Emulator.V1.07.D027.Win9xME.Cracked-CPHV
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
向 psac 送花的會員:
cencun (2009-04-20)
感謝您發表一篇好文章