1. 程式人生 > >軟體破解小記【轉】

軟體破解小記【轉】

最近突然對軟體破解起了興趣,主要是想在軟體加密上能夠有所提升。剛好舅舅最近追緊我要一個軟體的破解版本,我苦苦的在網上找到唯一的一個破解,還是有三十次的限制。(現在人,居然也可以以破解軟體為生了:)看來我研究這個還是有前途的:))

在萬般無賴下,決定自己來進行破解。這個決定其實對於最近的我來說,真可是一個大的挑戰--我已經很長時間沒有激情做新東西了。因此雖然滿懷喜歡,卻又有點懷疑能否完成。

破解的物件是一個財務軟體,名字叫XXXXX(我故意隱藏了產品的名稱)。其軟體是一個C/S結構的網路版軟體。軟體需要加密鎖的支援。如果加密鎖通過了,則顯示正版,否則是試用版。從演示看,軟體只有在啟動的時候檢測加密鎖(這告訴我們,加密點應該多點)。

有一個額外的條件在於,網上找來的破解是程式中一個動態連結庫(XXXXX.dll)的破解。這給我一個提示:我只要破解這個XXXXX.dll就可以了。網上的破解版由於加過殼,而我現在對於加殼的軟體如何破解更是不瞭解,因此目標轉向了原有的XXXXX.dll。使用W32DAsm開啟,發現各個輸出函式的定義及實現都可以發現,應此證明此Dll沒有被加密。

除錯二進位制程式,一般分靜態分析和動態除錯。靜態分析一般都使用W32Dasm來進行。通過W32Dasm可以很方便地定位到其輸出函式的起始位置。通過粗讀這些程式碼,發現幾個情況:

FindNetRockey

FindRockey

CheckNetRockey

CheckRockey

HaspLogin

HaspLogout

根據我的知識(我們公司也是用這些加密鎖),這些程式都是讀取加密鎖的函式。可是靜態分析之後,發現自己的能力有限,不能完全理解程式碼。不過這個過程中,複習了一下Win32彙編程式碼的知識,包括堆疊平衡和通過EAX返回值的方式。

經過同事推薦,我採用了OllyDbg來進行動態除錯(這是一個很正確的決定)。

一開始,我想直接除錯XXXXX.dll,我用OllyDbg直接開啟XXXXX.dll檔案,發現OllyDbg會自動使用LoadDll.exe來裝載此Dll。使用這個程式可以在沒有宿主程式的情況下,進行動態除錯,猜測函式的引數及返回值。不過我後來並沒有直接使用這個方法。

由於對OllyDbg動態除錯不是很瞭解,我想,除了破解XXXXX.dll,我如果破解了XXXXXClient.exe程式應該也可以的。不過XXXXXClient.exe是使用VB編寫的,彙編碼中有大量的VB的影子。

我第一要做的就是,定位到讀取加密鎖的函式入口。一開始,我採用單步跟蹤,發現太慢,而且也失去了耐心。後來想起,既然是Dll,那麼必然會呼叫LoadLibrary及GetProcAdress。那麼只要知道這個函式地址,說不定可以能快一點找到。

如何得到GetProcAdress的地址?我採用了Dependency,用Dependency開啟Ac990Client.dll,選擇Walk按鈕,可以在輸出Log中發現,在什麼時候呼叫了XXXXX.dll

我得到了函式地址A,在OllyDbg中,定位到A,確實定位到了LoadLibrary函式的呼叫處,另外,我發現在OllyDbg中,可以跟蹤進入其呼叫的Dll中。那麼如果我直接進入XXXXX.dll中設定斷點,是否可以進去呢?事實證明我的猜想是對的,這為我更快地得到結果奠定了基礎。應該說前面走了很多彎路。

通過一番地跟蹤,幾乎是在最後失望的情況下,我發現函式HaspLogin被呼叫的時候,函式本身只有兩個出口。其中一個返回前,做了Xor EAX, EAX(設定EAX為0),而另一個設定EAX為1。通過除錯發現,在沒有加密鎖的情況下,走了第一條路線,那麼如果是第二呢?我動態地設定了EAX為1,結果發現XXXXXClient.exe顯示正版的字樣!Great!

那麼下面就是如何修改程式了,很遺憾,我沒有發現OllyDbg怎麼修改編輯。想起同時推薦的HiView這個程式,在剛才發現的位置前,修改了幾個跳轉的地址(這段程式碼前必然有jne A0000753等字樣,只要跳轉到xor EAX,EAX處就可以了),另外我還將一處本來特耗時間的call改成了幾個nop的組合。儲存,測試!好了,總於成功了。

這是我第一次破解程式。本身沒什麼特別的大,只是讓我熟悉了很多相關軟體的使用,並較為完整地理解了破解的過程。以後還要繼續破解!