智倫報關係統人

看雪資料發表於2015-11-15

一個VF程式的破解---智倫報關係統
目標軟體:  智倫報關係統
軟體大小:  7.54 MB
軟體性質:  商業軟體
應用平臺:  Win9x/NT/2000/XP
軟體介紹:  海關報關軟體,能用10,10天以後得註冊。
用工具:  fi,regsnap,unfoxall,uedit。
破解過程:  
1。先用fi查殼,沒殼,奇了,明明是VF,怎麼fi顯示VC5.0呢?
  用regsnap查,發現在system下多了幾個vf的控制元件。
2。用unfoxall反編輯程式,會有很多檔案產生,用windows的查詢包含文字“註冊號錯誤”,開啟對應的程式檔案,註冊演算法就在那裡!如果安裝了vf,開啟form表,查詢對應註冊視窗也可找到程式檔案。
3。分析其演算法
********
DIMENSION A_PASS( 13 )//註冊碼對應表
A_PASS = ''
M.ACT_PASS = ''//註冊碼對應表A_PASS=ABC0123456789
FOR I = 0 TO 2
   A_PASS( I + 1 ) = CHR(65 + I)//65為A的ascii碼,48為0的ascii碼
ENDFOR
FOR I = 0 TO 9
   A_PASS( 4 + I ) = CHR(48 + I)
ENDFOR
M.SYS_PASS = ALLTRIM(STR(100 * RAND(-1) + 10))//產生系統註冊號
M.SYS_PASS = M.SYS_PASS + ALLTRIM(STR(100 * RAND()))
M.SYS_PASS = M.SYS_PASS + ALLTRIM(STR(100 * RAND()))
M.SYS_PASS = M.SYS_PASS + ALLTRIM(STR(100 * RAND()))
M.SYS_PASS = M.SYS_PASS + ALLTRIM(STR(100 * RAND()))
M.SYS_PASS = 'Z' + PADR(ALLTRIM(M.SYS_PASS),10,'8')//在系統註冊號前加字元'Z'
******

M.ACT_PASS = 'Z'                           //真確註冊碼演算法
FOR I = 1 TO 10
   M.TMP_VAR = INT(I + VAL(SUBSTR(M.SYS_PASS,I + 1,1)) * 61.8 + 13.8)
   J = MOD(M.TMP_VAR,13) + 1
   M.ACT_PASS = M.ACT_PASS + A_PASS(J)
ENDFOR

**************
PROCEDURE VcontrolOk
PARAMETER P_OK
SELECT HMST50
IF P_OK = 1
   IF EMPTY(PO_DATE) .OR. EMPTY(PO_CMP) .OR. EMPTY(CUST_CNAME) .OR. EMPTY(CUST_CADDR) .OR.  ;
  EMPTY(CUST_TEL) .OR. EMPTY(CUST_FAX) .OR. EMPTY(CUST_EMAIL) .OR.  ;
  EMPTY(ZIP_CODE)
      DO LMSG WITH 'MSG<貴公司資料不完整,請檢查!>bmp<atten.bmp>time<08>'
      RETURN
   ENDIF
   IF M.REG_PASS <> M.ACT_PASS                                                  //註冊碼比較
      DO LMSG WITH 'MSG<註冊號錯誤!>bmp<atten.bmp>time<08>'
      RETURN .F.
   ENDIF
   M.LIMIT_DATE = EN(DTOC(DATE() + M.LLUSEDDAYS))
   M.W_TODAY = EN(DTOC(DATE()))
   DIMENSION A_DATA( 1 , 6 )
   A_DATA = ''
   M.DIR = SET('DEFAULT') + SYS(2003) + '\bmp'
   = ADIR(A_DATA,M.DIR,'D')
   IF EMPTY(A_DATA)
      DO LMSG WITH 'MSG<EMPTY a SYSTEM directory!>BMP<atten.bmp>'
      CANCEL
   ENDIF
   M.DIR_DATE = EN(DTOC(A_DATA(3)))
   M.DIR_TIME =  ;
        EN(IIF(EMPTY(AT(SPACE(1),A_DATA(4))),A_DATA(4),STUFF(A_DATA(4),AT(SPACE(1),A_DATA(4)),1,'0')))
   M.NOTE =  ;
        'lsatdltatdfdhftasfotrtelsidf989t-[o' + M.DIR_DATE + 'iropjidofdoidfj90,[z' +  ;
  M.LIMIT_DATE + 'z]93490583478kif(x' + M.DIR_TIME + 'x)jdukg{d' + M.W_TODAY +  ;
  'dfgdfo'
   SELECT HMST50
   M.W_DATE = DATE() + M.LLUSEDDAYS
   REPLACE DATE1 WITH M.W_DATE , DATE2 WITH DATE() , DATE3 WITH M.W_DATE , DATE4 WITH  ;
        DATE() , DATE5 WITH M.W_DATE , DATE6 WITH DATE() + M.LLUSEDCNT ,  ;
        UPD_DATE WITH DATE()
   REPLACE NOTE WITH M.NOTE
   DO LMSG WITH 'MSG<註冊成功!>bmp<atten.bmp>time<08>'
ELSE
   CLEAR READ
ENDIF
RETURN
ENDPROC
*------*
4。寫序號產生器
由於不懂vp,大概程式設計的思路還是看得懂的,把它翻譯成VC序號產生器就出來了
void CAbcDlg::OnButton1()
{
//              CString m_syspass,m_actpass;    //m_syspass為系統註冊號,m_actpass為實際註冊號
UpdateData(TRUE);
CString regpass("ABC0123456789");//註冊碼對應表
m_actpass="Z";
int i,j,temp;
for(i=0;i<(m_syspass.GetLength()-1);i++)
{
temp=(int)((i+1+(m_syspass.GetAt(i+1)-48)*61.8+13.8));
j=temp%13;
m_actpass=m_actpass+apass.GetAt(j);
}
UpdateData(FALSE);
}

相關文章