軟件反破解的幾個思路

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.只有找你才能解決,本人是搞數據恢復的,經常做破壞和修復硬盤的測試,對破壞硬盤數據比較在行。就像你把手機重重扔在地上讓它碎了很容易,再想修好它太不容易了。這也是沒有辦法,只能用對付強盜的辦法,免得破解者拿了你的軟件翻來覆去地研究。如果遇到這方面的故障我可以幫你們恢復數據,之前我都已測試過,有恢復成功的可能。視恢復程度收取費用了。

如果以上幾種方法都做了,所有能想到的辦法都用了,仍然沒有辦法阻止自己的軟件被破解,那隻好
使用“絕招”了,改行,另謀高就。現在競爭很激烈,利潤空間降到了最低點。只靠一種行業養活自己是不行的,破產了,倒閉了之類的事情也都看到過發生過。所以軟件同行們,你們也得抓緊時間多學習些其它的技能,或者像我
一樣把軟件當兼職來做,要不然哪一天你自己的共享軟件到了你無力支撐下去的時候,你會選擇什麼呢?  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章