• 标 题:高手请进!帮手指出这个算法里面的错误 (12千字)
  • 作 者:随风而去
  • 时 间:2001-12-17 13:19:38
  • 链 接:http://bbs.pediy.com

PauYyoung大哥你还记得这句话吗??
                ↓↓↓↓↓
            【有信心,凡事有可能】
                 
            【请各位大哥帮小弟找一下这个注册算法有什么错误】

      作者:随风而去[CNCG]
      所用时间:一周
      软件名:Dance Dance Revlution for winamp                     
      软件介绍: 
      此乃winamp的一个插件,可以让winamp实现跳舞毯的功能,
      没有注册前,不能使用跳舞毯,还有一个特殊效果也用不上。注册之后就没有这些限制了。

*************************************************************************************** 
 
      先运行winamp,招到此插件的配置窗口,然后点击注册,标准的注册窗口,用户名加注册码。
      先随便试了一下,有错误提示,,用trw追。
        下中断bpx
        hmemcpy,
        不要下pmodule,
        直接按F12,按了11下就回到程序了
        重新来一次,按10下F12后。
        按一下F10,来到如下的程序段:

  * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  |:10003740(C)
  |

  * Reference To: USER32.GetDlgItemTextA, Ord:0104h
                                    |
  :10003769 8B35D0B10010            mov esi, dword ptr [1000B1D0]//F10来到这里
  :1000376F 53                      push ebx
  :10003770 8B5C2430                mov ebx, dword ptr [esp+30]
  :10003774 6A64                    push 00000064
  :10003776 6830F40010              push 1000F430
  :1000377B 68FB030000              push 000003FB
  :10003780 53                      push ebx
  :10003781 FFD6                    call esi  <--取注册码长度放入EAX中
  :10003783 8D4C240C                lea ecx, dword ptr [esp+0C] <--D EDX可看假码
  :10003787 6A20                    push 00000020
  :10003789 51                      push ecx
  :1000378A 68FA030000              push 000003FA
  :1000378F 53                      push ebx
  :10003790 FFD6                    call esi
  :10003792 8D54240C                lea edx, dword ptr [esp+0C]
  :10003796 52                      push edx
  :10003797 6830F40010              push 1000F430  <--此处D 0287F430可看用户名
  :1000379C E8EFF7FFFF              call 10002F90 //这里有一个经典的对比,
                                                    所以这个CALL嫌疑非常大,
                                                    F8跟进到看看。
  :100037A1 83C408                  add esp, 00000008
  :100037A4 85C0                    test eax, eax
  :100037A6 0F84A3000000            je 1000384F
  :100037AC 8D442430                lea eax, dword ptr [esp+30]
  :100037B0 50                      push eax


  F8来到这里
  * Referenced by a CALL at Addresses:
  |:100010D8  , :1000379C 
  |
  :10002F90 83EC28                  sub esp, 00000028
  :10002F93 55                      push ebp
  :10002F94 8B6C2430                mov ebp, dword ptr [esp+30]
  :10002F98 85ED                    test ebp, ebp  <--看用户名是否为空   
  :10002F9A 57                      push edi
  :10002F9B 0F8429010000            je 100030CA
  :10002FA1 8B542438                mov edx, dword ptr [esp+38]
  :10002FA5 85D2                    test edx, edx  <--看注册码是否为空
  :10002FA7 0F841D010000            je 100030CA
  :10002FAD 8BFD                    mov edi, ebp
  :10002FAF 83C9FF                  or ecx, FFFFFFFF
  :10002FB2 33C0                    xor eax, eax
  :10002FB4 F2                      repnz
  :10002FB5 AE                      scasb
  :10002FB6 F7D1                    not ecx
  :10002FB8 49                      dec ecx
  :10002FB9 0F840B010000            je 100030CA
  :10002FBF 8BFA                    mov edi, edx
  :10002FC1 83C9FF                  or ecx, FFFFFFFF
  :10002FC4 F2                      repnz
  :10002FC5 AE                      scasb
  :10002FC6 F7D1                    not ecx
  :10002FC8 49                      dec ecx
  :10002FC9 0F84FB000000            je 100030CA
  :10002FCF 53                      push ebx
  :10002FD0 32DB                    xor bl, bl
  :10002FD2 B908000000              mov ecx, 00000008
  :10002FD7 8D7C2411                lea edi, dword ptr [esp+11]
  :10002FDB 885C2410                mov byte ptr [esp+10], bl
  :10002FDF 33D2                    xor edx, edx
  :10002FE1 F3                      repz
  :10002FE2 AB                      stosd
  :10002FE3 8BFD                    mov edi, ebp
  :10002FE5 83C9FF                  or ecx, FFFFFFFF
  :10002FE8 F2                      repnz
  :10002FE9 AE                      scasb
  :10002FEA F7D1                    not ecx
  :10002FEC 49                      dec ecx
  :10002FED 56                      push esi
  :10002FEE 85C9                    test ecx, ecx
  :10002FF0 894C243C                mov dword ptr [esp+3C], ecx
  :10002FF4 7E0A                    jle 10003000

  * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  |:10002FFE(C)
  |
  :10002FF6 8A042A                  mov al, byte ptr [edx+ebp] --| |注册名用十六进制放入al
  :10002FF9 32D8                    xor bl, al                  |    |    和BL异或后,
  :10002FFB 42                      inc edx                      |-----|BL再和第二位异或……
  :10002FFC 3BD1                    cmp edx, ecx                |    |到最后一位,得出BL
  :10002FFE 7CF6                    jl 10002FF6 -----------------|    |

  * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  |:10002FF4(C)
  |
  :10003000 33F6                    xor esi, esi

  * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  |:10003073(U)
  |
  :10003002 83FE08                  cmp esi, 00000008 //注册码不小于8个<1>    
  :10003005 7C07                    jl 1000300E//小于就跳
  :10003007 8D0409                  lea eax, dword ptr [ecx+ecx]//注册码是注册名*2
  :1000300A 3BF0                    cmp esi, eax //比较
  :1000300C 7D67                    jge 10003075 //大于或等于跳,跳到注册码比较

  * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  |:10003005(C)
  |
  :1000300E 8BFD                    mov edi, ebp
  :10003010 83C9FF                  or ecx, FFFFFFFF
  :10003013 33C0                    xor eax, eax
  :10003015 F2                      repnz
  :10003016 AE                      scasb
  :10003017 8BC6                    mov eax, esi
  :10003019 99                      cdq
  :1000301A F7D1                    not ecx
  :1000301C 2BC2                    sub eax, edx
  :1000301E 49                      dec ecx
  :1000301F D1F8                    sar eax, 1
  :10003021 33D2                    xor edx, edx
  :10003023 F7F1                    div ecx
  :10003025 83FE01                  cmp esi, 00000001
  :10003028 8BFA                    mov edi, edx
  :1000302A 7E05                    jle 10003031
  :1000302C 8D46FF                  lea eax, dword ptr [esi-01]
  :1000302F EB02                    jmp 10003033

  * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  |:1000302A(C)
  |
  :10003031 33C0                    xor eax, eax

  * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  |:1000302F(U)
  |
  :10003033 8A4C0414            |---mov cl, byte ptr [esp+eax+14]//正确的注册码从0位开始放入cl
  :10003037 32CB          <B>==|  xor cl, bl <---------------- //与上面得出的bl异或                   
  :10003039 80F18D              |  xor cl, 8D <---------------- //与8d异或                     
  :1000303C 8AD9                |---mov bl, cl <---------------- //放入bl, 保留着下次再计算                   
  :1000303E 885C2410                mov byte ptr [esp+10], bl   
  :10003042 8B542410                mov edx, dword ptr [esp+10]  //得出的结果放入<1>计算
  :10003046 52                      push edx
  :10003047 E8F4FEFFFF              call 10002F40 <------------- //-----------<1>
  :1000304C 8B4C2440                mov ecx, dword ptr [esp+40]
  :10003050 88443418                mov byte ptr [esp+esi+18], al //放入<1>计算的注册码
  :10003054 2BCF                    sub ecx, edi
  :10003056 8A5429FF            |---mov dl, byte ptr [ecx+ebp-01]----|  |注册名的最后一位和注册
  :1000305A 32D0          <C>==|  xor dl, al                      |===|码第二位异或,再与D8异
  :1000305C 80F2D8              |---xor dl, D8-----------------------|  |或。得出dl放入<1>计算
  :1000305F 52                      push edx                   
  :10003060 E8DBFEFFFF              call 10002F40 <------------- //-------------<1>
  :10003065 8B4C2444                mov ecx, dword ptr [esp+44]
  :10003069 83C408                  add esp, 00000008
  :1000306C 88443415                mov byte ptr [esp+esi+15], al //放入<1>计算的注册码 
  :10003070 83C602                  add esi, 00000002
  :10003073 EB8D                    jmp 10003002  <------------- //向上跳,跳到<1>
 
  * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  |:1000300C(C)
  |
  :10003075 8B742440                mov esi, dword ptr [esp+40] //这里是假码,下d esp+40
  :10003079 8D442414                lea eax, dword ptr [esp+14] //这里是真码,下d esp+14

  * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  |:1000309F(C)




