輕鬆試卷 V4.50 演算法分析 (5千字)

看雪資料發表於2002-01-03

ssljx 兄看過來,輕鬆試卷 V4.50 演算法分析,歡迎測試!歡迎寫序號產生器! :)

作者:PaulYoung
下載:http://www.hktk.com:8080/cgi-bin/dl.pl?url=ftp://ftp.cq.hktk.com/soft/soft_cai/eps.zip
簡介:可以在答案中插入圖片、物件等,編輯題目並把題目加入題庫,題庫管理、抽取試卷、分數統計,作業系統是教師的一個好幫手。
工具:SoftICE V4.05
日期:2001-12-23
__________________________________________________________________________________________

  (注意,這個軟體在不同的電腦看到的地址可能會不一樣。)

  真倒黴呀,竟然中了CIH,把我的可執行檔案全部破壞了,害我重灌……55555555……搞個演算法出出氣,嘻……嘻……

  老辦法,用 bpx hmemcpy 設斷並來到這裡……


015F:00407088  PUSH      EAX
015F:00407089  CALL      EBX        // F8 跟入
015F:0040708B  CMP      BYTE PTR [00578298],00
015F:00407092  JZ        004070A2

  來到……

015F:006D73E0  MOV      EAX,[ESP+0C]    //假註冊碼送 EAX
015F:006D73E4  MOV      ECX,[ESP+08]    //使用者名稱送  ECX
015F:006D73E8  MOV      EDX,[ESP+04]    //機器碼送  EDX
015F:006D73EC  PUSH      EAX            //假註冊碼入棧
015F:006D73ED  PUSH      ECX       //使用者名稱入棧
015F:006D73EE  PUSH      EDX       //機器碼入棧
015F:006D73EF  CALL      006D7310        //計算,F8跟入
015F:006D73F4  ADD      ESP,0C
015F:006D73F7  TEST      EAX,EAX
015F:006D73F9  JZ        006D7408

  來到……

