Cute Email Searcher2.2註冊過程分析
作者:Maomao[CCG]
下載:http://www.ftpeasy.com/
用FI分析,它用UPX1.06加殼,小意思,用Procdump脫殼成功!執行,螢幕一閃,自動退出了。看來還有校驗!用TRW直接載入原程式,藍色畫面!只好從脫好殼的程式入手了。
用TRW載入脫殼後的程式,一路F10,來到這裡時,出現程式介面:
0177:00492989 CALL `KERNEL32!GetModuleHandleA`
0177:0049298E PUSH EAX
0177:0049298F CALL NEAR [ESI+18] <----出現介面
0177:00492992 ADD ESP,BYTE +10
0177:00492995 PUSH EAX
0177:00492996 CALL 00491E58 <----到這裡就結束了
0177:0049299B POP ECX
0177:0049299C JMP SHORT 004929BF
在0177:0049298F設斷後跟進去,按F10一直來到這裡:
0177:004013BF MOV WORD [EBP-20],00
0177:004013B3 MOV EAX,[004A3698]
0177:004013B8 MOV EAX,[EAX]
0177:004013BA CALL 00453958 <----出現介面
0177:004013BF MOV WORD [EBP-20],00
0177:004013C5 JMP SHORT 004013E2 <----這裡返回就完了
再將0177:004013BA設斷,跟進去:
0177:004539D6 MOV EAX,[EBP-04]
0177:004539D9 CALL 004537C4
0177:004539DE MOV EAX,[EBP-04]
0177:004539E1 CMP BYTE [EAX+84],00
0177:004539E8 JZ 004539D6
<----判斷
0177:004539EA XOR EAX,EAX
0177:004539EC POP EDX
上面這段是對程式本本身和程式事件進行檢測,其中0177:004539E8的判斷會在第三次執行和程式退出時不跳,程式會退出。跟進0177:004539D9的call:
0177:004537C4 PUSH EBX
0177:004537C5 ADD ESP,BYTE -1C
0177:004537C8 MOV EBX,EAX
0177:004537CA MOV EDX,ESP
0177:004537CC MOV EAX,EBX
0177:004537CE CALL 0045372C <-----修改標誌的call
0177:004537D3 TEST AL,AL
0177:004537D5 JNZ 004537E0
0177:004537D7 MOV EDX,ESP
0177:004537D9 MOV EAX,EBX
0177:004537DB CALL 00453F48
0177:004537E0 ADD ESP,BYTE +1C
0177:004537E3 POP EBX
0177:004537E4 RET
再跟進去,F10一會兒來到這裡:
0177:0045373F CALL `USER32!PeekMessageA`
0177:00453744 TEST EAX,EAX
0177:00453746 JZ 004537BD
0177:00453748 MOV BL,01
0177:0045374A CMP DWORD [EDI+04],BYTE +12 <-----12是退出標誌
0177:0045374E JZ 004537B6
<-----跳走就退出程式了
我們的目的在於分析程式的註冊演算法,如果要暴破,可以分析0177:0045373F CALL `USER32!PeekMessageA`為什麼會送退出程式的訊息到標誌位。這裡,將0177:0045374E
JZ 004537B6 改為兩個nop,nop ,程式就可以執行了,不過有副作用,就是不能正常退出了(正確的退出資訊也被忽略了)。可以用ctrl+Alt+Del中止。現在,我們可以放心的使用TRW載入它,並分析它的註冊演算法了。
用TRW載入修改後的程式,註冊,輸入使用者名稱Maomao[CCG],註冊碼87654321,按確定,出現提示資訊,意思是請重新啟動後檢查註冊情況,看來是用KeyFile的方式或登錄檔方式註冊,啟動時檢查。
用FileMon和RegMon跟蹤程式,可以發現它在windows目錄中寫下了一個檔案ces.ini,開啟後發現有這樣的資訊:
[options]
ym=87654321
ymuser=Maomao[CCG]
一般KeyFile的註冊要讀檔案,要用到下列常用的函式:
ReadFile、CreateFile、GetFileAttributesA 等等,也有的用不常用的如_lopen等。這裡因為此檔案在windows目錄,可能會用到讀windows目錄的函式GetWindowsDirectoryA,在TRW中下bpx
GetWindowsDirectoryA,載入程式,中斷後,pmodule會來到這裡:
0177:00401BB5 CALL `KERNEL32!GetWindowsDirectoryA`
0177:00401BBA MOV WORD [EBP-6C],14
0177:00401BC0 MOV EDX,00498606 <-----D EDX
可以看到ces.ini字樣
0177:00401BC5 LEA EAX,[EBP-18]
0177:00401BC8 CALL 004965C4
下面經過一長串的定位和讀的過程,我們按F10一直來到這裡:
0177:00401E29 MOV DWORD [EBP+FFFFFF74],00498628
0177:00401E33 MOV DWORD [EBP+FFFFFF6C],09C4
<-----放一個基數9c4到累加器
0177:00401E3D MOV DWORD [EBP+FFFFFF70],00
0177:00401E47 XOR EBX,EBX
0177:00401E49 XOR EAX,EAX
0177:00401E4B MOV [EBP+FFFFFF68],EAX
0177:00401E51 LEA EDX,[EBP+FFFFFA54]
0177:00401E57 MOV [EBP+FFFFFF64],EDX
0177:00401E5D JMP SHORT 00401EA5
0177:00401E5F XOR EDX,EDX
0177:00401E61 MOV EAX,[EBP+FFFFFF74]
<-----取字串"TangSe1980"
0177:00401E67 INC EAX
0177:00401E68 MOV ECX,[EBP+FFFFFF64]
<-----取機器號,我的為78030
0177:00401E6E MOVSX EBX,BYTE [ECX]
<-----取機器號第i字元
0177:00401E71 MOVSX ESI,BYTE [EAX]
<-----取字串第i+1字元
0177:00401E74 MOVSX EDI,BYTE [EAX-01]
<-----取字串第i字元
0177:00401E78 ADD ESI,EDI
<-----兩字元相加
0177:00401E7A IMUL ESI,EBX
<-----與第i機器號相乘
0177:00401E7D MOV EBX,ESI
0177:00401E7F ADD EDX,BYTE +02
0177:00401E82 ADD EAX,BYTE +02
0177:00401E85 CMP EDX,BYTE +05
<-----字串取過5位?
(只有與字串5、6位的運算結果才會被儲存 )
0177:00401E88 JL 00401E6E
0177:00401E8A MOV EAX,EBX
<-----是則保留這一次結果
0177:00401E8C CDQ
0177:00401E8D ADD [EBP+FFFFFF6C],EAX
<-----與累加器相加
0177:00401E93 ADC [EBP+FFFFFF70],EDX
0177:00401E99 INC DWORD [EBP+FFFFFF68]
0177:00401E9F INC DWORD [EBP+FFFFFF64]
0177:00401EA5 LEA ECX,[EBP+FFFFFA54]
0177:00401EAB PUSH ECX
0177:00401EAC CALL 0048C828
0177:00401EB1 POP ECX
0177:00401EB2 CMP EAX,[EBP+FFFFFF68]
0177:00401EB8 JA 00401E5F
<-----取下一位機器號
這就是它的註冊演算法!
這段程式完全什麼樣的功能呢?取機器號的每一位與特徵字串"TangSe1980"的第5、6位的和相乘,再累加,最後的結果再與基數0X9C4相加得到註冊碼。
下面的程式是讀上次輸入的使用者名稱和註冊碼,分析發現,使用者名稱不參與運算,輸入的註冊碼與上面的計算的結果進行比較!看來與正確的註冊碼與使用者名稱無關。
而且還有一個奇怪的發現,測試了三臺不同的機器,機器碼是一樣的!都是78030!不知道是不是所有的機器碼都是78030呀?呵呵:)
好,了,編一個簡單的序號產生器應該沒問題了吧。
收工~~~