最近需要這方面的東西,然后自己在網上找,順便記錄一下,以下內容有來自其他前輩的,也有我自己的心得。
吾愛破解挖到2條有用的。
1、試用版就是試用版
軟件發布的時候,放出的是試用版,客戶付款后,才會發正式版,這樣會很大程度上減少破解。如果有人花錢買你的正式版去破解軟件,那就認了。所謂的試用版,即功能不完整,例如數據采集軟件,試用版就不要寫導出數據的代碼,這個導出代碼只有在正式版里有。或者試用版只能采集100條,只有100次循環。
2、暗樁
你可能用來以防止破解的算法比較簡單,但這並意味着你就不能有效的阻止破解,我們照樣可以用簡單的算法把破解者弄奔潰掉,我的軟件用了5種破解算法,每種算法都不是很復雜,估計單個破的話也就10來分鍾的事情,但我的做法是沒有將所有算法全部用於同一時間同一處進行注冊碼的驗證,而是分散到軟件的不同功能,不同時間來驗證,有的是軟件啟動,有的是點某個按鈕的時候,有的是當時間達到某個條件的時候,破解者往往是把軟件啟動時候的驗證給破掉,但是他在使用過程中[url=]3[/url]又會經常隨機的遇到很多驗證失敗的提示,而且這些過程隨機,可能除了作者,沒人知道這背后有多少處驗證,這些驗證又是什么時候觸發,所以這種做法能讓破解者抓狂的說。另外很多破解者僅僅是為了破解而破解,自己本身又不用被破解的軟件,往往是啟動階段的驗證一破解掉,就認為大功告成的開始發布“成功”破解版。
知乎精彩回答
鏈接:https://www.zhihu.com/question/29372527/answer/44133481
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
因此,cracker總是樂此不疲的破軟件,一個個軟件接連被破,開發者看在眼里,疼在心里。
當開發者知道了這一切的來龍去脈之后,開發者就會想辦法去阻止破解的行為,阻止的方法無非就是給破解的過程增加難度和干擾。
於是,殼誕生了。
殼可以將一個程序給套在里面,可以非常直觀的理解為一個程序的外殼。開發者加的外殼,一般都是一些保護殼,到目前為止還沒有發現為了防破解而給自己的軟件加單純的壓縮殼的。
保護殼的保護機理一般都是反調試器、反虛擬機、垃圾指令、代碼虛擬化(或者混淆)等,程序運行起來是沒有什么太大問題的,但是讓一個cracker的逆向過程變得異常艱辛。
但是加殼有了,相對應的脫殼也就會出現。由於殼的濫用,這引起了一些cracker大牛的注意。cracker大牛通過分析殼的運作機理,模擬殼的環境,通過隱藏調試器等方式躲過殼的反調試功能。畢竟能運行的東西總是理論可修改的,在大牛們的研究下,一個個脫殼機或者脫殼教程就這么出現了。直到現在,加殼和脫殼之間的較量,仍然是那么激烈……
既然殼被脫了,開發者還是不甘心。於是想到了暗樁。
暗樁代碼,一般正常使用情況下是不會觸發的。它到底是什么呢?它有可能是一小段自校驗代碼,在你修改了他的程序之后,程序發現自己被修改而自動退出。也可能是一小段警告代碼,給你來個小的框框,提示“XXX你個逗13別修改我的程序!”這類的東西。心懷惡意的開發者則是喜歡使用威力更大的東西,比如給你來個藍屏,格式化你的硬盤,給你加硬盤鎖(江民硬盤鎖是典型的例子),或者是潛伏一段時間,當你的程序使用一段時間后突然清空程序中的全部數據,讓你損失慘重。
暗樁無疑是cracker們最頭疼的問題,當然有了暗樁,就有相應的去暗樁手段。cracker為了防止這類代碼的破壞,總是喜歡在虛擬機內搞這些東西,即便是不幸中招,也可以利用虛擬機的快照來實現時光倒流。而去暗樁的手段無非兩種,第一是摸清楚所有的暗樁,盡量不去觸發它;第二是和破解軟件一樣,硬性修改這些代碼。
就這樣,本地驗證逐漸的沒落了……
雲的時代正在崛起。
有一些軟件,本身代碼是不全的,比如軟件下載下來就是一個試用版,相應的功能根本就沒有,當你購買了這個軟件之后會給你一個完整版的軟件。
這下可好,除非cracker去入侵開發者的服務器,或者是共享自己的已付費版,否則是沒法破解這個軟件的。
同樣的道理,有些軟件代碼也是不全的,但是和上面的方式有點不同——它依賴於網絡來工作。一些數據的處理和計算,是在服務器上進行的。比如圖片雲識別,當你購買了這個服務之后,你就可以在軟件上登錄你的賬號,然后將一張圖片通過這個軟件發到服務器上去,服務器驗證了你的授權信息有效之后進行識別,並將識別結果返還給你。而整個核心的過程沒有在你的軟件上實現,又談何破解?
破解的方法一樣,除非cracker去入侵服務器,否則沒有辦法破解的。
但是,你會發現,無論是什么樣的軟件,都是理論可破解的。即便是雲計算,cracker還有最后一招,入侵服務器。
也就是說,破解軟件不是不可能,而是一個時間問題和價值問題。假設一個付費軟件做的非常贊,破解它要花費一年多的時間,而作者的定價僅僅是1元就可以終身免費,那么誰還會花那么多時間去破解這個軟件呢?
所以說,話歸到底,每個軟件都是理論可破解的,破解它只是一個時間和價值問題。看雪論壇的
1、檢測調試寄存器
(1)檢測 softice 等系統級調試器
檢測softice的方法有很多.檢測主要在驅動里中實現。
(2)監測用戶級調試器用戶級調試器具有一下幾個特征:
用戶級調試器是采用microsoft提供的dbghelp.dll庫來實現對軟件跟蹤調試的。
被調試的軟件其父進程為調試器。
所以可以采用如下的方法來檢測:
a.調用api函數isdebuggerpresent()(或是直接采用isdebuggerpresent的反匯編代碼,以防破解者攔截對該函數的調用)來檢測是否有用戶級調試器存在。
b.監測調試寄存器的方法。
c.采用tlb的方法,檢查父進程的方法. 在winnt下,可以采用進程注入的技術來檢測軟件的父進程是否正確的方法。
d.設置seh進行反跟蹤。
由於破解者者可以攔截軟件對調試器的檢測操作,所以將保護判斷加在驅動程序中。因為驅動程序在訪問系統資源時受到的限制比普通應用程序少得多,這也給了破解者增加了破解的難度。
2、crc檢校
增加對軟件自身的完整性檢查。這包括對磁盤文件和內存映像的檢查,以防止破解者未經允許修改程序以達到破解的目的。dll和exe之間可以互相檢查完整性。
為了防止破解者采用替代word,以及edocguard的dll,通過計算dll的crc值來驗證。
3、運行時庫的重新編寫
破解者往往是在hmemcpy,strcpy等運行時庫函數上下斷點,通過分析其中的字符串來窺視程序的內部運行。對於edocguard,雖然不是密碼的處理,但是內存解密的部分就是使用的memcpy,所以需要重新編寫這些運行時庫,這個可以從vc或其他編譯器的運行時庫中的代碼改寫獲得。
需要修改的是vc6_encry_lib,clinetfile里面,hook dll里面的readfile,驅動里的解密。
4、花指令的添加
用花指令來對付靜態匯編是很有效的,這會使解密者無法一眼看到全部指令,杜絕了先把程序打印下來再慢慢分析的做法。
一條指令的長度是不等長的,假使有一條指令為 3 字節長,從它的第二個字節開始反匯編,會看到一條面目全非的指令,‘花指令’就是在指令流中插入很多‘垃圾’,使靜態反匯編無法進行。
5、干擾代碼的添加
在關鍵部位添加jmp nop cmp 等跳轉指令,比較指令以及一些沒返回的循環等。插入這些大量無用的運算以誤導解密者,防止靜態反匯編,增加破解者動態匯編時難度。
到處貼條件轉移
沒有循環,只是跳轉,作為有條件的路障,這樣,沒有簡單的反向操作可以執行。
6、api函數的不規則調用
在軟件中對於api的調用不采用直接調用api的方法,因為這樣破解者很容易了解到軟件所調用的api,進而了解到軟件的工作流程。可以采用由dll的輸出表來定位api的函數地址的方法。
對於調試器來說,在對api設置斷點時,是在api函數地址上添加一個int 3指令。所以在調用api時,把api的前幾個代碼指令復制到調用處,執行前幾個代碼指令,然后跳轉到api函數中。
這樣調試器對於api斷點的監視是無效的。
7、接口與字符串
dll,com不使用有意義的函數接口.不采用一目了然的名字來命名函數和文件,如openfile( )、setpermisson等。
所有可能被破解者利用的字符串都不以明文形式直接存放在可執行文件中,采用加密的形式,在需要時進行解密。
盡可能少地給用戶提示信息以防解密者直接了解軟件的流程。比如,當檢測到破解企圖之后,不要立即給用戶提示信息,而是在系統的某個地方做一個記號,隨機地過一段時間后使軟件停止工作,或者裝作正常工作但實際上卻在所處理的數據中加入了一些垃圾。
8、輸入表輸出表攔截的檢測
定時檢測軟件各個模塊的輸入輸出表是否一致,輸入表、輸出表中的函數地址是否處於對應模塊的內存區域中,防止破解者采用hook api 的方法對軟件進程破解操作。
9、加殼
軟件最終發行之前將可執行程序進行加殼/壓縮,使得解密者無法直接修改程序。如果采用現成的加殼工具,最好不選擇流行的工具,因為這些工具已被廣泛深入地加以研究,有了通用的脫殼/解壓辦法。另外,采用兩種以上的不同的工具來對程序進行加殼/壓縮,並盡可能地利用這些工具提供的反跟蹤特性。
10、有條件允許使用加密狗,加密狗盡量選最新的,因為許多解密者對於新狗是沒有研究的,即使他本人精通加密狗,也需要花費一段時間才能弄懂,這就為你的軟件在第一時間銷售爭取到足夠的時間。
11、發布功能不全的軟件提供免費試用,正版則要花錢購買。這樣即使解密者破解了軟件但因為功能不全,他一樣相當於什么也沒得到,而只有匯款給你的人才能得到功能齊全的版本。
12、推出無需注冊的免費軟件,這個不是一般人能承受的起的,但是已經有許多人在做了,試想如果你的軟件根本不用注冊就能使用,那解密的人就會沒有軟件可破而下崗。同時你的軟件也會在使用者中留下良好的口碑。大家都用你的軟件,你就會逐漸成為市場的主流,而你的同行恐怕就會慢慢退出市場了。
13、在軟件中加入一些程序,使軟件在運行一段時間后自動丟失信息或自動銷毀或突然死機。如財務管理軟件,這樣一來使用者會擔心自己因為使用破解版本造成巨大損失,而不得不主動購買你的正版軟件。
14、
15、上面沒有寫是想給你們留下廣闊的空間,我相信每一位聰明人看了這13條之后都能獨立想出一個行之有效的辦法來保護你的軟件。那這一條就教由你自己來完成了。
最后一條就是聯合起來,搞破解的人可以聯合,所以他們破一個軟件會很容易,因為那不是某個人的智慧而是多個人的智慧,反過來,搞軟件研發的人也應該聯合起來,這樣你們的保護才能不斷的完善。采用高難度算法,如果想在算法上更勝一籌就得換成不可逆算法,讓破解者找不到頭緒。如同走迷宮,我介紹一種方法,不是CRC,因為我是應試教育的受害者,本人數學只會解方程。如果把方程應用到算法中會很有效。比如
設注冊碼為:X,Y兩部分,
x,y的運算過程是:x,y是方程組:
2 3
X Y - X -331 Y =19 編程后為:X*X*Y- X*X*X-331*Y=19
2 2
X Y -X -1312 Y =38
的兩根,把你的注冊碼兩部分經過代入方程組中檢驗,這樣破解者推出方程,根本解不出來。
他累死也不會想到 X=26 Y=51,其它值均錯誤。既你的注冊碼前一部分是26,后一部分是
51,這樣看起來好象並沒有多大作用,但是x,y並不完全是固定的數字,可以是你的注冊碼每一位字母或數字的ascii碼相加之和,經過四則運算,再減去一個數的結果。最后x,y的值可以不超過百位數,x,y也就可以按你的需要賦值了。像這樣的方程我這里要多少有多少,保證X,Y解全都不一樣,當然只是舉一個很簡單的例子,
真正要去編寫是不會寫這樣簡單的流程,我願意無償為你提供
多種方程組均帶唯一解X,Y值。(本人qq389004625)魯迅先生說過:世上本沒有路,走的人多了也便成了
路,軟件本沒有算法,研究的人多了,也便成了算法。
或者換個思路,使用指紋或"DNA"識別系統,筆記本電腦很多采用了開機指紋識別,所以小偷盜走,因為沒有指紋
密碼等於得到一盒廢鐵。銀行的保險櫃,有一部分也是采用指紋的,即使有匪徒進入,得不到指紋對應,也會一無所獲,軟件中也應該加入這樣的信息,你的軟件只能用特定的指紋
識別,並且指紋隨機產生,可以設想,安裝上會麻煩一些,第一次運行程序提示你掃描指紋。使用者要有掃描儀,指紋在軟件內部隨機產生,第一次使用軟件,提示注冊用的指紋都不一樣,而這個指紋的計算規律作者知道,作者計算出指紋,從指紋庫中復制一個發送給需要者,軟件每次重新安裝都會提示輸入不同的指紋,並且軟件綁定計算機的硬件。軟件中加入類似CIH的破壞"基因",三次掃描指紋錯誤,軟件自動重啟電腦並直接破壞硬盤引導分區,改寫分區表,破壞零磁道,改寫G-list,向firmware全部模塊中寫入錯誤信息。這樣硬盤數據全部丟失,或被完全破壞,在BIOS中顯示為0.只有找你才能解決,本人是搞數據恢復的,經常做破壞和修復硬盤的測試,對破壞硬盤數據比較在行。就像你把手機重重扔在地上讓它碎了很容易,再想修好它太不容易了。這也是沒有辦法,只能用對付強盜的辦法,免得破解者拿了你的軟件翻來覆去地研究。如果遇到這方面的故障我可以幫你們恢復數據,之前我都已測試過,有恢復成功的可能。視恢復程度收取費用了。
如果以上幾種方法都做了,所有能想到的辦法都用了,仍然沒有辦法阻止自己的軟件被破解,那只好
使用“絕招”了,改行,另謀高就。現在競爭很激烈,利潤空間降到了最低點。只靠一種行業養活自己是不行的,破產了,倒閉了之類的事情也都看到過發生過。所以軟件同行們,你們也得抓緊時間多學習些其它的技能,或者像我
一樣把軟件當兼職來做,要不然哪一天你自己的共享軟件到了你無力支撐下去的時候,你會選擇什么呢?
(大家應該懂什么叫思路吧,思路不是指具體的做法。)