Speaking Clock Deluxe V3.05 演算法分析 (14千字)
Speaking Clock Deluxe V3.05 演算法分析
軟體大小: 1505 KB
軟體語言:
英文
軟體類別: 國外軟體 / 共享版 / 時鐘日曆
應用平臺: Win9x/NT/2000/XP
軟體介紹:
主要特點/功能有:四種精美圖形介面/語音報時/日曆/50種任意設定的鬧鈴/計時器/計算器/同步校正/引語等。其模擬的實際時鐘外觀極其逼真;能夠用
20 多種語言報時(需安裝語音支援,從其主頁上可以下載到更多的語言包,包括中文普通話);其 50 種鬧鈴可設定在每天、每週、每月甚至每年的特定時刻重複地響;計時器功能能夠象秒錶那樣向上向下計時。數字鐘的顯示區域還可以用作內建的計算器,或設定“飛梭”引語。
工具:ollydbg 1.07 W32dasm 8.93
Name:Nnewell/iPB
License code:45454545
:004E7789 E82A9DF7FF
call 004614B8
:004E778E 8BD8
mov ebx, eax
:004E7790 8BC3
mov eax, ebx
:004E7792 8B10
mov edx, dword ptr [eax]
:004E7794 FF92E8000000
call dword ptr [edx+000000E8]
:004E779A 48
dec eax
:004E779B
0F859C000000 jne 004E783D
:004E77A1
8D55F8 lea edx,
dword ptr [ebp-08]
:004E77A4 8B83F0020000
mov eax, dword ptr [ebx+000002F0]
:004E77AA E8D913F6FF
call 00448B88
:004E77AF 8B55F8
mov edx, dword ptr [ebp-08]
<<--edx=="Nnewell/iPB"
:004E77B2 8D4DFC
lea ecx, dword ptr [ebp-04]
:004E77B5
8BC6 mov
eax, esi
:004E77B7 E8B8C8FFFF
call 004E4074 <<--演算法
:004E77BC 8B45FC
mov eax, dword ptr [ebp-04] <<--eax=="/ICC16746"
:004E77BF 50
push eax
:004E77C0 8D55F4
lea edx, dword ptr [ebp-0C]
:004E77C3 8B83F4020000
mov eax, dword ptr [ebx+000002F4]<<--eax=="/ICC16746"
:004E77C9 E8BA13F6FF call
00448B88
:004E77CE 8B55F4
mov edx, dword ptr [ebp-0C] <<--edx=="45454545"
:004E77D1 58
pop eax <<--eax=="/ICC16746"
:004E77D2 E85DD5F1FF call
00404D34 <<--註冊碼比較
:004E77D7 754F
jne 004E7828 <<--不等則註冊失敗
:004E77D9 8D55F0
lea edx, dword ptr [ebp-10]
:004E77DC 8B83F0020000
mov eax, dword ptr [ebx+000002F0]
:004E77E2 E8A113F6FF
call 00448B88
:004E77E7 8B55F0
mov edx, dword ptr [ebp-10]
:004E77EA 8D8638270000 lea eax,
dword ptr [esi+00002738]
既然是演算法分析,那就要進call 004E4074看看註冊碼是如何計算的:
======================call 004E4074====================
:004E4074 55
push ebp
:004E4075 8BEC
mov ebp, esp
:004E4077 51
push ecx
:004E4078 B904000000
mov ecx, 00000004
* Referenced by
a (U)nconditional or (C)onditional Jump at Address:
|:004E4082(C)
|
:004E407D 6A00
push 00000000
:004E407F 6A00
push 00000000
:004E4081 49
dec ecx
* Referenced
by a (U)nconditional or (C)onditional Jump at Address:
|:004E400B(C)
|
:004E4082 75F9
jne 004E407D
:004E4084 51
push ecx
:004E4085 874DFC
xchg dword ptr [ebp-04], ecx
:004E4088 53
push ebx
:004E4089 56
push esi
:004E408A 894DF8
mov dword ptr [ebp-08], ecx
:004E408D 8955FC
mov dword ptr [ebp-04], edx
:004E4090 8B45FC
mov eax, dword ptr [ebp-04] <<--eax=="Nnewell/iPB"
:004E4093 E8400DF2FF call
00404DD8
:004E4098 33C0
xor eax, eax
:004E409A 55
push ebp
:004E409B 6898414E00
push 004E4198
:004E40A0 64FF30
push dword ptr fs:[eax]
:004E40A3 648920
mov dword ptr fs:[eax], esp
:004E40A6 33C0
xor eax, eax
<<--eax==0
:004E40A8 8945EC
mov dword ptr [ebp-14], eax <<--將eax==0送入記憶體地址[ebp-14]
:004E40AB 8D4DE4
lea ecx, dword ptr [ebp-1C]
:004E40AE BA08000000
mov edx, 00000008
:004E40B3 B8642C1C00
mov eax, 001C2C64
<<--eax==0x001C2C64
:004E40B8 E82351F2FF
call 004091E0
<<--轉換為字串
:004E40BD 8B4DE4
mov ecx, dword ptr [ebp-1C] <<--ecx=="001C2C64"
:004E40C0 8D45E8
lea eax, dword ptr [ebp-18]
:004E40C3 8B55FC
mov edx, dword ptr [ebp-04] <<--edx=="Nnewell/iPB"
:004E40C6 E8710BF2FF call
00404C3C <<--連線字串
:004E40CB 8B45E8
mov eax, dword ptr [ebp-18] <<--eax=="Nnewell/iPB001C2064"
:004E40CE 8D55F4
lea edx, dword ptr [ebp-0C]
:004E40D1 E83A4CF2FF
call 00408D10
<<--轉換為大寫
:004E40D6 8B45F4
mov eax, dword ptr [ebp-0C] <<--eax=="NNEWELL/IPB001C2C64"
:004E40D9 E8120BF2FF call
00404BF0 <<--計算長度
:004E40DE 8BF0
mov esi, eax <<--esi==0x13
(長度)
:004E40E0 85F6
test esi, esi <<--使用者名稱是否為空
:004E40E2 7E59
jle 004E413D
:004E40E4 BB01000000
mov ebx, 00000001 <<--ebx==1
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004E413B(C)
|
:004E40E9 8B45F4
mov eax, dword ptr [ebp-0C] <<--eax=="NNEWELL/IPB001C2C64"
:004E40EC 8A4418FF
mov al, byte ptr [eax+ebx-01] <<--取每個字元
:004E40F0
E833FFFFFF call 004E4028
:004E40F5 84C0
test al, al <<--eax是否為0
:004E40F7 7425
je 004E411E <<--是跳,不是則將該字元儲存起來,做為註冊碼的一部分。
:004E40F9 8D45DC
lea eax, dword ptr [ebp-24]
:004E40FC 8B55F4
mov edx, dword ptr [ebp-0C] <<--eax=="NNEWELL/IPB001C2C64"
:004E40FF 8A541AFF
mov dl, byte ptr [edx+ebx-01] <<--取未被整除的字元
:004E4103
E8100AF2FF call 00404B18
:004E4108 8B45DC
mov eax, dword ptr [ebp-24]
:004E410B 8D55E0
lea edx, dword ptr [ebp-20]
:004E410E E8FD4BF2FF
call 00408D10
:004E4113 8B55E0
mov edx, dword ptr [ebp-20]
:004E4116 8D45F0
lea eax, dword ptr [ebp-10]
:004E4119 E8DA0AF2FF
call 00404BF8
<<--將該字元儲存起來,做為註冊碼的一部分。
上面是取出字元在call 004E4028裡計算al是否為0,不為0
則該字元作為註冊碼的一部分,所以有必要進去看看:
======================call 004E4028=====================
:004E4028 55
push ebp
:004E4029 8BEC
mov ebp, esp
:004E402B 51
push ecx
:004E402C
53
push ebx
:004E402D 56
push esi
:004E402E 8845FF
mov byte ptr [ebp-01], al <<--[ebp-01]
<= al
:004E4031 C645FD02
mov [ebp-03], 02 <<--[ebp-03]==2
:004E4035 C645FE01
mov [ebp-02], 01 <<--[ebp-02]==1
:004E4039 8A4DFF
mov cl, byte ptr [ebp-01] <<--cl <= [ebp-01]
:004E403C
49
dec ecx
:004E403D 80E902
sub cl, 02
:004E4040 722A
jb 004E406C
:004E4042 41
inc ecx
<<--實際上cl==cl-2
* Referenced by
a (U)nconditional or (C)onditional Jump at Address:
|:004E3FDC(C)
|
:004E4043 B302
mov bl, 02 <<--bl==2
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004E406A(C)
|
:004E4045 33C0
xor eax, eax
:004E4047 8A45FF
mov al, byte ptr [ebp-01]
<<--al <= [ebp-01]
:004E404A 33D2
xor edx, edx
:004E404C 8AD3
mov dl, bl
<<--dl==bl==2
:004E404E
8BF2 mov
esi, edx <<--esi==edx==2
:004E4050 33D2
xor edx, edx
:004E4052 F7F6
div esi
<<--eax==eax/esi
:004E4054 85D2
test edx, edx
<<--測試餘數edx是否為零
:004E4056 7503
jne 004E405B
<<--不為0跳
:004E4058
FE45FD inc [ebp-03]
<<--否則[ebp-03]+1
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004E4056(C)
|
:004E405B 807DFD02
cmp byte ptr [ebp-03], 02 <<--比較
:004E405F 7606
jbe 004E4067 <<--小於等於跳
:004E4061 C645FE00
mov [ebp-02], 00 <<--[ebp-02]==0
:004E4065 EB05
jmp 004E406C
* Referenced by a (U)nconditional or (C)onditional Jump
at Address:
|:004E405F(C)
|
:004E4067 43
inc ebx
<<--除數ebx加1
:004E4068 FEC9
dec cl
:004E406A
75D9 jne
004E4045 <<--繼續
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004E4009(C), :004E4040(C), :004E4065(U)
|
:004E406C 8A45FE
mov al, byte ptr [ebp-02]
<<--al <= [ebp-02]
:004E406F 5E
pop esi
:004E4070
5B
pop ebx
:004E4071 59
pop ecx
:004E4072 5D
pop ebp
:004E4073 C3
ret
==================end
call 004E4028=======================
call 004028的作用是取得字元的16進位制數,作為被除數,除數從2開始遞增與被除數進行除法運算,直至除數與被除數相等就結束運算。運算中間若該字元被除數整除,則置al為0,否則置al為1。
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004E40F7(C)
|
:004E411E 83FB01
cmp ebx, 00000001 <<--是1嗎?
:004E4121 740A
je 004E412D <<--是跳,否則不跳
:004E4123 8B45F4
mov eax, dword ptr [ebp-0C] <<--eax=="NNEWELL/IPB001C2C64"
:004E4126 0FB64418FE movzx
eax, byte ptr [eax+ebx-02]<<--取字元(從第一個開始)
:004E412B EB06
jmp 004E4133
<<--跳
* Referenced by a (U)nconditional
or (C)onditional Jump at Address:
|:004E4121(C)
|
:004E412D 8B45F4
mov eax, dword ptr [ebp-0C]
<<--eax=="NNEWELL/IPB001C2C64"
:004E4130 0FB600
movzx eax, byte ptr [eax]
<<--取每個字元
* Referenced by a (U)nconditional or (C)onditional
Jump at Address:
|:004E412B(U)
|
:004E4133 C1E003
shl eax, 03
<<--eax左移3 位
:004E4136 0145EC
add dword ptr [ebp-14],
eax <<--累加
:004E4139 43
inc ebx
:004E413A 4E
dec esi
:004E413B 75AC
jne 004E40E9 <<--累加結果為0x2760
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004E40E2(C)
|
:004E413D 8145EC0A1A0000
add dword ptr [ebp-14], 00001A0A<<--[ebp-14]==0x2760+0x1A0A=0X416A
(16746)
:004E4144 8D55D8
lea edx, dword ptr [ebp-28]
:004E4147 8B45EC
mov eax, dword ptr [ebp-14] <<--eax==0x416A
:004E414A E82D50F2FF call
0040917C <<--轉換為10進位制
:004E414F 8B4DD8
mov ecx, dword ptr [ebp-28] <<--ecx=="16746"
:004E4152
8D45F4 lea eax,
dword ptr [ebp-0C]
:004E4155 8B55F0
mov edx, dword ptr [ebp-10] <<--edx=="/ICC"
:004E4158 E8DF0AF2FF call
00404C3C <<--連線字串
:004E415D 8B45F8
mov eax, dword ptr [ebp-08]
:004E4160 8B55F4
mov edx, dword ptr [ebp-0C] <<--edx=="/ICC16746"
:004E4163 E82408F2FF call
0040498C
:004E4168 33C0
xor eax, eax
:004E416A 5A
pop edx
:004E416B 59
pop ecx
:004E416C
59
pop ecx
:004E416D 648910
mov dword ptr fs:[eax], edx
:004E4170 689F414E00
push 004E419F
* Referenced by a (U)nconditional
or (C)onditional Jump at Address:
|:004E419D(U)
|
:004E4175 8D45D8
lea eax, dword ptr [ebp-28]
:004E4178 BA05000000 mov
edx, 00000005
:004E417D E8DA07F2FF
call 0040495C
:004E4182 8D45F0
lea eax, dword ptr [ebp-10]
:004E4185 BA02000000
mov edx, 00000002
:004E418A E8CD07F2FF
call 0040495C
:004E418F 8D45FC
lea eax, dword ptr [ebp-04]
:004E4192 E8A107F2FF call
00404938
:004E4197 C3
ret
==================end call 004E4074==================
:004E77F0 E897D1F1FF call
0040498C
:004E77F5 8D55EC
lea edx, dword ptr [ebp-14]
:004E77F8 8B83F4020000
mov eax, dword ptr [ebx+000002F4]
:004E77FE E88513F6FF
call 00448B88
:004E7803 8B55EC
mov edx, dword ptr [ebp-14]
:004E7806 8D863C270000 lea eax,
dword ptr [esi+0000273C]
:004E780C E87BD1F1FF
call 0040498C
:004E7811 6A00
push 00000000
:004E7813 668B0D7C784E00
mov cx, word ptr [004E787C]
:004E781A B202
mov dl, 02
* Possible StringData Ref from Code Obj ->"Registration was successful, thank
"
->"you for registering!"
|
:004E781C B888784E00
mov eax, 004E7888
:004E7821 E8E2A0F5FF
call 00441908
:004E7826 EB15
jmp 004E783D
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004E77D7(C)
|
:004E7828 6A00
push 00000000
:004E782A 668B0D7C784E00
mov cx, word ptr [004E787C]
:004E7831 B201
mov dl, 01
* Possible StringData Ref from Code Obj ->"Registration was unsuccessful,
"
->"please check
name and license "
->"code and try again."
|
:004E7833
B8C8784E00 mov eax, 004E78C8
:004E7838 E8CBA0F5FF call 00441908
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004E779B(C), :004E7826(U)
|
:004E783D 8BC6
mov eax, esi
:004E783F E8E0000000
call 004E7924
:004E7844 8BC3
mov eax, ebx
:004E7846 E83DDFF7FF call 00465788
:004E784B 33C0
xor eax, eax
:004E784D 5A
pop edx
:004E784E 59
pop ecx
:004E784F
59
pop ecx
:004E7850 648910
mov dword ptr fs:[eax], edx
:004E7853 6875784E00
push 004E7875
* Referenced by a (U)nconditional
or (C)onditional Jump at Address:
|:004E7873(U)
|
:004E7858 8D45EC
lea eax, dword ptr [ebp-14]
:004E785B BA04000000 mov
edx, 00000004
:004E7860 E8F7D0F1FF
call 0040495C
:004E7865 8D45FC
lea eax, dword ptr [ebp-04]
:004E7868 E8CBD0F1FF
call 00404938
:004E786D C3
ret
-------------------------------------------------------------
Nnewell[iPB][FCG]
2002.07.17
相關文章
- 世界時鐘:World Clock Deluxe mac2022-03-27UXMac
- World Clock Deluxe for Mac,世界時鐘豪華版2023-04-02UXMac
- Mac世界時鐘豪華版——World Clock Deluxe for mac2020-10-14MacUX
- FolderView 1.7
註冊演算法分析 (14千字)2015-11-15View演算法
- World Clock Deluxe for Mac(世界時鐘豪華版) v4.17.1.1啟用版2020-12-29UXMac
- CoolClock V1.02註冊演算法分析 ---OCG (14千字)2015-11-15演算法
- PostgreSQL 原始碼解讀(141)- Buffer Manager#6(Clock Sweep演算法)2019-02-22SQL原始碼演算法
- EZ MP3 Recorder 1.15 註冊演算法分析 (14千字)2015-11-15演算法
- 計算機專業詞彙學習1.0演算法分析[原創] (14千字)2001-12-13計算機演算法
- S-DEMO2 註冊分析 (14千字)2002-06-25
- 炒股理財演算法分析 (3千字)2001-03-31演算法
- HappyEO演算法分析
(11千字)2015-11-15APP演算法
- Sitman2.1
演算法分析 (5千字)2015-11-15演算法
- Oxford Deluxe for Mac(牛津詞典) 14.1中文版下載2023-04-19UXMac
- 給TAE!的小禮物---對DISKdata v3.3.2註冊演算法的分析 (14千字)2001-07-13演算法
- Active Ebook Compiler的註冊演算法 (14千字)2001-05-09Compile演算法
- rOYALaCCEZZ Trial Crackme 3.2 演算法分析 (10千字)2002-02-27演算法
- SuperCleaner演算法分析----菜鳥級
(12千字)2015-11-15演算法
- Readbook 1.42版 演算法分析。 (1千字)2015-11-15演算法
- Tray Helper V 3.6演算法分析 (26千字)2015-11-15演算法
- 炒股理財3.1 演算法分析(15千字)2015-11-15演算法
- XXDownload1.14分析(注意版本) (5千字)2015-11-15
- 3Dmark2003演算法研究 (14千字)2003-02-133D演算法
- CLOCK_MONOTONIC 與 CLOCK_REALTIME 區別2024-04-11Mono
- 重新貼過註冊演算法分析 (16千字)2001-10-23演算法
- PC 安全虎[Beta 1]演算法分析 (6千字)2001-12-05演算法
- 屏保自己做2.61版演算法分析! (7千字)2002-02-18演算法
- eLib2.01演算法分析
(31千字)2015-11-15演算法
- 龍文輸入通演算法分析 (27千字)2015-11-15演算法
- HotkeyMaster演算法分析----菜鳥級
(4千字)2015-11-15AST演算法
- CSS draws a clock2022-11-24CSS
- ACM The Famous Clock2014-04-06ACM
- C++(clock())2024-09-07C++
- Personal Antispy 1.14 註冊演算法分析2015-11-15演算法
- 簡單演算法:迷你網路電視演算法分析 (8千字)2015-11-15演算法
- 演算法分析: <獻給初學者>
之一 (4千字)2002-06-06演算法
- 演算法分析: <獻給初學者>
之四 (9千字)2002-06-06演算法
- 演算法分析:
<獻給初學者> 之二 (7千字)2002-06-07演算法