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次,最後以字元形式依次排列輸出,作為正確的註冊碼。
如有錯誤,望各位高手指正!