跟进<1> *
*************************************
  * Referenced by a CALL at Addresses:
  |:10003047  , :10003060 
  |
  :10002F40 8B442404                mov eax, dword ptr [esp+04] //将结果放入EAX
  :10002F44 B93E000000              mov ecx, 0000003E <---------//ECX=3e
  :10002F49 25FF000000              and eax, 000000FF <---------//取EAX最后两位    
  :10002F4E 99                      cdq
  :10002F4F F7F9                    idiv ecx <------------------//eax/ecx  al=商 dl=余    
  :10002F51 B03D                    mov al, 3D <----------------//al=3d
  :10002F53 2AC2                    sub al, dl <----------------//al=al-dl
  :10002F55 3C09                    cmp al, 09 <----------------//比较
  :10002F57 88442404                mov byte ptr [esp+04], al  //al放入[esp+04]
  :10002F5B 761A                    jbe 10002F77 <--------------//不低于或等于
  :10002F5D 3C23                    cmp al, 23  <---------------//比较
  :10002F5F 8B442404                mov eax, dword ptr [esp+04] //[esp+04]放入eax
  :10002F63 7609                    jbe 10002F6E <--------------//不低于或等于
  :10002F65 25FF000000              and eax, 000000FF <---------//取EAX最后两位    
  :10002F6A 83C03D                  add eax, 0000003D <---------//eax=eax+3d
  :10002F6D C3                      ret

  * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  |:10002F63(C)
  |
  :10002F6E 25FF000000              and eax, 000000FF <---------//取EAX最后两位    
  :10002F73 83C037                  add eax, 00000037 <---------//eax=eax+37
  :10002F76 C3                      ret

  * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  |:10002F5B(C)
  |
  :10002F77 8B442404                mov eax, dword ptr [esp+04] //[esp+04]放入eax
  :10002F7B 25FF000000              and eax, 000000FF <---------//取EAX最后两位    
  :10002F80 83C030                  add eax, 00000030 <---------//eax=eax+30
  :10002F83 C3                      ret

  都不知道那些XOR是怎么计算的,现在写出过程!

  我的注册名:black

  整理:b与bl异或,bl再和第二位注册名异或得出bl再和第三位异或……到最后一位得出bl。
     
