EmEditor v3 Version 3.09 漢化版註冊碼演算法分析 (8千字)

看雪資料發表於2001-01-09

EmEditor v3 Version 3.09 漢化版註冊碼演算法分析

軟體名稱:EmEditor v3 Version 3.09
下載地址:http://www.inhua.com/EmEditor.htm
軟體說明:簡單好用的文字編輯器,支援多種配置,自定義顏色、字型、工具欄、快捷鍵設定,可以調整行距,避免中文排列過於緊密,
          具有選擇文字列塊的功能(按ALT 鍵拖動滑鼠),並允許無限撤消、重做,總之功能多多,使用方便,是替代記事本的最佳編輯
          器。
除錯工具:SoftICE 4.05、W32dsm89
除錯平臺:Win2K

    作者:chn-boy
    日期:2001-1-9



【第一步】:
    下中斷:bpx GetWindowTextW do "d esp->8; p ret; ",然後輸入你的Virtual Code,點註冊。我輸入的是:9999 8888 7777 6666
程式攔斷在如下程式碼段處:

:004173CD 53                      push ebx
:004173CE 8D86F2030000            lea eax, dword ptr [esi+000003F2]
:004173D4 53                      push ebx
:004173D5 50                      push eax
:004173D6 FF7508                  push [ebp+08]
:004173D9 FF1584334300            Call dword ptr [00433384]  / GetWindowTextW()
:004173DF 668907                  mov word ptr [edi], ax  / 中斷攔斷在此,四個輸入框,你將會被攔斷四次
                                                          / 每次將十進位制值返回給ax,如9999 = 0x270F, 那麼 AX = 270F
                                                          / 為了表達方便,我分別用①、②、③、④來表示
:004173E2 46                      inc esi
:004173E3 47                      inc edi
:004173E4 47                      inc edi
:004173E5 83FE04                  cmp esi, 00000004  / 是不是有了四個視窗輸入?
:004173E8 7CE3                    jl 004173CD
:004173EA 8D45F4                  lea eax, dword ptr [ebp-0C]  / 將得到的四個值連續放到eax偏移處
                                                              / 此處,用 d eax,可以檢視到你輸入的四個十進位制值
:004173ED 50                      push eax
:004173EE E8F5FEFFFF              call 004172E8  / 核心處,判斷演算法,檢視輸入的註冊碼是否正確?

:004173F3 3BC3                    cmp eax, ebx  / 如果 eax = ebx ,那麼輸入正確
:004173F5 5F                      pop edi
:004173F6 742A                    je 00417422
:004173F8 33C9                    xor ecx, ecx
:004173FA 83F802                  cmp eax, 00000002
:004173FD 0F95C1                  setne cl



【第二步】:Call 004172EB程式碼為:
:004172E8 56                      push esi
:004172E9 8B742408                mov esi, dword ptr [esp+08]
:004172ED 57                      push edi
:004172EE 6A0A                    push 0000000A
:004172F0 0FB706                  movzx eax, word ptr [esi]  / ①
:004172F3 99                      cdq
:004172F4 59                      pop ecx  / ecx = 0x0A = 10
:004172F5 F7F9                    idiv ecx
:004172F7 3DAB000000              cmp eax, 000000AB  / ①÷10 是否等於AB,也就是看①是否為0x6AE=1710
:004172FC 7405                    je 00417303        / 是,則正確,也就是說①必須為1710
:004172FE 6A01                    push 00000001
:00417300 58                      pop eax
:00417301 EB15                    jmp 00417318
:00417303 668B7E06                mov di, word ptr [esi+06]  / ④
:00417307 56                      push esi
:00417308 E834FFFFFF              call 00417241  / 此Call為:用①、②、③進行一系列運算,得到一個結果,假設為⑤
                                                / 最後結果返回到 [esi+06]
:0041730D 85C0                    test eax, eax
:0041730F 7507                    jne 00417318
:00417311 663B7E06                cmp di, word ptr [esi+06]  / 看看④是否等於⑤?相等,則註冊成功
:00417315 0F95C0                  setne al
:00417318 5F                      pop edi
:00417319 5E                      pop esi
:0041731A C20400                  ret 0004



