Advanced Evaluator 3.5 (另一強大的科學計算器--註冊運算也很強大喲)破解~~新手請進~~有詳細註解~高手們做... (12千字)

看雪資料發表於2001-03-10

標題: Advanced Evaluator 3.5 (另一強大的科學計算器--註冊運算也很強大喲)破解~~新手請進~~有詳細註解~高手們做個序號產生器吧~~~呵呵

內容:
差點就要放棄啦~~~~~~~


軟體名稱:Advanced Evaluator 3.5 (功能強大的科學計算器)
下載地址:http://61.134.4.193:8080/appsoftware/calculator/ae35.zip (708KB)
註冊形式:Name & Key (我用了Name:Sam Von Key:67676767) 30天限制,過了30天就不能用了
破解原因:同上次一樣,找了一大堆計算器想算註冊碼,這個也一樣不合我心意,但它有註冊保護,剛好可以練一下
          但這個比上次那個難多啦(對於我來說),看我的標題就知道啦,不過這次可增加了我不少經驗值,順便問
          下大家,有哪個計算器軟體或其它工具可以進行彙編的shl,nor,rol,xor等這些邏輯運算的請告訴我下載
          地址~~~~謝謝大家~~~~

破解過程及心得:
        這次破解簡直是瞎貓捉到死老鼠,一開始當然是例行公事一樣的填入我的Name&Key,開啟Trw2000,輸入bpx hmemcpy,然後按確定,Booom~~~Trw攔下來啦,然後就bd、pmodule,來到了程式的程式碼中,呵呵~~~~有誰算過這個過程要多長時間。通常來說這時我都會看看各個暫存器的值,一般來說這時eax的值就是你Name or Key的長度,而我這裡是我Name的長度7,好啦它讀了我的Name,馬上用s命令查詢'Sam Von'(s命令會用吧,反正我剛學的時候就不怎麼會用,誰不懂就問吧),找到啦,當然是“bpm 地址 rw”啦,這個命令很好用的,只要任何程式讀寫了存放我的Name的地址,Trw就會中斷了,我的猜想是程式讀我的Name作比較或者作運算或者把它放到第二個地址去,所以我通常有個習慣就是用bpm把所有存放我Name & Key的地址都設中斷,反正程式一讀我的Name&Key就是要做小動作啦,所以這樣比較容易跟也容易找到核心,當程式再次中斷時,我發現它在拿我的Name和sudi比較,但我用sudi來註冊時一樣出錯,那這個可能是黑名單吧,這裡應該不是重點,再跟~~~~~~~又發現程式在查我Name的二進位制,要用到二進位制來運算,麻煩啦,繼續~~~~~~中間好多F8 F10的不停的按,反正要注意各暫存器的值,在Trw中的彙編程式碼視窗右上角的提示很重要,多多留意,一發現出現有疑的資料就要d來看看。其中有幾個地方應該都是運算重點,但我沒有貼出程式碼,只給出地址,有興趣的就自己看看吧:在4027EC處程式用我Name的16進位制加上某個地址再與另一地址比較;在478B1B處程式作了運算(用了除法等命令);在479471-->4794B0處程式將我Name的二進位制連續放在記憶體中然後比較、查表、運算。最下面我貼出那些程式碼是對Key的比較運算,反正我再跟下去就暈啦,因為後面的call很多,運算也很複雜,我看不懂程式碼,但我想後面應該就是運算核心啦,高手們可以研究一下。上面的過程我花了兩天時間,始終搞不懂,你一定想問我為什麼不用反彙編呢,其實我一早用過啦,程式是Delphi寫的,裡面一點有用的字串都沒有,只有十多行而已(BTW:為什麼純Delphi的程式用W32dasm反彙編後在字串表中都只有幾行呢,是程式本身的設計還是Delphi的限制呢),我開始懷疑是否是我的起點過高呢~~~~~~~~~~~~呵呵
        眼花啦~~~~每次看下面運算的程式碼都不得重點,我實在看不懂運算的過程,而且後面的call太多啦,唉沒心機啦,於是像傻子一樣不停的按F10~~~~忽然在4799AB處停了下來,其實這裡我以前也來過幾次,不過總覺得比較語句應該是cmp al,01之類的才是重要的判斷,不會同2比吧,給騙了~~~這時將al改為2就完全破解啦,這完全是我無路可走才想到亂改一氣的,所以說捉到死老鼠啦~~~~~呵呵
        再說兩句,破解真的好累,寫文章就更累~~~~這是我寫的第三篇,這幾天都沒精神啦,另外我寫的可能很亂很羅嗦,請大家原諒,我文筆本來就不好,加上我寫的這些都是想保留下來以後溫習用的,所以寫的很詳細(因為我是一個新手,功力0.6級),記得我剛開始學破解時到處找教程,但幾乎每個教程都那麼簡單,可能我人蠢吧,很多東西看不懂,所以我就將破解的過程整理後貼出來咯,希望能幫得了一些新手,也請高手指正,畢竟這些都是我自己理解的東西~~~~難免有錯的~~~~謝了~~~~~~~~~~~~~