里异或的第一次过进
      bl与b(62)得bl=62   
      bl与l(6c)得bl=e
      bl与a(61)得bl=6f
      bl与c(63)得bl=c
      bl与k(6b)得bl=67
  <B>整理:正注册码的0位开始放入cl与上面的bl异或得出bl,bl与8d异或得出bl,bl保留下次现计。
      <B>里异或的第一次过进
  第一次 cl(0)与bl(67)得cl=67
          cl与8d得cl=ea       
          cl保留到bl=ea
  第二次 cl(30)与bl得cl=da
          cl与8d得cl=57
          cl保留到bl=57
  第三次 cl(54)与bl得cl=3
          cl与8d得cl=8e       
          cl保留到bl=8e
  第四次 cl(63)与bl得cl=ed
          cl与8d得cl=60       
          cl保留到bl=60
  第五次 cl(48)与bl得cl=28
          cl与8d得cl=a5       
          cl保留到bl=a5
  <C>整理:注册名的最后一位dl和注册码第一位al异或,得出dl位异或,再与D8异或……得出dl
      <C>里异或的第一次过进
  第一次  dl(67)与al(44)得dl=2f
          dl与D8得dl=f7
  第二次  dl(63)与al(61)得dl=2
          dl与D8得dl=da
  第三次  dl(61)与al(68)得dl=9
          dl与D8得dl=d1
  第四次  dl(6c)与al(52)得dl=32
          dl与D8得dl=e6
  第五次  dl(62)与al(4d)得dl=29
          dl与D8得dl=f1
        【请大哥级的高手帮一下小弟,讲解一下