【第三步】:Call 00417241程式碼為:
:00417241 56                      push esi
:00417242 8B742408                mov esi, dword ptr [esp+08]
:00417246 668B4602                mov ax, word ptr [esi+02]    / ax = ②
:0041724A 6683660600              and word ptr [esi+06], 0000
:0041724F 663D0F27                cmp ax, 270F
:00417253 0F8788000000            ja 004172E1
:00417259 668B4E04                mov cx, word ptr [esi+04]  / cx = ③
:0041725D 6681F90F27              cmp cx, 270F
:00417262 777D                    ja 004172E1
:00417264 6685C0                  test ax, ax
:00417267 7474                    je 004172DD
:00417269 663DAE08                cmp ax, 08AE    / 0x08AE = 2222
:0041726D 746E                    je 004172DD
:0041726F 663D2E16                cmp ax, 162E    / 0x162E = 5678 ,第二個視窗中不能輸入2222或5678
:00417273 7468                    je 004172DD
:00417275 53                      push ebx
:00417276 55                      push ebp
:00417277 57                      push edi
:00417278 6A0A                    push 0000000A
:0041727A 0FB7F9                  movzx edi, cx                / edi = ③
:0041727D 0FB70E                  movzx ecx, word ptr [esi]    / ecx = ①
:00417280 0FB7C0                  movzx eax, ax                / eax = ②
:00417283 89442418                mov dword ptr [esp+18], eax
:00417287 8BC1                    mov eax, ecx                / eax = ③
:00417289 99                      cdq
:0041728A 5B                      pop ebx
:0041728B F7FB                    idiv ebx                    / eax = ③÷10
:0041728D 6A64                    push 00000064
:0041728F 5D                      pop ebp
:00417290 55                      push ebp
:00417291 8BD8                    mov ebx, eax                / ebx = ③÷10
:00417293 8BC7                    mov eax, edi
:00417295 99                      cdq
:00417296 F7FD                    idiv ebp                    / eax = ③÷100
:00417298 8B542418                mov edx, dword ptr [esp+18]  / edx = ②
:0041729C 03D3                    add edx, ebx
:0041729E 03C2                    add eax, edx
:004172A0 03C7                    add eax, edi                / eax = ②+③+③÷10+③÷100
:004172A2 5F                      pop edi
:004172A3 99                      cdq
:004172A4 F7FF                    idiv edi                    / eax = (②+③+③÷10+③÷100)÷100的商
                                                              / edx 為餘數
:004172A6 8B442414                mov eax, dword ptr [esp+14]
:004172AA 55                      push ebp
:004172AB 5B                      pop ebx
:004172AC 55                      push ebp
:004172AD 8B3C954C7F4300          mov edi, dword ptr [4*edx+00437F4C]  / 用餘數查表,表可以用 d 00437F4C 檢視

。。。。。。    下面的演算法分析同前,不再一一列出    。。。。。。

:004172B4 99                      cdq
:004172B5 6BFF64                  imul edi, 00000064
:004172B8 F7FB                    idiv ebx
:004172BA 8BD8                    mov ebx, eax
:004172BC 8BC1                    mov eax, ecx
:004172BE 99                      cdq
:004172BF F7FD                    idiv ebp
:004172C1 03CB                    add ecx, ebx
:004172C3 03C1                    add eax, ecx
:004172C5 59                      pop ecx
:004172C6 99                      cdq
:004172C7 F7F9                    idiv ecx
:004172C9 8B04954C7F4300          mov eax, dword ptr [4*edx+00437F4C]
:004172D0 03F8                    add edi, eax
:004172D2 33C0                    xor eax, eax
:004172D4 66897E06                mov word ptr [esi+06], di      / 將用①、②、③的值算出的值賦給 [esi+06]
                                                                / 此處得到的di就是⑤,在SoftICE環境下用?di
                                                                / 得到的十進位制的值就是你要輸入的第4個視窗的數字號碼
:004172D8 5F                      pop edi
:004172D9 5D                      pop ebp
:004172DA 5B                      pop ebx
:004172DB EB07                    jmp 004172E4
:004172DD 6A02                    push 00000002
:004172DF EB02                    jmp 004172E3
:004172E1 6A01                    push 00000001
:004172E3 58                      pop eax
:004172E4 5E                      pop esi
:004172E5 C20400                  ret 0004



【結果】
    經過跟蹤,得到註冊碼為:1710 8888 7777 5651

【後記】
    寫文章用的時間比跟蹤、研究演算法的時間要長的多得多。:(
    這篇文章就是用這個軟體寫成,感覺這個軟體真的不錯。:)


                                                                    2001年1月9日 by chn-boy

相關文章