一連幾個軟體都無頭緒,真不爽,搞個演算法來解解氣! (3千字)

看雪資料發表於2001-12-16

捷徑點點通 2.00註冊演算法分析!
  
[作 者]:LILITH[CNCG]
[時 間]:2001-12-15
[軟 件]:捷徑點點通2.00
[軟體簡介]:大多數人都喜歡走“捷徑”,本軟體就是為此目的而設計的。當您在地圖上選擇了“出發地”(起始座標點)和“目的地”(終止座標點),然後再點選一下“開始計算最短路徑”,接著等待幾秒鐘,本軟體就會自動為您指出“出發地”和“目的地”之間的最短路徑,讓您輕鬆找到“捷徑”。
[下 載]:http://www.csdn.net/soft/openfile.asp?kind=1&id=13091
[保護方式]:註冊碼
[破解工具]:trw2000

這是我的第一個演算法分析,首先感謝PaulYoung大俠的指點,令我這等菜鳥嚐到了註冊演算法的甜頭,如有不對的地方還請各路英雄指正,呵呵……GO!

還是老辦法,用TRW2000下斷點bpx hmemcpy,中斷後7下F12,來到……
0177:004736BA  LEA      EDX,[EBP-10]  \\游標停在這裡……
0177:004736BD  MOV      EAX,[EBP-04]
0177:004736C0  MOV      EAX,[EAX+03A0]
0177:004736C6  CALL    004379CC
0177:004736CB  MOV      EAX,[EBP-0C]
0177:004736CE  CALL    00404C1C
0177:004736D3  MOV      [EBP-20],EAX
0177:004736D6  LEA      EAX,[EBP-08]
0177:004736D9  CALL    00404964
0177:004736DE  MOV      EDI,[EBP-20]
0177:004736E1  TEST    EDI,EDI      \\驗證輸入註冊名的位數
0177:004736E3  JNG      0047371D      \\為零則跳
0177:004736E5  MOV      ESI,01        \\ESI初始值為1
0177:004736EA  MOV      EAX,[EBP-0C]
0177:004736ED  XOR      EBX,EBX             \\EBX始值為零
0177:004736EF  MOV      BL,[EAX+ESI-01]       \\取註冊名第一位字母的十六進位制值
0177:004736F3  IMUL    EAX,[EBP-20],BYTE +6B  \\用註冊名位數與6B相乘,結果儲存入EAX
0177:004736F7  ADD      EAX,EBX               \\將得出的數與字母的十六進位制數相加
0177:004736F9  CDQ   
0177:004736FA  IDIV    ESI     \\將計算結果除以ESI的值,即除1,結果仍儲存到EAX
0177:004736FC  MOV      EBX,EAX \\將結果存入EBX
0177:004736FE  LEA      EDX,[EBP+FFFFFE10]
0177:00473704  MOV      EAX,EBX
0177:00473706  CALL    00408C2C
0177:0047370B  MOV      EDX,[EBP+FFFFFE10]
0177:00473711  LEA      EAX,[EBP-08]
0177:00473714  CALL    00404C24
0177:00473719  INC      ESI     \\ESI遞增
0177:0047371A  DEC      EDI     \\EDI遞減
0177:0047371B  JNZ      004736EA  \\繼續往上跳,迴圈取註冊名的第二,三位,直至取完
0177:0047371D  CMP      DWORD [EBP-08],BYTE +00
0177:00473721  JZ      NEAR 004738A1
0177:00473727  MOV      EAX,[EBP-08]
0177:0047372A  MOV      EDX,[EBP-10]
0177:0047372D  CALL    00404D60       \\取完後到這裡形成註冊碼,下D EDX可看到真的註冊碼。
0177:00473732  JNZ      NEAR 004738A1  \\完成驗證,跳轉。

總結:此程式透過註冊名的長度來計註冊碼,就是說,註冊名越長,註冊碼也就越長。輸入註冊名後,程式按位取註冊名的字母來計算註冊碼。先用6B(DEC=107)乘上註冊名的位數,如我用CNCG,所以為4,得出的數加上依次取得的每位字元的十六進位制值,再除以ESI的值(ESI初始值為1),就得出註冊碼,例如我的註冊名為CNCG,則計算方法是:
C=6b(107)*4+67/1=495 (4為註冊名長度;67是C的十六進位制值,1是ESI的值,ESI遞增1)
N=6b(107)*4+78/2=253
C=6b(107)*4+67/3=165
G=6b(107)*4+71/4=124
  
將4個數串依次起來就是495253165124,這就是註冊碼了,呵呵……
至此,軟體已經成功註冊,我的廢話也到此結束了,最後,再次感謝PaulYoung大俠的教導!BYE……

相關文章