• 标 题:UltraEdit32 v10找注册码+去暗桩
  • 作 者:loveboom
  • 时 间:
  • 链 接:http://bbs.pediy.com

UltraEdit32 v10找注册码+去暗桩
【目    标】: UltraEdit32 v10
【工    具】:Olydbg1.1(diy版)
【任    务】:找到注册码并去除暗桩
【操作平台】:WINDOWS 2000 ADV
【作    者】:loveboom[DFCG]
【相关链接】: www.UltraEdit.com
【简要说明】:近来没有钱买U盘,也没钱上网,就在单位里翻了一下旧光盘,也就找到了这东西。.
【详细过程】:
安装运行Uedit32,并输入如下信息:
假码信息:
Name:loveboom[DFCG]
SN: 77585-52013-13520-02514
完毕后,软件告诉你,要重启来验证。那我们就用OD重新载入它.下断bpx CreateFileA再运行,这样中断几次后看到堆栈:
0012F970   014F61F8  |FileName = "C:Program FilesUltraEditUedit32.REG"
0012F974   80000000  |Access = GENERIC_READ
0012F978   00000000  |ShareMode = 0
0012F97C   0012FA9C  |pSecurity = 0012FA9C
0012F980   00000003  |Mode = OPEN_EXISTING
0012F984   00000080  |Attributes = NORMAL
0012F988   00000000  hTemplateFile = NULL
也就是这里中断了
0051B162  |.  51            PUSH ECX                                 ; |Access
0051B163  |.  FF75 08       PUSH DWORD PTR SS:[EBP+8]                ; |这里就是文件名:Uedit32.reg
0051B166  |.  FF15 38D45400 CALL DWORD PTR DS:[<&KERNEL32.CreateFile>; CreateFileA
0051B16C  |.  83F8 FF       CMP EAX,-1
0051B16F  |.  75 28         JNZ SHORT Uedit32.0051B199               ;  如果CreateFileA成功的话就跳
按一会F8到这里
00448421   .  68 02010000   PUSH 102                                 ; /Arg2 = 00000102
00448426   .  50            PUSH EAX                                 ; |Arg1
00448427   .  8D4D E4       LEA ECX,DWORD PTR SS:[EBP-1C]            ; |
0044842A   .  E8 792D0D00   CALL Uedit32.0051B1A8          //这里进去的话就知道是ReadFile了,
0044842F   .  8D4D E4       LEA ECX,DWORD PTR SS:[EBP-1C]
……
00448443   > /8A8C35 79FDFF>MOV CL,BYTE PTR SS:[EBP+ESI-287]
0044844A   . |8A8435 78FDFF>MOV AL,BYTE PTR SS:[EBP+ESI-288]
00448451   . |FEC9          DEC CL
00448453   . |FEC8          DEC AL
00448455   . |888C35 7CFEFF>MOV BYTE PTR SS:[EBP+ESI-184],CL
0044845C   . |888435 7DFEFF>MOV BYTE PTR SS:[EBP+ESI-183],AL
00448463   . |46            INC ESI
00448464   . |46            INC ESI
00448465   . |3BF7          CMP ESI,EDI
00448467   .^7E DA         JLE SHORT Uedit32.00448443    //循环解密数据
00448469   .  8D85 7CFEFFFF LEA EAX,DWORD PTR SS:[EBP-184]
现在再下断bpx CreateWindowExA也就是创建窗口API函数,运行后第一次中断:
0047A73F   .  53            PUSH EBX                                 ; |Style
0047A740   .  57            PUSH EDI                                 ; |WindowName
0047A741   .  57            PUSH EDI                                 ; |Class
0047A742   .  53            PUSH EBX                                 ; |ExtStyle
0047A743   .  FF15 0CD85400 CALL DWORD PTR DS:[<&USER32.CreateWindow> //CreateWindowExA 中断在这里
0047A749   .  A3 74DA5900   MOV DWORD PTR DS:[59DA74],EAX
0047A74E   .  8D86 04050000 LEA EAX,DWORD PTR DS:[ESI+504]                          ;  用户名"loveboom[DFCG]"入EAX
0047A754   .  8858 10       MOV BYTE PTR DS:[EAX+10],BL
0047A757   .  FF35 D8335900 PUSH DWORD PTR DS:[5933D8]                              ;  push假码所在的地址
0047A75D   .  6A 01         PUSH 1
0047A75F   .  50            PUSH EAX
0047A760   .  FF75 F0       PUSH DWORD PTR SS:[EBP-10]
0047A763   .  E8 50DEF9FF   CALL Uedit32.004185B8                                   ;  关键Call跟进
0047A768   .  83C4 10       ADD ESP,10
0047A76B   .  85C0          TEST EAX,EAX
0047A76D   .  0F84 29020000 JE Uedit32.0047A99C
……
跟进后来到这里:
004185C2  |.  57            PUSH EDI
004185C3  |.  8B7D 08       MOV EDI,DWORD PTR SS:[EBP+8]                            ;  EDI="loveboom[DFCG]"
004185C6  |.  57            PUSH EDI                                                ;  push Name
004185C7  |.  E8 C46F0E00   CALL Uedit32.004FF590
004185CC  |.  33DB          XOR EBX,EBX
004185CE  |.  59            POP ECX
004185CF  |.  395D 14       CMP DWORD PTR SS:[EBP+14],EBX
004185D2  |.  74 0A         JE SHORT Uedit32.004185DE
004185D4  |.  C705 E4335900>MOV DWORD PTR DS:[5933E4],1
004185DE  |>  395D 10       CMP DWORD PTR SS:[EBP+10],EBX
004185E1  |.  0F84 25030000 JE Uedit32.0041890C
004185E7  |.  83F8 06       CMP EAX,6                                               ;  用户长度和6相比
004185EA  |.  0F8C 1C030000 JL Uedit32.0041890C                                     ;  这里一跳就over
004185F0  |.  8065 EC 00    AND BYTE PTR SS:[EBP-14],0
……
0041860F  |.  59            POP ECX                                                 ;  pop user name
00418610  |.  6A 3C         PUSH 3C
00418612  |.  5E            POP ESI
00418613  |.  3BC6          CMP EAX,ESI
00418615  |.  77 09         JA SHORT Uedit32.00418620
00418617  |.  57            PUSH EDI
00418618  |.  E8 736F0E00   CALL Uedit32.004FF590
0041861D  |.  59            POP ECX
0041861E  |.  8BF0          MOV ESI,EAX                                             ;  esi=len("loveboom[DFCG]"=0xE(14)
00418620  |>  8975 F4       MOV DWORD PTR SS:[EBP-C],ESI
00418623  |.  33C9          XOR ECX,ECX
00418625  |>  8AC1          /MOV AL,CL
00418627  |.  B2 03         |MOV DL,3
00418629  |.  F6EA          |IMUL DL
0041862B  |.  2AC2          |SUB AL,DL
0041862D  |.  88840D 70FFFF>|MOV BYTE PTR SS:[EBP+ECX-90],AL
00418634  |.  41            |INC ECX
00418635  |.  83F9 3D       |CMP ECX,3D
00418638  |.^ 72 EB         JB SHORT Uedit32.00418625
0041863A  |.  56            PUSH ESI
0041863B  |.  8D85 70FFFFFF LEA EAX,DWORD PTR SS:[EBP-90]
00418641  |.  57            PUSH EDI                                                ;  push 用户名
00418642  |.  50            PUSH EAX
00418643  |.  E8 48730E00   CALL Uedit32.004FF990
00418648  |.  80A435 70FFFF>AND BYTE PTR SS:[EBP+ESI-90],0
00418650  |.  83C4 0C       ADD ESP,0C
00418653  |.  33C9          XOR ECX,ECX
00418655  |.  4E            DEC ESI
00418656  |.  6A 01         PUSH 1
00418658  |.  894D F0       MOV DWORD PTR SS:[EBP-10],ECX
0041865B  |.  5A            POP EDX
0041865C  |.  3BF2          CMP ESI,EDX
0041865E  |.  7E 3A         JLE SHORT Uedit32.0041869A
00418660  |.  C745 10 02000>MOV DWORD PTR SS:[EBP+10],2
00418667  |>  0FBEBC15 6FFF>/MOVSX EDI,BYTE PTR SS:[EBP+EDX-91]                     ;  这里开始就是一堆算法了,有兴趣的一步一步跟吧
0041866F  |.  0FBE9C15 71FF>|MOVSX EBX,BYTE PTR SS:[EBP+EDX-8F]
……
算法那么长的,我没心去研究所以直接F4到下面:
004188EA  |. /74 26         JE SHORT Uedit32.00418912
004188EC  |. |8D85 30FFFFFF LEA EAX,DWORD PTR SS:[EBP-D0]                           ;  到这里就可以看到真码入eax了
004188F2  |. |50            PUSH EAX                                                ;  真码入栈
004188F3  |. |8D45 B0       LEA EAX,DWORD PTR SS:[EBP-50]                           ;  假码入eax再同样入栈
004188F6  |. |50            PUSH EAX                                                ;  假码入栈
004188F7  |. |E8 E4860E00   CALL Uedit32.00500FE0                                   ;  既然真假码都入栈,那这个Call就可以猜到它是进行比较的了
004188FC  |. |59            POP ECX
004188FD  |. |85C0          TEST EAX,EAX

这里就看到真假码了(堆栈):
0012F9F8   0012FA88  ASCII "70585-52010-03020-02510"
0012F9FC   0012FA08  ASCII "R0D3G-Y6A50-0106M-Y6R40"
……
上面那个比较Call进入后就看到这里了:
00500FE0  /$  8B5424 04     MOV EDX,DWORD PTR SS:[ESP+4]                            ;  假码入edx
00500FE4  |.  8B4C24 08     MOV ECX,DWORD PTR SS:[ESP+8]                            ;  真码入ecx
00500FE8  |.  F7C2 03000000 TEST EDX,3
00500FEE  |.  75 3C         JNZ SHORT Uedit32.0050102C                              ;  比较够不够"资格"先,不够就跳也就over了
00500FF0  |>  8B02          /MOV EAX,DWORD PTR DS:[EDX]                             ;  这一段就是一个一个比较了,
00500FF2  |.  3A01          |CMP AL,BYTE PTR DS:[ECX]
00500FF4  |.  75 2E         |JNZ SHORT Uedit32.00501024                             ;  发现不同就over了
00500FF6  |.  0AC0          |OR AL,AL
现在我们就得到了自己的正确的注册码了,其实跟过几次之后发现有一个更快的方法找到真码。方法是:在CreateFileA对uedit32.reg文件操作的下一次CreateFileA也就是操作uedit32.cfg的时候D esp+64就可以看到真码。注册码是找到了,但我们运行一次后就会发现退出时它把注册文件给删除了,也就是说有暗桩。所以我们要把这个”二五仔”给揪出来。既然它要删除文件那么我们就下bpx DeleteFileA来拦住它。注册成功后再次用OD载入并运行,再下删除文件断,下断后退出uedit,这样就可以拦下:
004487BC   .  68 80000000   PUSH 80                                                 ; /FileAttributes = NORMAL
004487C1   .  FF75 F0       PUSH DWORD PTR SS:[EBP-10]                              ; |FileName
004487C4   .  FF15 9CD45400 CALL DWORD PTR DS:[<&KERNEL32.SetFileAttributesA>]      ; SetFileAttributesA
004487CA   .  FF75 F0       PUSH DWORD PTR SS:[EBP-10]                              ; /FileName
004487CD   .  FF15 C0D45400 CALL DWORD PTR DS:[<&KERNEL32.DeleteFileA>]             ; 这里拦住了
004487D3   .  A1 48D15900   MOV EAX,DWORD PTR DS:[59D148]
找到了就好办了,从NOP掉4487ca和4487cd两行。
好了,现在再试试运行没什么问题了。

【总    结】
注册信息:
Name:loveboom[DFCG]
SN:R0D3G-Y6A50-0106M-Y6R40
去暗桩:
004487CA  FF 75 F0 FF 15 C0 D4 54 00                       u? 涝T.裏
改为
004487CA  90 90 90 90 90 90 90 90 90                       悙悙悙悙悺H裏.

献给我亲爱的DFCG,愿它能够蒸蒸日上!
Thanks:
Fly 辉仔yock、jingulong、二哥、所有曾经关心支持或帮助过我的朋友!谢谢您们!
                    by  loveboom[DFCG]                           
                    Email:bmd2chen@tom.com                          
2004-3-15