以下為核心判斷的call

* Referenced by a CALL at Addresses:
|:00478C93  , :00478CA2  , :00479039  , :00479049  , :0047974C 
|:00479780  , :004799A6 
|
:00478A48 53                      push ebx
:00478A49 56                      push esi
:00478A4A 57                      push edi
:00478A4B 55                      push ebp
:00478A4C 8BEA                    mov ebp, edx
:00478A4E B202                    mov dl, 02        <----dl=2 此為註冊標誌想辦法保持這個數就行啦
:00478A50 8B7504                  mov esi, dword ptr [ebp+04]<---[C60994]=252E---假密碼
:00478A53 8B4804                  mov ecx, dword ptr [eax+04]<---[C67F88]=1CD3---真密碼
-------------------------------------------------------------------------------------------------
To:新手~~~~~~~~~~
我不知道程式將我的Name和Key作了什麼運算,反正到了此處程式就拿這兩個數作比較,我就稱它們為真假密碼吧,請留意程式並沒有將密碼連續放在記憶體中,而是分散的,它的存放是這樣的[ebp(eax)]是密碼的基地址,[ebp(eax)+4]是密碼的值,[ebp(eax)+8]是下一個密碼的基地址,程式先比較第一個密碼,不等的話還會去比較第二個,這一點我就不明白啦,第一個不等就算啦嘛,為何還做下面的比較,就算後面的密碼相等bl也不可能變為2呀,這是我第一次碰到的情況,所以我把它記了下來,不要說我羅嗦呀~~~~~~~~~~
-------------------------------------------------------------------------------------------------
:00478A56 3BF1                    cmp esi, ecx
:00478A58 7D04                    jge 00478A5E      <---此處esi>ecx所以跳啦
:00478A5A 33D2                    xor edx, edx      <---不跳的話edx就被清為0啦
:00478A5C EB20                    jmp 00478A7E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00478A58(C)
|
:00478A5E 3BF1                    cmp esi, ecx      <----再比不等dl就變為1啦
:00478A60 7E1C                    jle 00478A7E
:00478A62 B201                    mov dl, 01
:00478A64 EB18                    jmp 00478A7E      <----一定跳啦,不過dl為1啦

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00478A90(C)
|
:00478A66 8BC6                    mov eax, esi    <----基地址
:00478A68 8BEF                    mov ebp, edi
:00478A6A 8B7504                  mov esi, dword ptr [ebp+04]<----第二個密碼22B4
:00478A6D 8B4804                  mov ecx, dword ptr [eax+04]<----211
:00478A70 3BF1                    cmp esi, ecx
:00478A72 7D04                    jge 00478A78  <------看~~就算相等也沒用,剛才dl已經為1啦
:00478A74 33D2                    xor edx, edx       
:00478A76 EB06                    jmp 00478A7E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00478A72(C)
|
:00478A78 3BF1                    cmp esi, ecx
:00478A7A 7E02                    jle 00478A7E
:00478A7C B201                    mov dl, 01

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00478A5C(U), :00478A60(C), :00478A64(U), :00478A76(U), :00478A7A(C)
|
:00478A7E 8B7008                  mov esi, dword ptr [eax+08]<----下一個密碼的基地址
:00478A81 85F6                    test esi, esi
:00478A83 0F95C1                  setne cl    <----在Trw中此句是"setnz cl" 所以cl=1
:00478A86 8B7D08                  mov edi, dword ptr [ebp+08]<----下一個密碼的基地址
:00478A89 85FF                    test edi, edi
:00478A8B 0F95C3                  setne bl    <----bl=1,第二次到此bl=0下面就不跳啦共比較了四次
:00478A8E 22CB                    and cl, bl
:00478A90 75D4                    jne 00478A66 <----在Trw中此句是jnz 所以跳了
:00478A92 8B7808                  mov edi, dword ptr [eax+08]
:00478A95 85FF                    test edi, edi
:00478A97 0F94C1                  sete cl
:00478A9A 8B7508                  mov esi, dword ptr [ebp+08]
:00478A9D 85F6                    test esi, esi
:00478A9F 0F95C3                  setne bl
:00478AA2 22CB                    and cl, bl
:00478AA4 7402                    je 00478AA8
:00478AA6 B201                    mov dl, 01

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00478AA4(C)
|
:00478AA8 85F6                    test esi, esi
:00478AAA 0F94C1                  sete cl
:00478AAD 85FF                    test edi, edi
:00478AAF 0F95C0                  setne al
:00478AB2 22C8                    and cl, al
:00478AB4 7402                    je 00478AB8
:00478AB6 33D2                    xor edx, edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00478AB4(C)
|                                                  上面的程式碼沒能將dl=02
:00478AB8 8BC2                    mov eax, edx <---此處edx=0所以al=0 注意ret後就是比較啦
:00478ABA 5D                      pop ebp
:00478ABB 5F                      pop edi
:00478ABC 5E                      pop esi
:00478ABD 5B                      pop ebx
:00478ABE C3                      ret

