Aladdin HASP SRM(AES-128)加密狗破解經驗分享
這個教程不想談太多的技術(主要是我對[脫殼破解]還是處在初級爆破階段),只想和大家分享一些破解過程,有些過程已經有些忘記,大家湊合看吧。 因為自己是程式設計師,真是非常熱愛這個行業,正因為熱愛,所以對各方面的技術也都感興趣,黑客入侵、木馬、外掛、破解都幹過,主要是當初所謂的成就感和來自別人崇拜的目光吧,但是因為自己主要是平時沒事玩一玩,對一些軟體自己動手破解後用著舒服一些,也沒有加入過任何的組織(主要也是水平確實不夠), 所以在幾個方面始終都沒有步入很深入的層次,最近加入吾愛,主要也是因為破解這個加密狗的原因,同時也是想自己能夠在這個領域再提高一些,希望得到大家的指教。 好了,步入正題吧,朋友問我一個軟體能否破解去掉狗,因為我對狗實際的破解經驗不多,所以我只能說試試看吧,軟體名字這裡就不說了。 1:執行 拿到一個軟體肯定是先執行看看嘍(未插加密狗) 報錯:
[C++] 純文字檢視 複製程式碼
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 |
|
同時寫了HASP API函式:
[C++] 純文字檢視 複製程式碼
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
|
這是找到的每個API地址,這部分也是大費周折(開發的SDK API和這個程式使用的API版本不同,沒辦法完全匹配)
[C++] 純文字檢視 複製程式碼
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
|
6).HOOK時機: 上述已經找到了每個API的地址,但何時進行HOOK,這裡通過測試,發現程式在使用GetProcAddress呼叫某個API後而且沿未呼叫hasp_login時程式碼是解密的,因為我要hook某個地址時可以預先判斷程式碼是否匹配,所以最後索性在截獲的GetProcAddress中直接呼叫HookHaspAPI_Begin(),直接某個時刻成功為止:
[C++] 純文字檢視 複製程式碼
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
7).分析截獲的資料: 通過資料截獲分析,最終發現呼叫hasp_login_scope成功後,就會反覆的呼叫hasp_decrypt去解密資料,每次去解密的資料大小都是16,輸入的資料是隨機的,但有2次解密的資料大小是32768,而且輸入的資料是固定的內含,當然解密後的資料也是固定的,這是API log. [ 1688]12:24:20.179 - ApiDebugger Loaded. [ 1688]12:24:20.211 - Process32Next, Rename "devenv.exe" to "crack.exe" [ 1688]12:24:20.215 - Process32Next, Rename "devenv.exe" to "crack.exe" [ 1688]12:24:20.246 - HASP API : hasp_login_scope hooked [ 1688]12:24:20.246 - HASP API : my_hasp_encrypt hooked [ 1688]12:24:20.247 - HASP API : my_hasp_decrypt hooked [ 1688]12:24:20.247 - HASP API : my_hasp_get_info hooked [ 1688]12:24:20.247 - HASP API : my_hasp_logout hooked [ 1688]12:24:20.248 - HASP API : Patch Address 0x0052B45B [ 1688]12:24:20.248 - HASP API : Patch Address 0x00591DFA [ 1688]12:24:20.250 - HASP API : Call hasp_login_scope(5476) [ 1688]12:24:20.252 - HASP API : Call hasp_decrypt(0x88888888, 0x0028F998, 16) [ 1688]12:24:20.255 - D : D67BF973E80CC4AF98D23FB8285FCB4A [ 1688]12:24:20.256 - HASP API : Call hasp_decrypt(0x88888888, 0x0028F998, 16) [ 1688]12:24:20.259 - D : 083E3F19B6527EB976CF7D18BBB80890 [ 1688]12:24:20.263 - HASP API : Call hasp_decrypt(0x88888888, 0x003A0000, 32768) [ 1688]12:24:20.267 - HASP API : Read data from "data.enc1.bin" [ 1688]12:24:20.270 - HASP API : Call hasp_decrypt(0x88888888, 0x003A0000, 32768) [ 1688]12:24:20.274 - HASP API : Read data from "data.enc2.bin" [ 1688]12:24:20.330 - HASP API : Call hasp_decrypt(0x88888888, 0x0028F91C, 16) [ 1688]12:24:20.333 - D : 3CE5A8C8DCC197E5C426D78A3CBFA846 [ 1688]12:24:21.393 - HASP API : Call hasp_logout() [ 1688]12:24:21.395 - ApiDebugger Unloaded. 根據這些重要資料進行分析,可以認為:16個位元組的資料解密純粹是為了校驗加密狗的合法性,32768的資料解密應該是對主程式的內容解密,因此之前以為不帶狗就能去破解是多麼的天真,如果不帶狗就能破解,這狗還有啥意思? 8).確定判斷地址: 現在我可以對hasp_decrypt函式在請求32768長度資料解密時返回固定的資料,但16位元組的校驗請求怎麼辦?這又是一個難題,因為你不知道演算法,如果你隨便返回資料程式就報錯. 這部分不細說了,主要是設定引數記憶體地址的訪問斷點,最終確定了有2處hasp_decrypt呼叫後資料驗證地址:
[Asm] 純文字檢視 複製程式碼
01 02 03 04 05 06 07 08 09 10 11 12 13 14 |
|
9).爆破方法: 嘗試了2種辦法,第一種是,我既然已經知道了返回資料與正確資料的判斷位置,完美的做法是,要檢查之前,把正確的資料複製到返回的資料地址:
[Asm] 純文字檢視 複製程式碼
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 |
|
程式碼寫好了,也要選擇插入位置,最終在記憶體找到了大片的90 90 90 90記憶體,然後在程式執行中動態的將程式碼寫入到這個位置,同時在原始碼處做了一個JMP語句. 完成後再執行程式,最終程式完美執行,這時候真的有一種想哭的感覺,心情豁然開朗! 成功破解後,又試了一種簡單的方案,直接Patch Code "CMP EAX,EDX" 為 "CMP EAX,EAX/CMP EDX,EDX"也是成功的。所以也就驗證了對於隨機解密後的資料僅僅是為了加密狗的校驗。 10).最終的my_hasp_decrypt函式: 隨著一步步的深入,搞明白了,核心API就是hasp_decrypt,最終hook的函式程式碼為:
[C++] 純文字檢視 複製程式碼
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
|
最後經過多次驗證,100%確信自己真的把這個狗給破解了,過程中經歷的艱辛和不眠立馬化為無有,都被最後的成功所淹沒,這種感覺妙不可言。 對於這個加密狗破解,是自己花費了最大力氣的一個(總歷時應該有100小時),雖然最終是API HOOK+爆破,程式碼僅Patch 2個節,但為了這個2個位元組確實經歷了太多,每個破解思路都失敗的時候也想過放棄,慶幸自己最終還是堅持了下來,贏取了勝利. 從這個過程中也發現自己在某些地方還非常的初級,尤其是演算法分析上面,只有能深入演算法分析,才能到達更高的層次,總是爆破不利於水平的提高,後面有時候會繼續對這個加密狗進行研究,爭取做到完美脫殼,將來再與大家分享。 PS:謝謝大家能看完,多提建議和意見,也希望熟悉這個加密狗的大牛和大神們也能分享這方面的經驗,能夠找到一種更簡單快速的破解方法。