《加密與解密》筆記五(一)

1:

1:

序列號保護機制一般情況下,我們所使用一個程序如果是要付費的話最常見的方法應該就是使用一個序列號即可,那麼這個序列號總是明着(暗着)會提供一個(幾個)特殊信息來對其特殊轉換最終呈現爲一個用於交易的註冊碼(這裏的信息就是類似於用戶名密碼,或者是單純的用戶名,甚至是我們唯一的硬件上的識別碼)一般的驗證情況有以下幾種:
這裏寫圖片描述
這個方法就是把用戶輸入的註冊碼和此時返回得註冊碼做比較的,同時這個也可以是一個編寫註冊碼的方法,先討論爲驗證註冊的情況
這裏寫圖片描述
這種的話是比較不安全的一種方法,因爲此時我們的序列號是一個明顯的值(可能是字符串或是某個變量,此時這些信息都是在內存裏面,或者是寄存器eax等,都是可以直接得到的)
我們現在討論一下F爲編寫註冊碼的方法但是要求此時保證了函數F可逆,那麼就會有:這樣子的形式,此時就會相對安全一些,但是由於可逆,所以我們可以直接對F-1做分析直接得到一個註冊機,或者是我們直接用一個用戶名來窮舉註冊碼,這樣子會很花費時間,其實最簡單的方法就是隨機註冊碼然後直接使用返回的用戶名爲自己的用戶名就可以了。
上面這兩個方法的推廣可以是:
這裏寫圖片描述
這個方法破解的方法也和上面的類似
另外的方法:
這裏寫圖片描述
這種的話對於寫一個註冊機就會有一點難度但是對於破解,我們可以直接對那個特定值做修改,讓它永遠都是那個特定值而不進行驗證。

2:

對於一個註冊類程序我們的破解方法一般簡單一點的就是對一下函數下斷:
找獲取輸入窗口的值的函數:

GetDlgItemText()
GetDlgItemInt()
hemecpy()//這個函數是9x和ME的版本的萬能斷點,因爲這裏設計到了32位函數轉16位的一個內存拷貝

還有彈出註冊成功窗口的函數:

MessageBox()
DialogBoxParam()
CreateDialogIndirectParam()
MessageBoxIndirect()

或者是創建文件的函數(將註冊信息保存在本地磁盤內的)

RegQueryValue()
GetPrivatePorfileString()
GetPrivatePorfileInt()
GetPrivateInt()
CreateFile()
_lopen()

(以上函數的A,W,參數均未表示)
還有一個書上說的比較牛逼的一個“數據約束性”這個意思大概就是在我們輸入了用戶名和序列號以後會在這個假的序列號的大概加減90H左右的區域出現(這個性質並不是對所有的驗證方式都有效,只限於明文比較(就是會把真的註冊碼自己計算出來然後存在內存中和我們的的註冊碼比較的方式))

3:

在我們做比較的時候如何獲取到要比較函數的位置呢?
第一點就是對上面那些函數下斷
第二就是對相應的窗口過程的消息下斷(鼠標按鍵之類的(WM_LBUTTONDOWN)等)
第三就是讓它彈出錯誤消息的消息框,然後查找相應的註釋的ASCII(UNICODE)碼就可以
然後我們可以在這些彈出錯誤提示的彈窗上面找到相關的跳轉目的地址,然後就可以返回去猜測大概的驗證函數是什麼,然後就可以求逆了。

2:

Nag窗口
這個窗口就是在某些特定操作或者運行某一段時間以後彈出的窗口我們可以對通常彈出窗口的函數下斷(上面有寫就不在這寫了)然後找到調用這個窗口的返回的地址然後把這個顯示的函數跳過或者NOP就好。
當然還可能會出現書上的一個比較變態的例子:主程序就是從這個窗口裏面啓動的,書上 給了兩個解決方法,這裏總結一下:

1:

我們直接在調用之初就直接調用創建主程序窗口的位置就好。

2:

對於用資源管理器拖出來的窗口我們可以直接修改調用參數。

3:

對於很多程序都有一個時限性,就是可以試用這個程序多長時間,這一段筆記就記錄了這個計時器的實現方法和某些破解的方法:
我們用到的獲取時間的API主要爲:

SetTimer()
GetTickCount()
time()
temeGetTime()

對於第一個API這個API每進行一次時間計數器歸零就會對窗口過程發送一個WM_TIMER消息,此時我們可以對這個消息下斷然後看看在這個消息內所發生的不可描述的事情,然後做相關處理。
對於一些有時限的程序通常的方法就是將第一次運行的時間和退出時的時間保存到磁盤,註冊表但是單單保存一份可能會被一些檢測軟件察覺,此時我們應該分隨機時段多隨機保留記錄幾個,爲什麼保存最後一次退出時的時間,這個是爲了防止有的人把系統時間改爲之前的時間。
還有,如果要防範別人對以上時間函數下斷,我們可以直接獲取一些修改頻繁的系統文件的時間(user.dat,system.dat等)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章