揭露AMR隱私 - OD 手脫帶 KEY 的 ARM 程序

標 題: 【原創】揭露AMR隱私 - OD 手脫帶 KEY 的 ARM 程序
作 者: RegKiller
時 間: 2006-03-26,13:52
鏈 接: [url]http://bbs.pediy.com/showthread.php?t=23174[/url]
【脫殼作者】 剎那恍惚
【作者郵箱】 [email][email protected][/email]
【使用工具】 OllyDBG ,LordPE,ImportREC,PEiD v0.94
【脫殼平臺】 WinXP SP2
【軟件名稱】 Win98 記事本
【軟件大小】 568 KB
【保護選項】 Standard protection only 僅僅標准保護 + KEY 保護 (單進程)
【加殼方式】 Armadillo v4.40
【脫殼聲明】 我是一隻小菜鳥,偶得一點心得,願與大家分享:)
--------------------------------------------------------------------------------
【脫殼內容】
關於 ARM 帶 KEY 的問題 N 多人問過了。再次解答一次,首先我們必須有一個可用的 KEY 否則程序是無法解碼的(前輩的話,我只是站了一下他們的肩膀.嘿嘿),對於 ARM 我瞭解甚少,我的理解是如果你的程序無 KEY 的話就好像你有個 RAR 卻沒密碼無法解壓一樣。又有人要說 RAR 可以窮舉了,拜託,我加 RAR 密碼從來都是中文做密碼,你舉出來的話可以發一份給我做紀念。呵呵。跑題了沒?跑了大家記得把我叫回來。OK。我們繼續,首先我們要弄個可用的 KEY,然後替換我們的機器指紋爲可用 KEY 的機器指紋,註冊正確之後開始脫殼基本上就跟沒脫沒 KEY 的 ARM 完全相同了。下面是這個程序的一個可用 KEY 是我用 ARM 在另一臺機器上加殼的。

