FairStars Recorder 分析
Ty1921
------------------------------------------------------------------------
1,PEID --> ASPack 2.12 -> Alexey Solodovnikov,因爲是SMC,不脫殼。脫殼的話ESP定律再ImpREC簡單修復即可。
2,表現:先出現主窗口,後出現註冊窗口,有錯誤PN提示,ABOUT顯示未註冊版本,功能限制暫未嘗試
3,關注:
(1)如果有註冊碼,會放在什麼地方,該如何下斷
(2)註冊判斷在主窗口初始化之後還是之前
(3)會不會出現干擾聲音的暗樁,猜測是不是加入一段沒有規律的聲音跟原來的聲音數據相與
4,先註冊次,發現註冊信息沒有被清空,N大教程上指明瞭這裏是個漏洞,於是轉到OD,ALT+M打開內存,再按CTRL+B搜索,先用ASCII搜索沒有找到,再換用unicode搜索,成功找到:
0016A658 74 00 79 00 31 00 39 00 32 00 31 00 00 t.y.1.9.2.1..
下硬件訪問斷點,之前沒看最新的視頻,所以這種方法沒跟進,暫略....
5,OD載入,常規下斷 bp GetPrivateProfileStringA,bp RegQueryValueA,程序運行後沒有斷下,要麼API使用錯誤,要麼根本沒生成文件,對方判斷不存在,自然不去讀取
6,除SendMessage,UpdateWindow和Create打頭的API外,其餘全部下斷(API斷點設置工具),如果切換到註冊窗口被斷下時,取消該斷點並F9運行,依次類推
點擊Register註冊,被ShowWindow斷下。
代碼:
00116C24 77D4DACD /CALL 到 ShowWindow 來自 comctl32.77D4DAC7
00116C28 005A09DC |hWnd = 005A09DC (class='tooltips_class32',parent=002105EC)
00116C2C 00000000 /ShowState = SW_HIDE
取消該斷點,繼續F9運行,斷在MessageBoxW
代碼:
00116A40 78316909 /CALL 到 MessageBoxW 來自 mfc80u.78316903
00116A44 002105EC |hOwner = 002105EC ('Registration',class='#32770',parent=004C0606)
00116A48 005191B8 |Text = "Registration Number Incorrect!"
00116A4C 010E1490 |Title = "Recorder"
00116A50 00000030 /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
7,向上跟蹤,來到
代碼:
00420DB0 56 PUSH ESI
00420DB1 8BF1 MOV ESI,ECX
00420DB3 E8 08FEFFFF CALL 00420BC0 ; 彈出消息在該CALL內,跟進
00420DB8 85C0 TEST EAX,EAX
00420DBA 74 08 JE SHORT 00420DC4
00420DBC 8BCE MOV ECX,ESI
00420DBE 5E POP ESI
00420DBF E9 A8B60500 JMP 0047C46C ; JMP to mfc80u.#4729
00420DC4 5E POP ESI
00420DC5 C3 RETN
8,在00420BC0處按CTRL+F8(這是個很實惠的方法,可以讓你鍵盤的F8長命百歲),不多時就彈出了對話框,來到:
代碼:
00420C8B FF15 8C675100 CALL DWORD PTR DS:[51678C] ; mfc80u.#2896
00420C91 83F8 01 CMP EAX,1 ; 判斷SN長度是否爲16位
........
00420C9A 68 2C925100 PUSH 0051922C ; UNICODE "UserName Error!"
........
00420CC2 83F8 08 CMP EAX,8 ; 判斷PN是否爲8位
........
00420D03 83F8 10 CMP EAX,10 ; 判斷SN是否爲16位
00420D06 0F85 8A000000 JNZ 00420D96
00420D0C E8 6DB70500 CALL 0047C47E ; JMP to mfc80u.#1079
00420D11 8B40 04 MOV EAX,DWORD PTR DS:[EAX+4] ; 關注該地址
00420D14 8B68 20 MOV EBP,DWORD PTR DS:[EAX+20]
00420D17 8D86 D0070000 LEA EAX,DWORD PTR DS:[ESI+7D0]
00420D1D 50 PUSH EAX
00420D1E 8D8D 10340100 LEA ECX,DWORD PTR SS:[EBP+13410]
00420D24 FF15 98675100 CALL DWORD PTR DS:[516798] ; mfc80u.#774
00420D2A 53 PUSH EBX
00420D2B 8D8D 14340100 LEA ECX,DWORD PTR SS:[EBP+13414]
00420D31 FF15 98675100 CALL DWORD PTR DS:[516798] ; mfc80u.#774
00420D37 57 PUSH EDI
00420D38 8D8D 18340100 LEA ECX,DWORD PTR SS:[EBP+13418]
00420D3E FF15 98675100 CALL DWORD PTR DS:[516798] ; 執行該CALL三次
00420D44 8BCD MOV ECX,EBP
00420D46 E8 152B0200 CALL 00443860 ; 關鍵CALL,AL
00420D4B 84C0 TEST AL,AL
00420D4D 74 39 JE SHORT 00420D88 ; 跳向失敗
00420D4F 8BCE MOV ECX,ESI
00420D51 E8 6AF9FFFF CALL 004206C0
00420D56 6A 00 PUSH 0
00420D58 6A 00 PUSH 0
00420D5A 68 0C925100 PUSH 0051920C ; UNICODE "Registered OK!"
00420D5F E8 F4B20500 CALL 0047C058 ; JMP to mfc80u.#1118
9,先進入該關鍵CALL看下(選定該行回車,或者CTRL+G 輸入地址00443860):
代碼:
00443860 53 PUSH EBX
........
0044386D FF15 8C675100 CALL DWORD PTR DS:[51678C] ; 取長度
00443873 83F8 10 CMP EAX,10
00443876 75 69 JNZ SHORT 004438E1 ; 清0,SN位數錯誤
00443878 8DBE 14340100 LEA EDI,DWORD PTR DS:[ESI+13414]
0044387E 8BCF MOV ECX,EDI
00443880 FF15 8C675100 CALL DWORD PTR DS:[51678C] ; 51678c,取長度
00443886 83F8 08 CMP EAX,8
00443889 75 56 JNZ SHORT 004438E1 ; 清0,PN位數錯誤
0044388B 8BCE MOV ECX,ESI
0044388D E8 6E62FFFF CALL 00439B00 ; 委瑣的黑名單比較
00443892 84C0 TEST AL,AL
00443894 74 1A JE SHORT 004438B0 ;
00443896 5F POP EDI
00443897 C786 08340100 0>MOV DWORD PTR DS:[ESI+13408],0
004438A1 C786 0C340100 0>MOV DWORD PTR DS:[ESI+1340C],1
004438AB 5E POP ESI
004438AC 32C0 XOR AL,AL
004438AE 5B POP EBX
004438AF C3 RETN
004438B0 8BCB MOV ECX,EBX
004438B2 FF15 4C695100 CALL DWORD PTR DS:[51694C] ; mfc80u.#3391
004438B8 50 PUSH EAX
004438B9 8BCF MOV ECX,EDI
004438BB FF15 4C695100 CALL DWORD PTR DS:[51694C] ; mfc80u.#3391
004438C1 50 PUSH EAX
004438C2 8BCE MOV ECX,ESI
004438C4 E8 173CFFFF CALL 004374E0 ; 關鍵CALL,AL
004438C9 84C0 TEST AL,AL
004438CB 74 14 JE SHORT 004438E1 ; 送0還是送的關鍵判斷
004438CD 33C0 XOR EAX,EAX ; 清0
004438CF 5F POP EDI
004438D0 8986 08340100 MOV DWORD PTR DS:[ESI+13408],EAX ; 將AL=0傳給標誌位1
004438D6 8986 0C340100 MOV DWORD PTR DS:[ESI+1340C],EAX ; 將AL=0傳給標誌位2
004438DC 5E POP ESI
004438DD B0 01 MOV AL,1
004438DF 5B POP EBX
004438E0 C3 RETN
004438E1 B8 01000000 MOV EAX,1
004438E6 5F POP EDI
004438E7 8986 0C340100 MOV DWORD PTR DS:[ESI+1340C],EAX ; 將AL=1傳給標誌位1
004438ED 8986 08340100 MOV DWORD PTR DS:[ESI+13408],EAX ; 將AL=1傳給標誌位2
004438F3 5E POP ESI
004438F4 32C0 XOR AL,AL ; 清0操作
004438F6 5B POP EBX
004438F7 C3 RETN
10,跟蹤上面的關鍵call,因爲只看返回的AL,來到段尾的這個的地方,也就是爆破點:
代碼:
004378A8 75 09 JNZ SHORT 004378B3 ; 可以改爲jnz 4378aa跳到下一行
004378AA E8 C1660100 CALL 0044DF70
004378AF B0 01 MOV AL,1
004378B1 EB 0D JMP SHORT 004378C0
004378B3 89B7 0C340100 MOV DWORD PTR DS:[EDI+1340C],ESI
004378B9 E8 B2660100 CALL 0044DF70
004378BE 32C0 XOR AL,AL ; 可以改成inc al
11,SMC
找區段很是鬱悶,很久不做都忘了怎麼操作,加上系統快崩潰,偶爾冒個不相干的錯誤,真是無語。
topo感覺不如pe-tool好用,起碼後者在加了區段之後能正常運行。
ESP,來到:
代碼:
0071840B /75 08 jnz short Recorder.00718415 ; 可在此修改爲跳轉到SMC代碼處 JMP 745000
0071840D |B8 01000000 mov eax,1
00718412 |C2 0C00 retn 0C
00718415 /68 81CC4700 push Recorder.0047CC81 ; 修改這裏當然也是可行的,只要注意不覆蓋RETN下面的指令
0071841A C3 retn ; 返回到OEP
以下任意一個可行:
mov byte ptr ds:[4378a9],00
mov byte ptr ds:[4378be],0fe
相關實現代碼:
代碼:
00745000 C605 A9784300 0>mov byte ptr ds:[4378A9],0
00745007 C605 BE784300 F>mov byte ptr ds:[4378BE],0FE
0074500E 68 81CC4700 push Recorder.0047CC81 ; 恢復殼中的代碼,因爲之前的jnz被改成jmp之後,覆蓋了下面的指令
00745013 - C3 ret ; 返回OEP
上面代碼的二進制複製:
C6 05 A9 78 43 00 00 C6 05 BE 78 43 00 FE 68 81 CC 47 00 C3
12,資料和引用
SMC奧義:
1、找到跳向OEP的跳轉,修改爲JMP SMC代碼 2、確定OEP地址 3、找空代碼位置 4、確定怎麼修改能達成破解 ——月之精靈
一般要在殼中找空白的空間,可以先從殼所在段未尾找。
在需要patch地方下斷,仔細比對F9運行前後該段是否有變化,沒有變化就能用了。 ——hflywolf
代碼段的末尾向上找空白的地方,最好在.data段的最後或者把所有段的屬性加上可執行可寫,這樣就隨便找空白都可以 ——shoooo
luocong.com/articles/show_article.asp?Article_ID=18 ——老羅
SMC技術破解一般適應1~3層壓縮保護,如果軟件被殼多層保護,使用SMC技術會非常麻煩,不如脫殼解密來得快。 ——匿名
原文地址, http://bbs.chinapyg.com/viewthread.php?tid=51802&extra=page%3D1 個人博客轉載 。