015F:006D7310  SUB      ESP,10
015F:006D7313  PUSH      EBX
015F:006D7314  PUSH      EBP
015F:006D7315  PUSH      ESI
015F:006D7316  MOV      ESI,[ESP+20]
015F:006D731A  PUSH      EDI
015F:006D731B  MOV      EDI,ESI
015F:006D731D  OR        ECX,-01
015F:006D7320  XOR      EAX,EAX
015F:006D7322  REPNZ SCASB
015F:006D7324  MOV      EBP,[ESP+28]
015F:006D7328  NOT      ECX
015F:006D732A  DEC      ECX
015F:006D732B  MOV      EDI,EBP
015F:006D732D  MOV      EBX,ECX
015F:006D732F  OR        ECX,-01
015F:006D7332  REPNZ SCASB
015F:006D7334  MOV      EDI,[ESP+2C]
015F:006D7338  NOT      ECX
015F:006D733A  DEC      ECX
015F:006D733B  MOV      [ESP+24],ECX
015F:006D733F  OR        ECX,-01
015F:006D7342  REPNZ SCASB
015F:006D7344  NOT      ECX
015F:006D7346  DEC      ECX
015F:006D7347  CMP      ECX,0F                    //註冊碼是否為15位
015F:006D734A  JZ        006D7359          //相等則跳
015F:006D734C  POP      EDI
015F:006D734D  POP      ESI
015F:006D734E  POP      EBP
015F:006D734F  MOV      EAX,00000001
015F:006D7354  POP      EBX
015F:006D7355  ADD      ESP,10
015F:006D7358  RET
015F:006D7359  XOR      ECX,ECX                  //ECX 清零,作為初始值
015F:006D735B  MOV      EAX,ECX
015F:006D735D  CDQ
015F:006D735E  IDIV      EBX
015F:006D7360  MOVSX    EAX,BYTE PTR [ESI+EDX]    //依次取機器碼字元到EAX,取完則從第1個重新開始依次取位
015F:006D7364  CDQ                                //雙字擴充套件(實際上是 EDX 清零)
015F:006D7365  MOV      EDI,EAX                //字元送EDI
015F:006D7367  MOV      EAX,ECX                //EAX=ECX
015F:006D7369  XOR      EDI,EDX                //機器碼字元與0異或(EDX=0),結果送EDI
015F:006D736B  SUB      EDI,EDX                //EDI=EDI-EDX(EDX=0)
015F:006D736D  CDQ                                //雙字擴充套件(實際上是 EDX 清零)
015F:006D736E  IDIV      DWORD PTR [ESP+24]        //EAX/使用者名稱長度(EAX=0,1,2...14),商放EAX,餘數放EDX(有何用處?不明白 :()
015F:006D7372  MOVSX    EAX,BYTE PTR [EBP+EDX]    //依次取使用者名稱字元ASCII到EAX,取完則從第1個重新開始依次取位
015F:006D7376  CDQ                                //雙字擴充套件(EAX<80000000, EDX=00000000;EAX>= 80000000, EDX則為FFFFFFFF,例如使用者字元為中文時,EDX=FFFFFFFF)
015F:006D7377  XOR      EAX,EDX                  //字元與0(或FFFFFFFF)異或,結果送EAX
015F:006D7379  SUB      EAX,EDX                //EAX=EAX-0(或FFFFFFFF),結果送EAX
015F:006D737B  ADD      EAX,EDI                  //EAX=EAX+EDI
015F:006D737D  MOV      EDI,0000001A             //EDI=0X1A
015F:006D7382  CDQ                                //雙字擴充套件(實際上是EDX 清零)
015F:006D7383  IDIV      EDI                      //上面相加的和/0X1A,餘數送EDX
015F:006D7385  ADD      DL,41                 //DL=餘數+41
015F:006D7388  MOV      [ECX+ESP+10],DL          //以字元形式儲存
015F:006D738C  INC      ECX               //ECX=ECX+1
015F:006D738D  CMP      ECX,0F                    //是否取夠15位
015F:006D7390  JL        006D735B                  //不足15位則迴圈
015F:006D7392  MOV      EAX,[ESP+2C]              //假註冊碼送 EAX
015F:006D7396  LEA      ESI,[ESP+10]
015F:006D739A  MOV      DL,[EAX]                  //取假註冊碼一個字元
015F:006D739C  MOV      BL,[ESI]                  //取真註冊碼一個字元,D ESI 可以看到正確註冊碼
015F:006D739E  MOV      CL,DL                    //CL=DL
015F:006D73A0  CMP      DL,BL                    //一樣?
015F:006D73A2  JNZ      006D73C8             //不一樣則死
015F:006D73A4  TEST      CL,CL             //是否取完
015F:006D73A6  JZ        006D73BE         //未取完繼續
015F:006D73A8  MOV      DL,[EAX+01]          //取假註冊碼下一位
015F:006D73AB  MOV      BL,[ESI+01]          //取真註冊碼一個字元
015F:006D73AE  MOV      CL,DL                      (同上)
015F:006D73B0  CMP      DL,BL
015F:006D73B2  JNZ      006D73C8
015F:006D73B4  ADD      EAX,02
015F:006D73B7  ADD      ESI,02
015F:006D73BA  TEST      CL,CL
015F:006D73BC  JNZ      006D739A                  //迴圈
015F:006D73BE  POP      EDI
015F:006D73BF  POP      ESI
015F:006D73C0  POP      EBP
015F:006D73C1  XOR      EAX,EAX
015F:006D73C3  POP      EBX
015F:006D73C4  ADD      ESP,10
015F:006D73C7  RET


  計算每一位結果後,共計算15次,最後以字元形式依次排列輸出,作為正確的註冊碼。
  如有錯誤,望各位高手指正!

相關文章