=================================================================================================

:0047999A 8B45EC                  mov eax, dword ptr [ebp-14]
:0047999D 8945F0                  mov dword ptr [ebp-10], eax
:004799A0 8B55F4                  mov edx, dword ptr [ebp-0C]
:004799A3 8B45F0                  mov eax, dword ptr [ebp-10]
:004799A6 E89DF0FFFF              call 00478A48 <----上面的程式碼
:004799AB 3C02                    cmp al, 02    <----呵呵~~~~~~~看下面的程式碼,根本沒有跳轉語句,跟
                                                    進後面的call找不到重點,所以說我是瞎撞的
-------------------------------------------------------------------------------------------------
在此如果將al改成02就OK啦(這裡看起來很簡單,當然啦這是結果,但想想之前的過程真的很恐怖,好多次想放棄啦,有耐心才會成功的,不過還要有點運氣,有時按著F8就睡著啦,等你睡醒後看一眼,可能關鍵處就在那等左你呢~~~~~~哈哈)NAG消失,進入程式,再次執行,完全沒問題,看看About沒我的名字,Why??程式怎麼判斷我註冊呢?登錄檔???好了,Regmon出手,程式讀了HKEY_CURRENT_USER\AppEvents\precomp,好啦,試試改名,呵呵~~~~~~~出來啦,要我註冊,其實程式並沒有儲存我的Name&Key只是如果不註冊,此鍵值就有個標誌,註冊了就改為另一個標誌(都不是明文,記不下來),氣死我啦,把它改為Sam.com~~~~咦!!眼花了????怎麼沒叫我註冊呢?再改為Sam Von~~~~我拷~~~還是進去了,原來程式只有一個不註冊的標誌,只要鍵值不是它就行啦,這東西註冊挺貴的,不會這麼兒戲吧,不過這I不是這麼容易就能找得到的(找到也不敢亂動它吧呵呵~~~~~~~~~~~~),而且它的註冊碼演算法很複雜(個人認為),請留意下面我提供的演算法程式碼,註冊碼保護得這麼好這裡卻~~~~~這該怎麼形容呀~~~~哈哈哈哈~~~想不起~~~我語文很差的~~~~呵呵
-------------------------------------------------------------------------------------------------
                                 
:004799AD 8B4508                  mov eax, dword ptr [ebp+08]
:004799B0 0F9400                  sete byte ptr [eax]
:004799B3 8D45F0                  lea eax, dword ptr [ebp-10]
:004799B6 E869EEFFFF              call 00478824
:004799BB 8D45F4                  lea eax, dword ptr [ebp-0C]
:004799BE E861EEFFFF              call 00478824
:004799C3 33C0                    xor eax, eax
:004799C5 5A                      pop edx
:004799C6 59                      pop ecx
:004799C7 59                      pop ecx
:004799C8 648910                  mov dword ptr fs:[eax], edx
:004799CB 68E5994700              push 004799E5

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004799E3(U)
|
:004799D0 8D45F8                  lea eax, dword ptr [ebp-08]
:004799D3 BA02000000              mov edx, 00000002
:004799D8 E8AF9FF8FF              call 0040398C
:004799DD C3                      ret


以下應該是註冊碼演算法的核心開始,想研究密碼演算法的請看看吧,我功力還不夠~~~~~~~~~~~

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00479592(C)
|
:0047956D 8D45F8                  lea eax, dword ptr [ebp-08]
:00479570 8B55FC                  mov edx, dword ptr [ebp-04]<---此行執行過後d edx=>[edx]=67676767                                                                是我輸入的註冊碼,已變為Hex的啦
:00479573 4E                      dec esi
:00479574 3B72FC                  cmp esi, dword ptr [edx-04]
:00479577 7205                    jb 0047957E
:00479579 E80697F8FF              call 00402C84

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00479577(C)
|
:0047957E 46                      inc esi
:0047957F 0FB65432FF              movzx edx, byte ptr [edx+esi-01]<---註冊碼第一位edx=67
:00479584 8B9495F8FBFFFF          mov edx, dword ptr [ebp+4*edx-00000408]<--注意edx參與了運算我猜                                                      它在查表,過了這行就d edx,二進位制??算一算原來
                                                    是67的二進位制,所以我開始怕了,這兩個call我跟進                                                      去卻搞不懂,頭暈啦,高手請吧
:0047958B E85CA6F8FF              call 00403BEC
:00479590 46                      inc esi
:00479591 4B                      dec ebx
:00479592 75D9                    jne 0047956D
:00479594 EB12                    jmp 004795A8  <---這裡跳過去後應該就是演算法的核心,高手研究一下吧

這段程式碼要執行好幾次,因為註冊碼和姓名的每一位查表運算都要經過這裡,我覺得好複雜呀,後面的程式碼我就不貼了,因為有很多call很難寫清楚,請大家反彙編後找一找吧~~~~~~~~不說啦~~~~~~我開始眼花啦~~~~~~~


                                                                              13:33 2001-3-10

相關文章