一个CM的分析及注册机

【文章标题】: 一个Crackme注册机
【文章作者】: 只爱阿蒙
【作者邮箱】: youyong407@163.com
【作者主页】: n/a
【作者QQ号】: 64570303
【软件名称】: ncrackme.exe
【加壳方式】: 无壳
【保护方式】: 无壳
【编写语言】: vc
【使用工具】: OD
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  在命令行输入"bpx GetDlgItemTextA",来到以下这个位置:
  00401245  |.  6A 10         push    10                               ; /Count = 10 (16.)
  00401247  |.  50            push    eax                              ; |Buffer
  00401248  |.  68 E8030000   push    3E8                              ; |ControlID = 3E8 (1000.)
  0040124D  |.  51            push    ecx                              ; |hWnd => 001001E4 (class='#32770',parent=000B0274)
  0040124E  |.  33DB          xor     ebx, ebx                         ; |
  00401250  |.  FFD6          call    esi                              ; /GetDlgItemTextA
  00401252  |.  83F8 03       cmp     eax, 3                           ;  用户名的长度>3
  00401255  |.  73 0B         jnb     short 00401262                   ;  小于3则失败
  00401257  |.  5E            pop     esi
  00401258  |.  B8 01000000   mov     eax, 1
  0040125D  |.  5B            pop     ebx
  0040125E  |.  83C4 30       add     esp, 30
  00401261  |.  C3            retn
  00401262  |>  A1 BC564000   mov     eax, dword ptr [4056BC]
  00401267  |.  8D5424 28     lea     edx, dword ptr [esp+28]          ;  存储获取的注册码
  0040126B  |.  6A 10         push    10
  0040126D  |.  52            push    edx
  0040126E  |.  68 E9030000   push    3E9
  00401273  |.  50            push    eax
  00401274  |.  FFD6          call    esi                              ;  获取的注册码(GetDlgItemText)
  00401276  |.  0FBE4424 08   movsx   eax, byte ptr [esp+8]            ;    将输入的用户名第一个字符移至eax
  0040127B  |.  0FBE4C24 09   movsx   ecx, byte ptr [esp+9]         ;    将输入的用户名第二个字符移至ecx
  00401280  |.  99            cdq                         ;    将eax的符号位移至edx中
  00401281  |.  F7F9          idiv    ecx                              ;  eax = eax / ecx
  00401283  |.  8BCA          mov     ecx, edx                         ;  edx = eax % ecx
  00401285  |.  83C8 FF       or      eax, FFFFFFFF             ;    eax == -1
  00401288  |.  0FBE5424 0A   movsx   edx, byte ptr [esp+A]         ;    将输入的用户名第三个字符移至edx
  0040128D  |.  0FAFCA        imul    ecx, edx                         ;  ecx = ecx * edx
  00401290  |.  41            inc     ecx                     ;    ecx = ecx + 1
  00401291  |.  33D2          xor     edx, edx                 ;    edx = 0
  00401293  |.  F7F1          div     ecx                     ;  eax = -1 / ecx
  00401295  |.  50            push    eax                     ;    将eax入栈
  00401296  |.  E8 A5000000   call    00401340                         ;  存储商eax
  ;********************************************************************************************
  00401340  /$  8B4424 04     mov     eax, dword ptr [esp+4]           ;  将栈中eax值赋给eax
  00401344  |.  A3 AC504000   mov     dword ptr [4050AC], eax          ;  存储eax的值存储于4050ac中
  00401349  /.  C3            retn
  ;********************************************************************************************
  0040129B  |.  83C4 04       add     esp, 4                 ;               
  0040129E  |.  33F6          xor     esi, esi                 ;    esi = 0
  004012A0  |>  E8 A5000000   /call    0040134A
  ;********************************************************************************************
  0040134A  /$  A1 AC504000   mov     eax, dword ptr [4050AC]         ;    将储存在4050ac中值赋给eax   
  0040134F  |.  69C0 FD430300 imul    eax, eax, 343FD             ;  eax = eax * 343fd
  00401355  |.  05 C39E2600   add     eax, 269EC3                 ;  eax = eax + 269ec3
  0040135A  |.  A3 AC504000   mov     dword ptr [4050AC], eax         ;  将eax值存储于4050ac中
  0040135F  |.  C1F8 10       sar     eax, 10                 ;    eax = eax / 200h
  00401362  |.  25 FF7F0000   and     eax, 7FFF                 ;     eax = eax & 7FFF
  00401367  /.  C3            retn
  ;********************************************************************************************
  004012A5  |.  99            |cdq                     ;    将eax符号位移至edx中
  004012A6  |.  B9 1A000000   |mov     ecx, 1A                 ;    ecx = 1Ah
  004012AB  |.  F7F9          |idiv    ecx                 ;    ecx = eax / 1Ah
  004012AD  |.  80C2 41       |add     dl, 41                 ;    edx = eax % 1Ah + 41h
  004012B0  |.  885434 18     |mov     byte ptr [esp+esi+18], dl         ;  dl值存储于[esp + esi + 18]处    (假码)        
  004012B4  |.  46            |inc     esi                 ;    esi = esi + 1   
  004012B5  |.  83FE 0F       |cmp     esi, 0F                 ;  esi > 15?
  004012B8  |.^ 72 E6         /jb      short 004012A0             ;  跳至4012a0处
  004012BA  |.  57            push    edi                     ;    edi入栈
  004012BB  |.  8D7C24 0C     lea     edi, dword ptr [esp+C]           ;  edi = 输入的用户名地址
  004012BF  |.  83C9 FF       or      ecx, FFFFFFFF             ;    ecx = -1
  004012C2  |.  33C0          xor     eax, eax                 ;    eax = 0
  004012C4  |.  33F6          xor     esi, esi                 ;    esi = 0
  004012C6  |.  F2:AE         repne   scas byte ptr es:[edi]         ;    查表
  004012C8  |.  F7D1          not     ecx                              ;  计算输入的用户名的长度含最后0字符
  004012CA  |.  49            dec     ecx                              ;  ecx(用户名长度) = 长度-0字符
  004012CB  |.  74 59         je      short 00401326                   ;  跳出则注册失败
  004012CD  |>  8A4434 0C     /mov     al, byte ptr [esp+esi+C]         ;    al = [esp+esi+C]指向输入的用户名
  004012D1  |.  C0F8 05       |sar     al, 5                 ;    al = al / 16
  004012D4  |.  0FBEC0        |movsx   eax, al                 ;    al 填充eax中
  004012D7  |.  8D1480        |lea     edx, dword ptr [eax+eax*4]         ;    edx = 5eax
  004012DA  |.  8D04D0        |lea     eax, dword ptr [eax+edx*8]         ;    eax = eax + 5eax * 8
  004012DD  |.  8D0440        |lea     eax, dword ptr [eax+eax*2]         ;    eax = (eax+5eax*8)+(eax+5eax*8)*2
  004012E0  |.  85C0          |test    eax, eax                 ;    测试eax == 0?
  004012E2  |.  7E 0A         |jle     short 004012EE             ;    跳出则失败
  004012E4  |.  8BF8          |mov     edi, eax                 ;    edi = eax
  004012E6  |>  E8 5F000000   |/call    0040134A                 ;    对eax进行处理(代码见上)edi次
  004012EB  |.  4F            ||dec     edi                 ;    edi = edi -1
  004012EC  |.^ 75 F8         |/jnz     short 004012E6             ;  循环
  004012EE  |>  E8 57000000   |call    0040134A                 ;    处理eax
  004012F3  |.  99            |cdq                     ;    将eax符号位移至edx中
  004012F4  |.  B9 1A000000   |mov     ecx, 1A                 ;    ecx = 1Ah
  004012F9  |.  8D7C24 0C     |lea     edi, dword ptr [esp+C]         ;    edi = 输入用户名地址
  004012FD  |.  F7F9          |idiv    ecx                 ;    edx = eax % ecx
  004012FF  |.  0FBE4C34 2C   |movsx   ecx, byte ptr [esp+esi+2C]         ;   
  00401304  |.  80C2 41       |add     dl, 41                 ;    dl = dl + 41h
  00401307  |.  0FBEC2        |movsx   eax, dl                 ;    eax = dl
  0040130A  |.  2BC1          |sub     eax, ecx                 ;    eax = eax - ecx
  0040130C  |.  885434 1C     |mov     byte ptr [esp+esi+1C], dl         ;    [esp+esi+1c]储存假码的位置(现为真码)   
  00401310  |.  99            |cdq                     ;    将符号位移至edx中
  00401311  |.  33C2          |xor     eax, edx                 ;    eax = eax ^ edx
  00401313  |.  83C9 FF       |or      ecx, FFFFFFFF             ;    ecx = -1
  00401316  |.  2BC2          |sub     eax, edx                 ;    eax = eax - edx
  00401318  |.  03D8          |add     ebx, eax                 ;    ebx = ebx + eax
  0040131A  |.  33C0          |xor     eax, eax                 ;    eax = 0
  0040131C  |.  46            |inc     esi                 ;    esi++
  0040131D  |.  F2:AE         |repne   scas byte ptr es:[edi]         ;************************
  0040131F  |.  F7D1          |not     ecx                 ;    求输入用户名的长度
  00401321  |.  49            |dec     ecx                 ;************************
  00401322  |.  3BF1          |cmp     esi, ecx                 ;    判断是否达到用户名的长度
  00401324  |.^ 72 A7         /jb      short 004012CD             ;    未达到则继续
  00401326  |>  5F            pop     edi
  00401327  |.  8BC3          mov     eax, ebx
  00401329  |.  5E            pop     esi
  0040132A  |.  5B            pop     ebx
  0040132B  |.  83C4 30       add     esp, 30
  0040132E  /.  C3            retn                                                    
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

2010年09月24日 下午 10:33:10

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值