<B><C>xor的计算过程】

    最后得出
    注册名:black
    注册码:D0aTHcRHK6 (注意大小写)
     
                  要各位大哥们帮我写个注册机来
                          先谢谢大哥们了
                           

  • 标 题:一点小意见,不知对否…… (3千字)
  • 作 者:LILITH[CNCG]
  • 时 间:2001-12-17 20:41:42

与我同时出道的随风而去[CNCG]兄今天终于搞出了他的第一个算法,实在是可喜可贺!呵呵,我看了看,但居然发现有一些地方还存在问题,最奇怪的是我跟踪过程中看到的地址竟完全不同,不过指令大致一样,所以写了出来,望大家多多指教。
具体跟踪过程及取注册码风兄已说得很清楚,在此不再哆嗦,只是我跟的地址有所不同,所以我干脆一步到位,下bpx GETDLGITEMTEXTA断点,再按一下F12就到达程序领空,不用按10次F10,然后跟进风兄提及到的第一个Call中。


0177:015C2F90  SUB      ESP,BYTE +28
0177:015C2F93  PUSH    EBP
0177:015C2F94  MOV      EBP,[ESP+30]
0177:015C2F98  TEST    EBP,EBP
0177:015C2F9A  PUSH    EDI
0177:015C2F9B  JZ      NEAR 015C30CA
0177:015C2FA1  MOV      EDX,[ESP+38]
0177:015C2FA5  TEST    EDX,EDX
0177:015C2FA7  JZ      NEAR 015C30CA
0177:015C2FAD  MOV      EDI,EBP
0177:015C2FAF  OR      ECX,BYTE -01
0177:015C2FB2  XOR      EAX,EAX
0177:015C2FB4  REPNE SCASB
0177:015C2FB6  NOT      ECX
0177:015C2FB8  DEC      ECX
0177:015C2FB9  JZ      NEAR 015C30CA
0177:015C2FBF  MOV      EDI,EDX
0177:015C2FC1  OR      ECX,BYTE -01
0177:015C2FC4  REPNE SCASB
0177:015C2FC6  NOT      ECX
0177:015C2FC8  DEC      ECX
0177:015C2FC9  JZ      NEAR 015C30CA
0177:015C2FCF  PUSH    EBX
0177:015C2FD0  XOR      BL,BL
0177:015C2FD2  MOV      ECX,08
0177:015C2FD7  LEA      EDI,[ESP+11]
0177:015C2FDB  MOV      [ESP+10],BL
0177:015C2FDF  XOR      EDX,EDX
0177:015C2FE1  REP STOSD
0177:015C2FE3  MOV      EDI,EBP
0177:015C2FE5  OR      ECX,BYTE -01
0177:015C2FE8  REPNE SCASB
0177:015C2FEA  NOT      ECX
0177:015C2FEC  DEC      ECX
0177:015C2FED  PUSH    ESI
0177:015C2FEE  TEST    ECX,ECX
0177:015C2FF0  MOV      [ESP+3C],ECX
0177:015C2FF4  JNG      015C3000
0177:015C2FF6  MOV      AL,[EDX+EBP] \\取用户名第一位字母十六进制值并存入al
0177:015C2FF9  XOR      BL,AL        \\al与bl相异或,结果存入bl
0177:015C2FFB  INC      EDX          \\edx的值递增,初值为0
0177:015C2FFC  CMP      EDX,ECX      \\取完一位后edx的值变1,与ecx比较,(ecx值为用户名长度)
0177:015C2FFE  JL      015C2FF6   \\当edx小于ecx时跳到上面继续取用户名,至取完后则跳
0177:015C3000  XOR      ESI,ESI      \\这里esi清零
0177:015C3002  CMP      ESI,BYTE +08 \\奇怪的是上面清零后esi当然不可能等于8
0177:015C3005  JL      015C300E   \\我跟到这里是不跳的,只有改变跳转才能去到计注册码的地方?
0177:015C3007  LEA      EAX,[ECX+ECX]
0177:015C300A  CMP      ESI,EAX
0177:015C300C  JNL      015C3075
0177:015C300E  MOV      EDI,EBP
0177:015C3010  OR      ECX,BYTE -01
0177:015C3013  XOR      EAX,EAX
0177:015C3015  REPNE SCASB
0177:015C3017  MOV      EAX,ESI
0177:015C3019  CDQ   
0177:015C301A  NOT      ECX
0177:015C301C  SUB      EAX,EDX
0177:015C301E  DEC      ECX
0177:015C301F  SAR      EAX,1
0177:015C3021  XOR      EDX,EDX
0177:015C3023  DIV      ECX
0177:015C3025  CMP      ESI,BYTE +01
0177:015C3028  MOV      EDI,EDX
0177:015C302A  JNG      015C3031
0177:015C302C  LEA      EAX,[ESI-01]
0177:015C302F  JMP      SHORT 015C3033
0177:015C3031  XOR      EAX,EAX
0177:015C3033  MOV      CL,[ESP+EAX+14]
0177:015C3037  XOR      CL,BL
0177:015C3039  XOR      CL,8D
0177:015C303C  MOV      BL,CL
0177:015C303E  MOV      [ESP+10],BL
0177:015C3042  MOV      EDX,[ESP+10]
0177:015C3046  PUSH    EDX
0177:015C3047  CALL    015C2F40
0177:015C304C  MOV      ECX,[ESP+40]
0177:015C3050  MOV      [ESP+ESI+18],AL
0177:015C3054  SUB      ECX,EDI
0177:015C3056  MOV      DL,[ECX+EBP-01]
0177:015C305A  XOR      DL,AL
0177:015C305C  XOR      DL,D8
0177:015C305F  PUSH    EDX
0177:015C3060  CALL    015C2F40
0177:015C3065  MOV      ECX,[ESP+44]
0177:015C3069  ADD      ESP,BYTE +08
0177:015C306C  MOV      [ESP+ESI+15],AL
0177:015C3070  ADD      ESI,BYTE +02
0177:015C3073  JMP      SHORT 015C3002
0177:015C3075  MOV      ESI,[ESP+40]\\经过上面的跳转已经来到这里,假注册出现
0177:015c3079  lea eax, dword ptr [esp+14] //这里存放了真的注册码,下d  esp+14

