Cute Email Searcher2.2註冊過程分析 (5千字)

看雪資料發表於2001-11-18

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呀?呵呵:)
  好,了,編一個簡單的序號產生器應該沒問題了吧。
收工~~~

相關文章