聖誕到了,發一個緣分測試軟體的分析。

看雪資料發表於2004-12-25

聖誕閒來無聊,拿個緣分測試軟體測試了自己與女孩子的緣分,結果竟然有98分,評語是“千年等一回”,真的有這麼神嗎?於是產生了看看它計算過程的衝動。

軟體名稱:緣分測試
下載地址:http://www.skycn.net/soft/21402.html 天空軟體的東西,可以放心的。
除錯工具:OD

開工。首先用OD外掛Ultra String Reference查詢“千年等一回”,在
0040195A   push 200401.00429068              “千年等一回”
在該過程的起始處401780下斷,開始除錯。

00401780   push -1
00401782   push 200401.00420E18                          
00401787   mov eax,dword ptr fs:[0]
0040178D   push eax
0040178E   mov dword ptr fs:[0],esp
00401795   sub esp,0C
00401798   push ebx
00401799   push ebp
0040179A   push esi
0040179B   push edi
0040179C   mov esi,ecx
0040179E   push 1
004017A0   call <jmp.&MFC42.#6334>
004017A5   mov edx,dword ptr ds:[esi+60]
004017A8   xor edi,edi
004017AA   xor ebx,ebx
004017AC   xor eax,eax
004017AE   mov ecx,dword ptr ds:[edx-8]
004017B1   mov dword ptr ss:[esp+14],edi
004017B5   test ecx,ecx
004017B7   mov dword ptr ss:[esp+18],ebx
004017BB   jle short 200401.004017CC
004017BD   movsx ebp,byte ptr ds:[edx+eax]                ;  迴圈計算boy name
004017C1   add edi,ebp                                    ;  累和
004017C3   inc eax                                        ;  計數器
004017C4   cmp eax,ecx
004017C6   jl short 200401.004017BD                       ;  迴圈
004017C8   mov dword ptr ss:[esp+14],edi                  ;  儲存結果在[esp+14]
004017CC   mov ecx,dword ptr ds:[esi+64]
004017CF   xor eax,eax
004017D1   mov edi,dword ptr ds:[ecx-8]
004017D4   test edi,edi
004017D6   jle short 200401.004017E7
004017D8   movsx ebp,byte ptr ds:[ecx+eax]                ;  迴圈計算girl name
004017DC   add ebx,ebp
004017DE   inc eax
004017DF   cmp eax,edi
004017E1   jl short 200401.004017D8
004017E3   mov dword ptr ss:[esp+18],ebx                  ;  儲存結果在[esp+18]
004017E7   mov edi,dword ptr ds:[<&MSVCRT._mbscmp>]       ;  MSVCRT._mbscmp
004017ED   push 200401.004297E4                           ; 
004017F2   push edx                                       ; 
004017F3   call edi                                       ; 
004017F5   add esp,8
004017F8   test eax,eax
004017FA   je 200401.0040198C
00401800   mov eax,dword ptr ds:[esi+64]
00401803   push 200401.004297E4
00401808   push eax                                       ;  girl name
00401809   call edi
0040180B   add esp,8
0040180E   test eax,eax
00401810   je 200401.0040198C
00401816   fild dword ptr ss:[esp+14]                     ;  boy name 結果入棧  (-167)
0040181A   fadd qword ptr ds:[4228D8]                     ;  加3.76793
00401820   fimul dword ptr ss:[esp+18]                    ;  與girl name相乘  (-182)
00401824   fsin                                           ;  取正弦值,結果介於-1到1之間
00401826   fadd qword ptr ds:[4228D0]                     ;  加1,結果介於0-2
0040182C   fmul qword ptr ds:[4228C8]                     ;  乘50,結果介於0-100
00401832   call <jmp.&MSVCRT._ftol>                       ;  結果出棧
00401837   mov ebx,eax                                    ;  得分
00401839   mov eax,dword ptr ds:[esi+60]
0040183C   push 200401.00429248                           ;  ASCII "Romeo"
00401841   push eax                                       ;  boy name
00401842   call edi                                          是否是Romeo
00401844   add esp,8
00401847   test eax,eax
00401849   jnz short 200401.00401864
0040184B   mov eax,dword ptr ds:[esi+64]
0040184E   push 200401.00429240                           ;  ASCII "Julia"
00401853   push eax
00401854   call edi                                          是否是Julia
00401856   add esp,8
00401859   test eax,eax
0040185B   jnz short 200401.00401864
0040185D   mov ebx,64                                     ;  分數為100
00401862   jmp short 200401.004018B8
00401864   mov eax,dword ptr ds:[esi+60]
00401867   push 200401.00429238                           ;  ASCII "romeo"
0040186C   push eax                                       ;  boy name
0040186D   call edi
0040186F   add esp,8
00401872   test eax,eax
00401874   jnz short 200401.0040188F
00401876   mov eax,dword ptr ds:[esi+64]
00401879   push 200401.00429230                           ;  ASCII "julia"
0040187E   push eax
0040187F   call edi
00401881   add esp,8
00401884   test eax,eax
00401886   jnz short 200401.0040188F
00401888   mov ebx,64
0040188D   jmp short 200401.004018B8
0040188F   mov eax,dword ptr ds:[esi+60]
00401892   push 200401.00429228                           ;  梁山伯
00401897   push eax
00401898   call edi
0040189A   add esp,8
0040189D   test eax,eax
0040189F   jnz short 200401.004018B8
004018A1   mov eax,dword ptr ds:[esi+64]
004018A4   push 200401.00429220                              祝英臺
004018A9   push eax
004018AA   call edi
004018AC   add esp,8
004018AF   test eax,eax
004018B1   jnz short 200401.004018B8
004018B3   mov ebx,63
004018B8   push ebx
004018B9   lea eax,dword ptr ds:[esi+68]
004018BC   push 200401.0042921C                           ; 
004018C1   push eax
004018C2   call <jmp.&MFC42.#2818>
004018C7   add esp,0C
004018CA   mov ecx,esi
004018CC   push 0
004018CE   call <jmp.&MFC42.#6334>
004018D3   mov ecx,dword ptr ds:[esi+20]
004018D6   push 1                                         ;
004018D8   push 0                                         ;
004018DA   push ecx                                       ;
004018DB   call dword ptr ds:[<&USER32.InvalidateRect>]   ; \InvalidateRect
004018E1   lea ecx,dword ptr ds:[ebx+5]                   ;  以下計算分數分級,分數+5
004018E4   mov eax,66666667                               ;  應該是四捨五入計算,但不知為什麼程式碼這樣。
004018E9   imul ecx
004018EB   sar edx,2
004018EE   mov eax,edx
004018F0   lea ecx,dword ptr ss:[esp+10]
004018F4   shr eax,1F
004018F7   add edx,eax
004018F9   mov edi,edx                                    ;  等級儲存在EDI,11個等級,0-4,5-14,類推。
004018FB   call <jmp.&MFC42.#540>
00401900   cmp edi,0A                                     ;  等級是否大於A,Switch (cases 0..A)
00401903   mov dword ptr ss:[esp+24],0
0040190B   ja short 200401.00401968
0040190D   jmp dword ptr ds:[edi*4+4019A0]
00401914   push 200401.00429204                           ;  Case 0 of switch 00401900
00401919   jmp short 200401.0040195F
0040191B   push 200401.004291F0                           ;  Case 1 of switch 00401900
00401920   jmp short 200401.0040195F
00401922   push 200401.004291D8                           ;  Case 2 of switch 00401900
00401927   jmp short 200401.0040195F
00401929   push 200401.004291C0                           ;  Case 3 of switch 00401900
0040192E   jmp short 200401.0040195F
00401930   push 200401.00429178                           ;  Case 4 of switch 00401900
00401935   jmp short 200401.0040195F
00401937   push 200401.00429150                           ;  Case 5 of switch 00401900
0040193C   jmp short 200401.0040195F
0040193E   push 200401.00429110                           ;  Case 6 of switch 00401900
00401943   jmp short 200401.0040195F
00401945   push 200401.004290E0                           ;  Case 7 of switch 00401900
0040194A   jmp short 200401.0040195F
0040194C   push 200401.004290B0                           ;  Case 8 of switch 00401900
00401951   jmp short 200401.0040195F
00401953   push 200401.00429078                           ;  Case 9 of switch 00401900
00401958   jmp short 200401.0040195F
0040195A   push 200401.00429068                           ;  Case A of switch 00401900,千年等一回啊!
0040195F   lea ecx,dword ptr ss:[esp+14]
00401963   call <jmp.&MFC42.#860>
00401968   mov ecx,dword ptr ss:[esp+10]                  ;  Default case of switch 00401900
0040196C   push 0
0040196E   push 200401.0042905C
00401973   push ecx
00401974   mov ecx,esi
00401976   call <jmp.&MFC42.#4224>
0040197B   lea ecx,dword ptr ss:[esp+10]
0040197F   mov dword ptr ss:[esp+24],-1
00401987   call <jmp.&MFC42.#800>
0040198C   mov ecx,dword ptr ss:[esp+1C]
00401990   pop edi
00401991   pop esi
00401992   pop ebp
00401993   pop ebx
00401994   mov dword ptr fs:[0],ecx
0040199B   add esp,18
0040199E   retn
0040199F   nop
004019A0   dd 200401.00401914                             ;  Switch table used at 0040190D, 等級表
004019A4   dd 200401.0040191B
004019A8   dd 200401.00401922
004019AC   dd 200401.00401929
004019B0   dd 200401.00401930
004019B4   dd 200401.00401937
004019B8   dd 200401.0040193E
004019BC   dd 200401.00401945
004019C0   dd 200401.0040194C
004019C4   dd 200401.00401953
004019C8   dd 200401.0040195A
004019CC   nop
004019CD   nop
004019CE   nop
004019CF   nop
004019D0   jmp 200401.00401780

總結:其實軟體是取男孩名字的每個位元組相加,結果為A;女孩名字的每個位元組相加,結果為B,
{Sin[(A+3.76793)*B]+1}*50即為最終分數(取正弦後加1是為了保證結果在0-100之間)
然後分數四捨五入獲得等級(11個等級,對應0-A),不同等級有不同評語。

想哄女孩子的趕緊拿去玩玩吧。

相關文章