总结:跟了一遍,发现与风兄所写的有很大出入,不知是否我的Winamp版本问题?
我的注册名和注册码:
CNCG
rApCpHu9


谨以此文献给我的好朋友风兄!

  • 标 题:靠,MASM32注册机!!!! (5千字)
  • 作 者:WenXinJY
  • 时 间:2001-12-18 8:29:17

;=====dwakg.asm=====
;去掉了.data段的6个定义,加上了自动生成注册码功能,去除了错误提示。其余两个文件照旧。
.386
.model flat,stdcall
option casemap:none
include hd.h
  _WinMain Proto  :DWORD,:DWORD,:DWORD,:DWORD
  Calculation Proto

.const
  DLG_MAIN  equ    1000
  IDC_UN    equ    1001
  IDC_SN    equ    1002
  ID_GEN    equ    1003
  ID_EXIT  equ    1004

.data
MsgCap        db "Dance Revlution for winamp 注册机      by WenXinJY",0
hInstance    dd 0
UserLen      dd 0
szFormat      db "%i",0
UserID        db 80 dup (0)
SN            db 80 dup (0)

.radix 16

.code
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _WinMain,NULL
invoke ExitProcess,NULL

_WinMain  proc    uses ebx edi esi, \
          hWnd:DWORD,wMsg:DWORD,wParam:DWORD,lParam:DWORD
         
          mov    eax,wMsg
          .if    eax == WM_CLOSE
                invoke    EndDialog,hWnd,NULL
          .elseif eax == WM_INITDIALOG
                  invoke SetWindowText,hWnd,ADDR MsgCap
                  invoke SendDlgItemMessage,hWnd,IDC_SN,EM_SETREADONLY,TRUE,NULL
          .elseif eax == WM_COMMAND
                  mov eax,wParam
                      AND EAX,0FFFFH
                      CMP EAX,IDC_UN
                      JZ gENkEY
                  .IF lParam!=0
                      .if eax==ID_GEN
