金鳞化龙 - 老白


智者创造机会,强者把握机会,弱者等待机会~
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

用汇编写的CrackMe

Posted on 2005-11-17 21:55  秋衫客  阅读(228)  评论(0)    收藏  举报
;---------------------------------------------------------------
;【程序名称】:我的小CrackMe,^-^
;【适用系统】:Win98以上
;【作    者】:wHt
;【日    期】:2005-7-15
;【版    权】:没有^Q^,但如欲转载,请保持本程序的完整,并注明:
;              转载自“www.aogosoft.com”。(大家好像写上流行这个)
;----------------------------------------------------------------

     1 ;----------------
     2 ;编译模式="DLG"
     3 ;----------------
     4
     5    .586
     6    .Model Flat, StdCall
     7    Option Casemap :None
     8 ;-------------------------------------------------------
     9 ;导入库
    10    Include windows.inc
    11    Include Kernel32.inc
    12    Include User32.inc
    13
    14    includelib Kernel32.lib
    15    includelib User32.lib
    16 ;-------------------------------------------------------
    17
    18 ;-------------------------------------------------------
    19 ;过程声明
    20    DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD
    21    CryptName proto :DWORD,:DWORD,:DWORD
    22    CryptCodeCompName proto :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
    23    DeCryptCode proto :DWORD
    24    _Debug proto :DWORD,:DWORD
    25    CreateFunc proto :DWORD,:DWORD
    26 ;-------------------------------------------------------
    27
    28 ;-------------------------------------------------------
    29 ;花指令宏(两组花)
    30 JUNPCODE1 MACRO
    31    call $+14
    32    db 0e8h
    33    db 0EBh
    34    add BYTE ptr [esp],2
    35    retn
    36    db 0e8h
    37    db 0EBh
    38    add esp,4
    39    call $-10
    40    db 0e8h
    41    db 0ebh
    42 ENDM
    43
    44 JUNPCODE2 MACRO
    45    push eax
    46    call $+7
    47    db 0e8h
    48    db 0e9h
    49    add esp,4
    50    mov eax,$+10
    51    add eax,2
    52    jmp eax
    53    db 0e8h
    54    db 0ebh
    55    pop eax
    56 ENDM
    57
    58 ;-------------------------------------------------------
    59 .const
    60
    61    DLG_MAIN    equ 100
    62    DLG_EDIT1   equ 1000
    63    DLG_EDIT2   equ 1001
    64
    65 ;-------------------------------------------------------
    66 .data  ;数据段
    67    _table dd 1 ;注册成功标志1
    68    s1 db "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",0
    69    lpszCapOk db "Ok",0
    70    lpszNameBuff1 db 200 dup(0)
    71    lpszMsgOk db "注册成功!^Q^!",0
    72    lpszCodeBuff db 200 dup(0)
    73    _szGetDlgItemText db "GetDlgItemTextA",0
    74    szUser32 db "User32.dll",0
    75    dwFlags dd 0  ;注册成功标志2
    76    dwMsgOk dd 0
    77    dwCapOk dd 0
    78
    79 ;-------------------------------------------------------
    80 .data?
    81    hInstance dd ?
    82
    83
    84 ;-------------------------------------------------------
    85 .CODE
    86
    87 ;创建API函数地址函数,szModule指向Dll模块名,szFunc指向函数名。EAX返回函数入口地址。
    88 CreateFunc proc szModule:DWORD,szFunc:DWORD
    89    mov eax,szModule
    90    invoke GetModuleHandle,eax
    91    mov edx,szFunc
    92    invoke GetProcAddress,eax,edx
    93    ret
    94 CreateFunc endp
    95
    96 ;CC断点检测,dwFunc指向函数入口地址,dwSize检测代码的长度,若代码有CC断点则返回1,否则返回0
    97 _Debug proc uses edi dwFunc:DWORD,dwSize
    98    mov eax,dwFunc
    99    mov edi,dwSize
   100 @@:
   101    dec edi
   102    jz @f
   103    mov ecx,50h
   104    xor ecx,9ch
   105    cmp BYTE ptr [eax+edi],cl
   106    jnz @b
   107    mov eax,1
   108    ret
   109 @@:
   110    xor eax,eax
   111    ret
   112 _Debug endp
   113
   114 ;注册机函数。szStr指向要解密的字符。
   115 DeCryptCode proc USES edi esi ebx szStr:DWORD
   116    mov eax,szStr
   117    invoke lstrlen,eax
   118    mov ecx,eax
   119    mov eax,szStr
   120 @@:
   121    sub BYTE ptr [eax],20h
   122    inc eax
   123    dec ecx
   124    jnz @b
   125    ret
   126 DeCryptCode endp
   127
   128 ;Name加密函数,szName指向加密的字符,szNameBuff为输出加密字符空间,szConst指向一串字符表
   129 CryptName proc uses edi esi ebx szName:DWORD,szNameBuff:DWORD,szConst:DWORD
   130    mov eax,szConst
   131    invoke lstrlen,eax
   132    mov ecx,eax
   133    xor esi,esi
   134 @@:
   135    mov eax,szName
   136    movzx eax,BYTE ptr[eax+esi]
   137    or al,al
   138    jz @f
   139    add eax,ecx
   140    cdq
   141    div ecx
   142    mov eax,szConst
   143    movzx eax,BYTE ptr [eax+edx]
   144    mov edx,szNameBuff
   145    mov [edx+esi],al
   146    inc esi
   147    jmp @b
   148 @@:
   149    ret
   150 CryptName endp
   151
   152 ;加密Code字符并比较字符,szCode指向Code的字符,szCodeBuff为保存加密的Code空间,lpszNameBuff,指向加密后的szNameBuff地址,szConst指向一串字符串常数。szCodeSize,Code的字符长度。
   153 CryptCodeCompName proc uses edi esi ebx szCode:DWORD,szCodeBuff:DWORD,lpszNameBuff:DWORD,szConst:DWORD,szCodeSize:DWORD
   154    mov eax,szConst
   155    invoke lstrlen,eax
   156    mov ecx,eax
   157    xor esi,esi
   158 @@:
   159    mov eax,szCode
   160    movzx eax,BYTE ptr [eax+esi]
   161    or al,al
   162    jz @f
   163    lea eax,[ecx+20h+eax]
   164    cdq
   165    div ecx
   166    mov eax,szConst
   167    movzx eax,BYTE ptr[eax+edx]
   168    mov edx,szCodeBuff
   169    mov [edx+esi],al
   170    inc esi
   171    jmp @b
   172 @@:
   173    xor esi,esi
   174 @@:
   175    mov eax,lpszNameBuff
   176    mov edx,szCodeBuff
   177    movzx eax,BYTE ptr [eax+esi]
   178    or al,al
   179    jz @f
   180    xor [edx+esi],al
   181    inc esi
   182    jmp @b
   183 @@:
   184    mov eax,[edx]
   185    ret
   186 CryptCodeCompName endp
   187
   188 ;异常句柄地址
   189 Exception_Handle proc Exception_Pointers:DWORD
   190    .if _table != 0  ;比较标志1是否不为零
   191       mov eax,1
   192       ret
   193    .endif
   194    mov eax,Exception_Pointers
   195    mov eax,[eax+4]
   196    assume eax:ptr CONTEXT
   197    xor edx,edx
   198    ;Drx寄存器清0
   199    mov [eax].iDr0,edx
   200    mov [eax].iDr1,edx
   201    mov [eax].iDr2,edx
   202    mov [eax].iDr3,edx
   203    mov [eax].iDr6,edx
   204    mov [eax].iDr7,edx
   205    mov [eax].regEip,offset RegOk  ;修改EIP地址,异常结束后会转到这个地址继续运行。
   206    assume eax:nothing
   207    mov eax,dwFlags   ;呵呵,这个标志有什么用,你们自己猜猜^-^
   208    and eax,1
   209    dec eax
   210    ret
   211 Exception_Handle endp
   212
   213 DlgProc proc USES edi esi ebx hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
   214 LOCAL szName[8]:byte
   215 LOCAL szCode[8]:byte
   216 LOCAL szNameBuff[8]:byte
   217 LOCAL szCodeBuff[8]:byte
   218 .if uMsg==WM_INITDIALOG
   219    push offset lpszMsgOk
   220    pop dwMsgOk
   221    invoke LoadIcon,hInstance,100
   222    invoke SendMessage,hWnd,WM_SETICON,ICON_SMALL,eax
   223    push offset lpszCapOk
   224    pop dwCapOk
   225 .elseif uMsg==WM_COMMAND
   226    mov eax,wParam
   227    .if ax==IDOK
   228       ;创建GetDlgItemText函数地址,如果返回0则退出
   229       invoke CreateFunc,addr szUser32,addr _szGetDlgItemText
   230       .if eax==0
   231          mov eax,TRUE
   232          ret
   233       .endif
   234       ;Anit-Debug,检测代码前几位有没有断点CC,返回1则退出注册码算法,下面几个类似
   235       invoke _Debug,eax,4
   236       .if eax==1
   237          mov eax,TRUE
   238          ret
   239       .endif
   240       mov eax,offset _TEABLE1
   241       dec eax
   242       invoke _Debug,eax,20h
   243       .if eax==1
   244          mov eax,TRUE
   245          ret
   246       .endif
   247       mov eax,offset _TEABLE2
   248       dec eax
   249       invoke _Debug,eax,20h
   250       .if eax==1
   251          mov eax,TRUE
   252          ret
   253       .endif
   254       mov eax,offset GetDlgItemTextA
   255       sub eax,20h
   256       invoke _Debug,eax,40h
   257       .if eax==1
   258          mov eax,TRUE
   259          ret
   260       .endif
   261 _TEABLE1:
   262       invoke GetDlgItemText,hWnd,DLG_EDIT1,addr szName,sizeof szName
   263 _TEABLE2:  
   264       invoke GetDlgItemText,hWnd,DLG_EDIT2,addr szCode,sizeof szCode
   265       invoke CryptName,addr szName,addr szNameBuff,addr s1
   266       invoke lstrlen,addr szCode
   267       invoke CryptCodeCompName,addr szCode,addr szCodeBuff,addr szNameBuff,addr s1,eax
   268       xor dwFlags,eax  ;修改注册标志
   269       mov _table,eax   ;修改注册标志
   270       add eax,20h
   271       cdq
   272       lea ecx,szCodeBuff
   273       mov ecx,[ecx]
   274       div ecx  ;注册码正确会在这里产生除0异常
   275       cmp eax,0 ;迷惑指令,没用的^-^
   276       jz _end
   277       jmp _Result
   278 RegOk::
   279    push 0
   280    mov eax,dwCapOk
   281    push eax
   282    mov eax,dwMsgOk
   283    push eax
   284    push 0
   285    call MessageBox
   286    jmp _end
   287 _Result:
   288    jz _end
   289    xor eax,eax
   290 _end:
   291    inc eax
   292    .elseif ax==2
   293       invoke EndDialog,hWnd,FALSE
   294    .endif
   295 .elseif uMsg==WM_CLOSE
   296    invoke EndDialog,hWnd,FALSE
   297 .else
   298    mov eax,FALSE
   299    ret
   300 .endif
   301 mov eax,TRUE
   302 ret
   303 DlgProc endp
   304
   305 ;-------------------------------------------------------
   306 ;WinMain
   307 START:
   308    ;设置异常链,当程序产生异常后会转到Exception_Handle继续运行。
   309    invoke SetUnhandledExceptionFilter,addr Exception_Handle
   310    invoke GetModuleHandle,NULL
   311    mov hInstance,eax
   312    invoke DialogBoxParam,hInstance,DLG_MAIN,0,offset DlgProc,0
   313    invoke ExitProcess,0
   314 END START