Hardware fingerprint: 5F48-DD41
Name: RegKiller
Key: 00001K-VKY502-J4WZFV-GXFK3Z-KD82T6-C0K6UK-6PCH59-WUAZP9-EX7HGD-4K9KVF-W0CRJZ
一、準備工作
偵殼:用PEiD查殼 Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks
老規矩設置Ollydbg忽略所有異常,用IsDebug 1.4插件去掉Ollydbg的調試器標誌。
OD 載入
Shift+F9 運行,直到程序提示:This program requires a security key. If you have one, select OK to enter it. After entering a valid key, you will not be prompted again.
按 OK 按鈕讓程序彈出輸入 KEY 的對話框,記下你自己的 Hardware fingerprint(我這裏是 Hardware fingerprint: 0073-3907 這個值一會要用) 然後回到 OD下 he GetDlgItem 斷點後回到程序隨便輸入一個名字和 KEY 後按 OK 按鈕。斷下後看堆棧提示
00128088   00C244FC  /CALL 到 GetDlgItem 來自 00C244FA
0012808C   000607F0  |hWnd = 000607F0 ('Enter Key',class='#32770')
00128090   00000407  \ControlID = 407 (1031.)
ALT+F9 返回程序領空
00C244FC    85C0            TEST EAX,EAX                             ; 返回到此處
00C244FE    74 33           JE SHORT 00C24533
此時你可以找這段代碼的開始處下硬件執行斷點然後 Ctrl+F2 重載程序再分析。
這裏我就不這麼做了。刪除剛纔的硬件斷點,向下找到這段代碼
00C2467D   /0F84 B7000000   JE 00C2473A
00C24683   |53              PUSH EBX
00C24684   |B9 98FAC300     MOV ECX,0C3FA98
00C24689   |E8 253CFEFF     CALL 00C082B3                            ; 右鍵跟隨
00C2468E   |53              PUSH EBX
00C2468F   |B9 98FAC300     MOV ECX,0C3FA98
00C24694   |8945 08         MOV DWORD PTR SS:[EBP+8],EAX
00C24697   |E8 353CFEFF     CALL 00C082D1
00C2469C   |837D 14 01      CMP DWORD PTR SS:[EBP+14],1
00C246A0   |75 27           JNZ SHORT 00C246C9
00C246A2   |8B45 08         MOV EAX,DWORD PTR SS:[EBP+8]
00C246A5   |8BC8            MOV ECX,EAX
00C246A7   |81E1 FFFF0000   AND ECX,0FFFF
00C246AD   |C1E8 10         SHR EAX,10
00C246B0   |51              PUSH ECX
00C246B1   |50              PUSH EAX
00C246B2   |8D85 00FFFFFF   LEA EAX,DWORD PTR SS:[EBP-100]
00C246B8   |68 C496C300     PUSH 0C396C4                             ; ASCII "%04X-%04X"
00C246BD   |50              PUSH EAX
00C246BE   |FF15 1063C300   CALL DWORD PTR DS:[C36310]               ; msvcrt.sprintf
ASCII "%04X-%04X" 這個是誰?小誰家那小誰嘛,呵呵。向上看.我們再 00C24689 處的 CALL 右鍵跟隨(也就是進入這個 CALL)來到下面代碼處
00C082B3    56              PUSH ESI                                 ; 來到此處
00C082B4    8BF1            MOV ESI,ECX
00C082B6    FF7424 08       PUSH DWORD PTR SS:[ESP+8]
00C082BA    8B8E 5C060000   MOV ECX,DWORD PTR DS:[ESI+65C]
00C082C0    6A 00           PUSH 0
00C082C2    E8 24D70000     CALL 00C159EB                            ; 右鍵跟隨
00C082C7    3386 5C200000   XOR EAX,DWORD PTR DS:[ESI+205C]          ; 問題 1 下面解答
00C082CD    5E              POP ESI
00C082CE    C2 0400         RETN 4
這裏有 2 種方式(我測試了2個帶KEY的ARM殼,所以我只碰到了2種方式。一會說明)
我們繼續在 00C082C2 處的 CALL 右鍵跟隨來到下面代碼處
00C159EB    8B4424 04       MOV EAX,DWORD PTR SS:[ESP+4]
00C159EF    C1E0 06         SHL EAX,6
00C159F2    034424 08       ADD EAX,DWORD PTR SS:[ESP+8]
00C159F6    8B4481 18       MOV EAX,DWORD PTR DS:[ECX+EAX*4+18]
00C159FA    35 8AC0E665     XOR EAX,65E6C08A
00C159FF    C2 0800         RETN 8                                   ; 在此設置個斷點
現在在 00C159FF 上設置一個硬件執行斷點,然後 Ctrl+F2 重載程序並 SHIFT+F9 執行.斷下後注意看 EAX 的值,我這裏是 00733907,這個是什麼?不就是剛纔的 0073-3907 機器指紋嗎?現在你應該知道怎麼做了吧 ? 找個空白地方寫個補丁代碼就可以了。我這裏用 OD 的動態分配內存插件分配個空間寫個補丁.我得到的地址是 30000000 . 補丁代碼入下,你也可以直接找個地方寫代碼而不用插件分配內存。
原代碼:
00C159FA    35 8AC0E665     XOR EAX,65E6C08A
補丁代碼:
00C159FA  - E9 01A63E2F     JMP 30000000
注意當前的 EIP 是 00C159FF .我們把 EIP 重新定位到 00C159FA 處後 F8 一次就來到我們要寫修改指紋的空間了。寫下如下代碼
30000000    35 8AC0E665     XOR EAX,65E6C08A                         ; 恢復原來的代碼
30000005    3D 07397300     CMP EAX,733907                           ; 判斷當前是否是機器指紋 0073-3907
3000000A    75 05           JNZ SHORT 30000011                       ; 不是跳走
3000000C    B8 41DD485F     MOV EAX,5F48DD41                         ; 替換成可用 KEY 的指紋 5F48-DD41
30000011    C2 0800         RETN 8                                   ; 原來的代碼
改好後 SHIFT+F9 然後輸入 KEY.就能看到正確提示了:Key is valid, and has been stored.確定後就可以按照無 KEY 的 ARM 脫殼了。
關於剛纔的問題 1 現在解答一下,那個地方其實也是個 ARM KEY 斷點的好地方,不過 ARM 的 KEY 分幾種,簡單說下,本例子是個長的 KEY.還有種比較短的 KEY ,當你遇到短 KEY 的時候根據下面的方法下斷打補丁.
長 KEY 的時候在這裏開始補丁.
XOR EAX,65E6C08A
RETN 8
短 KEY 的時候在上面的 RENT 8 返回後會來到下面這個地方。
00C082C7    3386 5C200000   XOR EAX,DWORD PTR DS:[ESI+205C]          ; 問題 1 下面解答
00C082CD    5E              POP ESI
00C082CE    C2 0400         RETN 4
F8 單步走過 00C082C7 後再看 EAX 的值就是你的本機指紋了,補丁方法跟上面相同,不多說了。
--------------------------------------------------------------------------------
【脫殼總結】
本問沒什麼技術含量,如有錯誤之處請各位賜教。
--------------------------------------------------------------------------------
【版權聲明】 本文純屬技術交流, 轉載請註明作者並保持文章的完整, 謝謝!

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