• 标 题:ultraedit9.10
  • 作 者:qqj1228
  • 时 间:2003/06/20 01:16am
  • 链 接:http://bbs.pediy.com

小弟学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
这是小弟的处女破文,还望各位前辈高人批评指正。