|
論壇說明 |
歡迎您來到『史萊姆論壇』 ^___^ 您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的! 請點擊這裡:『註冊成為我們的一份子!』 |
|
主題工具 | 顯示模式 |
2003-11-11, 08:24 PM | #1 |
榮譽會員
|
破解加密鎖狗(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 |
送花文章: 3,
|
向 psac 送花的會員:
|
cencun (2009-04-20)
感謝您發表一篇好文章 |