gENkEY:
                          invoke RtlZeroMemory,addr UserID,80
                          invoke RtlZeroMemory,addr SN,80
                          invoke GetDlgItemText, hWnd, IDC_UN, addr UserID, 80
                          .if  eax!=NULL
                              mov UserLen,eax
                              invoke Calculation
                              invoke SetDlgItemText, hWnd, IDC_SN, addr SN
                          .endif
                      .elseif eax==ID_EXIT
                          invoke SendMessage,hWnd,WM_CLOSE,NULL,NULL
                      .endif
                  .ENDIF
          .else
                  mov eax,FALSE
                  ret
          .endif
          mov eax,TRUE
          ret
_WinMain  ENDP       


Calculation Proc
            pushad
            lea esi,UserID
            xor ebx,ebx
            mov ecx,UserLen
            mov ebp,ecx
            shl ebp,1
Cal_Lop_1:
            lodsb
            xor bl,al      ;don't change bl
            loop Cal_Lop_1

            xor esi,esi
Cal_Next:
            cmp esi,8
            jl Cal_Lab_0
            cmp esi,ebp
            jge Cal_Exit
Cal_Lab_0:
            mov eax,esi
            test eax,eax
            jz Cal_Lab_1
            dec eax
Cal_Lab_1:
            mov edi,esi
            shr edi,1    ;save
            mov cl,SN[eax]
            xor cl,bl
            xor cl,8dh
            mov bl,cl      ;save
            movzx eax,cl
            mov ecx,3eh
            cdq
            idiv ecx
            mov al,3Dh
            sub al,dl
            cmp al,9
            jbe Cal_OK_11
            cmp al,0ah+1ah  ;10个数字+26个大写字母
            jb Cal_OK_12
            add al,'a'-(0a+1ah)      ;转化为小写字母
            jmp Cal_Lab_3
Cal_OK_11:           
            add al,'0'                ;转化为数字
            jmp Cal_Lab_3
Cal_OK_12:
            add al,'A'-0ah            ;转化为大写字母
Cal_Lab_3:
            mov SN[esi],al
           
            mov ecx,UserLen
            sub ecx,edi
            mov dl,UserID[ecx-1]
            xor dl,al
            xor dl,0d8h
            movzx eax,dl
            mov ecx,3eh
            cdq
            idiv ecx
            mov al,3dh
            sub al,dl
            cmp al,9
            jbe Cal_OK_21
            cmp al,0ah+1ah  ;10个数字+26个大写字母
            jb Cal_OK_22
            add al,'a'-(0a+1ah)      ;转化为小写字母
            jmp Cal_Lab_4
Cal_OK_21:           
            add al,'0'                ;转化为数字
            jmp Cal_Lab_4
Cal_OK_22:
            add al,'A'-0ah            ;转化为大写字母
Cal_Lab_4:
            inc esi
            mov SN[esi],al
            inc esi
            jmp Cal_Next
Cal_Exit:           
            popad
            ret
Calculation Endp
            End start
;======dfwakg.rc=========
#include <\masm32\include\resource.h>
#define DLG_MAIN  1000
#define IDC_UN    1001
#define IDC_SN    1002
#define ID_GEN    1003
#define ID_EXIT  1004
2      icon      key.ico
DLG_MAIN DIALOG 64,53,240,52
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Dance Revlution for winamp 注册机      by WenXinJY"
FONT 9, "宋体"
{
DEFPUSHBUTTON "注册", ID_GEN, 200, 8, 30, 14
PUSHBUTTON "退出", ID_EXIT, 200, 26, 30, 14
EDITTEXT IDC_UN, 40, 10, 150, 12, WS_BORDER | WS_TABSTOP
EDITTEXT IDC_SN, 40, 29, 150, 13, WS_BORDER | WS_TABSTOP
LTEXT "用户名:", -1, 8, 12, 30, 10
LTEXT "注册码:", -1, 8, 30, 30, 9
}

;========hd.h==========
      include \masm32\include\windows.inc
      include \masm32\include\user32.inc
      include \masm32\include\kernel32.inc
      include \masm32\include\gdi32.inc
      include \masm32\include\comctl32.inc
      include \masm32\include\comdlg32.inc
      include \masm32\include\shell32.inc
      include \masm32\include\advapi32.inc

      includelib \masm32\lib\user32.lib
      includelib \masm32\lib\kernel32.lib
      includelib \masm32\lib\gdi32.lib
      includelib \masm32\lib\comctl32.lib
      includelib \masm32\lib\comdlg32.lib
      includelib \masm32\lib\shell32.lib
      includelib \masm32\lib\advapi32.lib