ultraedit9.10

看雪資料發表於2003-06-20

小弟學pj已經2,3個禮拜了,還沒正式找過一款軟體的註冊碼,這次就下定決心那ultraedit v9.10開刀。
以前剛學pj時爆破過它,去掉了時間限制和nag視窗,但是總覺得不爽,這次我參考了看雪精華四上oake寫的文章,找到了他的註冊碼,在此謝謝oake前輩了。
廢話講完正式進入主題:
軟體名稱:ultraedit v9.10
軟體簡介:地球人都知道
下載地址:到處都是
破解目的:找出註冊碼
破解工具:ollydbg v1.09b
破解說明:該軟體採用key檔案保護方式,輸入註冊名:qqj1228,註冊碼:12345-67890-abcde-fghij(該形式是從oake前輩文章裡看到的)後確定,要求重起,然後會在安裝資料夾下生成與主檔案同名的key檔案以reg作為副檔名。重起後會讀取改檔案的內容判斷註冊與否。
於是用redfile下斷,f9執行來到最後一次中斷處,看堆疊的內容可知是讀key檔案的,於是f8跟蹤,可是我跟了半天就是沒找到比較註冊碼的地方,只知道它把key檔案裡的內容讀取後進行解密轉換成輸入的使用者名稱和註冊碼,然後在哪比較楞是沒找到。跟到後面會有一很大的迴圈反覆呼叫peekmessaga,我是新手不知道這個api是幹什麼的,就直接跳出迴圈。但是跳出之後軟體就彈出註冊視窗(已經過了試用期),這下咋辦?
後又看了oake前輩的文章,想到可以CreateWindowExA下斷,於是實行。
程式在redfile key檔案的斷點後中斷於CreateWindowExA處,如下:
00474342   .  A1 48C55800         MOV     EAX, DWORD PTR DS:[58C548]
00474347   .  53                  PUSH    EBX                                ; /lParam = NULL
00474348   .  FF77 68             PUSH    DWORD PTR DS:[EDI+68]              ; |hInst = 00400000
0047434B   .  895D FC             MOV     DWORD PTR SS:[EBP-4], EBX          ; |
0047434E   .  53                  PUSH    EBX                                ; |hMenu = NULL
0047434F   .  FF70 1C             PUSH    DWORD PTR DS:[EAX+1C]              ; |hParent = 007D027C ('UltraEdit-32 - [Edit1]',class='Afx:400000:8:10011:0:4160323')
00474352   .  53                  PUSH    EBX                                ; |Height = 0
00474353   .  53                  PUSH    EBX                                ; |Width = 0
00474354   .  53                  PUSH    EBX                                ; |Y = 0
00474355   .  53                  PUSH    EBX                                ; |X = 0
00474356   .  53                  PUSH    EBX                                ; |style = WS_OVERLAPPED
00474357   .  56                  PUSH    ESI                                ; |WindowName = "UEAfx:200:0x0008:0:010"
00474358   .  56                  PUSH    ESI                                ; |Class = "UEAfx:200:0x0008:0:010"
00474359   .  53                  PUSH    EBX                                ; |Extstyle = 0
0047435A   .  FF15 ECF75300       CALL    DWORD PTR DS:[<&USER32.CreateWindo>; \CreateWindowExA
00474360   .  A3 74C25800         MOV     DWORD PTR DS:[58C274], EAX
00474365   .  8D87 00050000       LEA     EAX, DWORD PTR DS:[EDI+500]
0047436B   .  8858 10             MOV     BYTE PTR DS:[EAX+10], BL
0047436E   .  FF35 64275800       PUSH    DWORD PTR DS:[582764]
00474374   .  6A 01               PUSH    1
00474376   .  50                  PUSH    EAX
00474377   .  FF75 F0             PUSH    DWORD PTR SS:[EBP-10]
0047437A   .  E8 5A2BFAFF         CALL    UEDIT32.00416ED9                   ;F8過這個CALL後即可看到註冊碼
0047437F   .  83C4 10             ADD     ESP, 10
00474382   .  85C0                TEST    EAX, EAX
00474384   .  0F84 89010000       JE      UEDIT32.00474513
0047438A   .  391D 18C55800       CMP     DWORD PTR DS:[58C518], EBX
00474390   .  0F85 7D010000       JNZ     UEDIT32.00474513
00474396   .  68 74AE5700         PUSH    UEDIT32.0057AE74                   ;  ASCII "Extension License"
0047439B   .  B9 68275800         MOV     ECX, UEDIT32.00582768              ;  ASCII "(??
004743A0   .  E8 D8FB0800         CALL    UEDIT32.00503F7D

馬上抄下注冊碼。hehe不要高興的太早,若用這個註冊碼的話剛進入程式時確實註冊成功了,但是在你關閉程式時它又會把剛生成的key檔案刪了,又變成未註冊的了。這又難倒我這個菜鳥了,oake前輩的文章裡也沒提到,看來只能自力更生了。
既然它會刪檔案,那一定會呼叫deletefilea等api,我就在此下斷。
用ollydbg重新載入ultraedit,f9執行,返回程式關了它,馬上被OD斷下,向上找是否有指令可跳過它,來到:

004452B3   .  A1 80275800         MOV     EAX, DWORD PTR DS:[582780]
004452B8   .  FF35 64275800       PUSH    DWORD PTR DS:[582764]
004452BE   .  8945 E4             MOV     DWORD PTR SS:[EBP-1C], EAX
004452C1   .  E8 6AC40A00         CALL    UEDIT32.004F1730
004452C6   .  59                  POP     ECX                                ;  00E43E38
004452C7   .  83F8 0F             CMP     EAX, 0F                            ;比較註冊碼的位數是否小於15,若小於15則跳走不刪檔案
004452CA   .  59                  POP     ECX                                ;  00E43E38
004452CB   .  0F82 F7000000       JB      UEDIT32.004453C8
004452D1   .  391D 14C55800       CMP     DWORD PTR DS:[58C514], EBX         ;ebx=0為註冊標誌,與[58C514]=0比較,不等則跳走不刪檔案
004452D7   .  0F85 EB000000       JNZ     UEDIT32.004453C8
004452DD   .  391D 18C55800       CMP     DWORD PTR DS:[58C518], EBX         ;同上,與[58C518]=1比較,等則跳走不刪檔案。即若是不正確的註冊碼則不會刪檔案
004452E3   .  0F84 DF000000       JE      UEDIT32.004453C8
004452E9   .  0FB67D E4           MOVZX   EDI, BYTE PTR SS:[EBP-1C]          ;取計算係數(d7)
004452ED   .  8BC7                MOV     EAX, EDI
004452EF   .  6A 0D               PUSH    0D
004452F1   .  99                  CDQ
004452F2   .  5B                  POP     EBX                                ;  00E43E38
004452F3   .  8B0D 64275800       MOV     ECX, DWORD PTR DS:[582764]         ;取註冊碼存放地址
004452F9   .  F7FB                IDIV    EBX
004452FB   .  0FBE41 10           MOVSX   EAX, BYTE PTR DS:[ECX+10]          ;取註冊碼的第17位(即第3段最後1位)的ascii值
004452FF   .  83C2 41             ADD     EDX, 41
00445302   .  3BC2                CMP     EAX, EDX                           ;取得的值與(d7%0d+41)的計算結果比較,不等則刪檔案
00445304   .  75 19               JNZ     SHORT UEDIT32.0044531F
00445306   .  8BC7                MOV     EAX, EDI
00445308   .  6A 18               PUSH    18
0044530A   .  99                  CDQ
0044530B   .  5F                  POP     EDI                                ;  00E43E38
0044530C   .  8A49 08             MOV     CL, BYTE PTR DS:[ECX+8]            ;取註冊碼的第9位(即第2段第3位)的ascii值
0044530F   .  F7FF                IDIV    EDI
00445311   .  0FBEC1              MOVSX   EAX, CL
00445314   .  83C2 41             ADD     EDX, 41
00445317   .  3BC2                CMP     EAX, EDX                           ;取得的值與(d7%18+41)的計算結果比較,不等則刪檔案
00445319   .  0F84 A7000000       JE      UEDIT32.004453C6
0044531F   >  33DB                XOR     EBX, EBX
hehe原來它在關閉時還要對註冊碼進行比較,不對就幹掉你的key檔案,總結以下:
註冊名:qqj1228
註冊碼:R2R0Z-A1X7E-02N2H-K503K
這是小弟的處女破文,還望各位前輩高人批評指正。