首页
社区
课程
招聘
[原创]BASE64CrackMe算法分析
发表于: 2008-2-26 16:39 6669

[原创]BASE64CrackMe算法分析

2008-2-26 16:39
6669

【文章标题】: Base64CrackMe算法分析
【文章作者】: dttom
【作者邮箱】: dttom2006@126.com
【软件名称】: Base64CrackMe
【软件大小】: 94Kb
【下载地址】: http://bbs.pediy.com/attachment.php?attachmentid=6588&d=1183561767
【加壳方式】: 无
【保护方式】: 无
【编写语言】: delphi
【使用工具】: ollydbg,peid
【操作平台】: winxp_sp2
【软件介绍】: Base64算法的crackme
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
      本来打算学习RC6算法,并分析RC6CrackMe,结果用peid的KANAL插件一分析有BASE64算法,于是就先学习BASE64算法,google一搜,在RFC2045中有BASE64算法的描述,同时我查到了两篇中文教程罗聪写的《矛与盾的较量(4)——奇妙的Base64编码》和朱岩的《浅谈Base64编码》,通过这两篇文章对BASE64算法有了解。具体算法不再描述,下面我们进入BASE64CrackMe的算法分析,看看在CrackMe中算法的怎样被应用的?现在将算法分析过程与大家分享,欢迎批评指正。
      进入正题,Peid查壳,无壳,dephi编写。打开OD载入Base64CrackMe,下断bp GetDlgItemTextA,即可断下后,可以F8 跟踪之,也可查找字符串,在“invalid base64 character”处双击即可来到算法核心地带。
  bp GetDlgItemTextA下断,跟踪结果如下:
  ......
  00412AC2   > \68 FF000000   push    0FF                              ; /Count = FF (255.); Case 3EA of switch 00412AA8
  00412AC7   .  68 F0334100   push    004133F0                         ; |dttom
  00412ACC   .  68 F2030000   push    3F2                              ; |ControlID = 3F2 (1010.)
  00412AD1   .  8B45 08       mov     eax, dword ptr [ebp+8]           ; |
  00412AD4   .  50            push    eax                              ; |hWnd
  00412AD5   .  E8 AE2CFFFF   call    <jmp.&user32.GetDlgItemTextA>    ; \GetDlgItemTextA
  00412ADA   .  8D45 B4       lea     eax, dword ptr [ebp-4C]
  00412ADD   .  BA F0334100   mov     edx, 004133F0                    ;  dttom
  00412AE2   .  B9 FF000000   mov     ecx, 0FF
  00412AE7   .  E8 9810FFFF   call    00403B84
  00412AEC   .  837D B4 00    cmp     dword ptr [ebp-4C], 0
  00412AF0   .  75 1C         jnz     short 00412B0E
  00412AF2   .  6A 40         push    40                               ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
  00412AF4   .  68 282D4100   push    00412D28                         ; |注册提示
  00412AF9   .  68 342D4100   push    00412D34                         ; |Text = "用",BB,"?,B2,"",BB,"能为空请输入?,A1,""
  00412AFE   .  8B45 08       mov     eax, dword ptr [ebp+8]           ; |
  00412B01   .  50            push    eax                              ; |hOwner
  00412B02   .  E8 B92CFFFF   call    <jmp.&user32.MessageBoxA>        ; \MessageBoxA
  00412B07   .  33DB          xor     ebx, ebx
  00412B09   .  E9 A2010000   jmp     00412CB0
  00412B0E   >  68 FF000000   push    0FF                              ; /Count = FF (255.)
  00412B13   .  68 F0344100   push    004134F0                         ; |Buffer = Base64Cr.004134F0
  00412B18   .  68 F3030000   push    3F3                              ; |ControlID = 3F3 (1011.)
  00412B1D   .  8B45 08       mov     eax, dword ptr [ebp+8]           ; |
  00412B20   .  50            push    eax                              ; |hWnd
  00412B21   .  E8 622CFFFF   call    <jmp.&user32.GetDlgItemTextA>    ; \GetDlgItemTextA
  00412B26   .  8D45 B0       lea     eax, dword ptr [ebp-50]
  00412B29   .  BA F0344100   mov     edx, 004134F0                    ;  ASCII "55556666"
  00412B2E   .  B9 FF000000   mov     ecx, 0FF
  00412B33   .  E8 4C10FFFF   call    00403B84
  00412B38   .  837D B0 00    cmp     dword ptr [ebp-50], 0
  00412B3C   .  75 1C         jnz     short 00412B5A
  00412B3E   .  6A 40         push    40                               ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
  00412B40   .  68 282D4100   push    00412D28                         ; |Title = ""D7,"",A2,"",B2,"崽崾?
  00412B45   .  68 4C2D4100   push    00412D4C                         ; |Text = ""D7,"",A2,"",B2,"崧?,B2,"",BB,"能为空请输入?,A1,""
  00412B4A   .  8B45 08       mov     eax, dword ptr [ebp+8]           ; |
  00412B4D   .  50            push    eax                              ; |hOwner
  00412B4E   .  E8 6D2CFFFF   call    <jmp.&user32.MessageBoxA>        ; \MessageBoxA
  00412B53   .  33DB          xor     ebx, ebx
  00412B55   .  E9 56010000   jmp     00412CB0
  00412B5A   >  33C0          xor     eax, eax
  00412B5C   .  55            push    ebp
  00412B5D   .  68 DC2B4100   push    00412BDC
  00412B62   .  64:FF30       push    dword ptr fs:[eax]
  00412B65   .  64:8920       mov     dword ptr fs:[eax], esp
  00412B68   .  8D45 AC       lea     eax, dword ptr [ebp-54]
  00412B6B   .  BA F0334100   mov     edx, 004133F0                    ;  ASCII "dttom"
  00412B70   .  B9 FF000000   mov     ecx, 0FF
  00412B75   .  E8 0A10FFFF   call    00403B84
  00412B7A   .  8B45 AC       mov     eax, dword ptr [ebp-54]
  00412B7D   .  50            push    eax
  00412B7E   .  8D45 A4       lea     eax, dword ptr [ebp-5C]
  00412B81   .  BA F0344100   mov     edx, 004134F0                    ;  ASCII "55556666"
  00412B86   .  B9 FF000000   mov     ecx, 0FF
  00412B8B   .  E8 F40FFFFF   call    00403B84
  00412B90   .  8B45 A4       mov     eax, dword ptr [ebp-5C]
  00412B93   .  8D55 A8       lea     edx, dword ptr [ebp-58]
  00412B96   .  E8 E5F8FFFF   call    00412480                         ;  关键Call F7跟进
  00412B9B   .  8B55 A8       mov     edx, dword ptr [ebp-58]
  00412B9E   .  58            pop     eax
  00412B9F   .  E8 5811FFFF   call    00403CFC                         ;  对注册码解码,并与用户名比较,不等则跳
  00412BA4   .  75 17         jnz     short 00412BBD
  00412BA6   .  6A 40         push    40                               ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
  00412BA8   .  68 282D4100   push    00412D28                         ; |Title = ""D7,"",A2,"",B2,"崽崾?
  00412BAD   .  68 642D4100   push    00412D64                         ; |Text = "恭?,B2,"您?,AC,"",D7,"",A2,"",B2,"崧胝",B7,"?,A1,""
  00412BB2   .  8B45 08       mov     eax, dword ptr [ebp+8]           ; |
  00412BB5   .  50            push    eax                              ; |hOwner
  00412BB6   .  E8 052CFFFF   call    <jmp.&user32.MessageBoxA>        ; \MessageBoxA
  00412BBB   .  EB 15         jmp     short 00412BD2
  00412BBD   >  6A 40         push    40                               ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
  00412BBF   .  68 282D4100   push    00412D28                         ; |Title = ""D7,"",A2,"",B2,"崽崾?
  00412BC4   .  68 7C2D4100   push    00412D7C                         ; |Text = ""D7,"",A2,"",B2,"崧?,B4,"砦螅",AC,"继续加油?,A1,""
  00412BC9   .  8B45 08       mov     eax, dword ptr [ebp+8]           ; |
  00412BCC   .  50            push    eax                              ; |hOwner
  00412BCD   .  E8 EE2BFFFF   call    <jmp.&user32.MessageBoxA>        ; \MessageBoxA
  ......
  在412B96处F7跟进来到下面一段代码处
  ......
  
  004124C9  |.  8BD3          mov     edx, ebx
  004124CB  |.  8BC6          mov     eax, esi
  004124CD  |.  E8 0AFEFFFF   call    004122DC                         ;  调用解码算法 F7跟进      
  ......
  
  来到下面一段算法,即BASE64解码算法
  004122DC  /$  53            push    ebx
  004122DD  |.  56            push    esi
  004122DE  |.  57            push    edi
  004122DF  |.  81C4 58FFFFFF add     esp, -0A8
  004122E5  |.  895424 04     mov     dword ptr [esp+4], edx
  004122E9  |.  890424        mov     dword ptr [esp], eax
  004122EC  |.  8D7424 0C     lea     esi, dword ptr [esp+C]
  004122F0  |>  C64424 08 00  /mov     byte ptr [esp+8], 0
  004122F5  |.  33DB          |xor     ebx, ebx
  004122F7  |.  8BD6          |mov     edx, esi
  004122F9  |.  B9 58000000   |mov     ecx, 58
  004122FE  |.  8B0424        |mov     eax, dword ptr [esp]
  00412301  |.  8B38          |mov     edi, dword ptr [eax]
00412303  |.  FF57 0C       |call    dword ptr [edi+C]               ;  计算输入注册码长度
00412306  |.  884424 09     |mov     byte ptr [esp+9], al
0041230A  |.  807C24 09 00  |cmp     byte ptr [esp+9], 0
0041230F  |.  0F84 3C010000 |je      00412451
00412315  |.  3A5C24 09     |cmp     bl, byte ptr [esp+9]
00412319  |.  0F83 10010000 |jnb     0041242F
0041231F  |>  33D2          |/xor     edx, edx                       ;  下面一段对输入的注册码,进行检查是否是base64编码
00412321  |.  8AD3          ||mov     dl, bl
00412323  |.  8A0416        ||mov     al, byte ptr [esi+edx]         ;  取第一个注册码
00412326  |.  3C 2B         ||cmp     al, 2B                         ;  与43比较
00412328  |.  72 46         ||jb      short 00412370                 ;  低于则跳错误BASE64编码
0041232A  |.  3C 7A         ||cmp     al, 7A                         ;  与122比较
0041232C  |.  77 42         ||ja      short 00412370                 ;  高于则跳错误BASE64编码
0041232E  |.  33C0          ||xor     eax, eax
00412330  |.  8AC3          ||mov     al, bl
00412332  |.  807C06 01 2B  ||cmp     byte ptr [esi+eax+1], 2B       ;  取第二个注册码
00412337  |.  72 37         ||jb      short 00412370
00412339  |.  33C0          ||xor     eax, eax
0041233B  |.  8AC3          ||mov     al, bl
0041233D  |.  807C06 01 7A  ||cmp     byte ptr [esi+eax+1], 7A       ;  取第二个注册码
00412342  |.  77 2C         ||ja      short 00412370
00412344  |.  33C0          ||xor     eax, eax
00412346  |.  8AC3          ||mov     al, bl
00412348  |.  807C06 02 2B  ||cmp     byte ptr [esi+eax+2], 2B       ;  取第三个注册码
0041234D  |.  72 21         ||jb      short 00412370
0041234F  |.  33C0          ||xor     eax, eax
00412351  |.  8AC3          ||mov     al, bl
00412353  |.  807C06 02 7A  ||cmp     byte ptr [esi+eax+2], 7A       ;  取第三个注册码
00412358  |.  77 16         ||ja      short 00412370
0041235A  |.  33C0          ||xor     eax, eax
0041235C  |.  8AC3          ||mov     al, bl
0041235E  |.  807C06 03 2B  ||cmp     byte ptr [esi+eax+3], 2B       ;  取第四个注册码
00412363  |.  72 0B         ||jb      short 00412370
00412365  |.  33C0          ||xor     eax, eax
00412367  |.  8AC3          ||mov     al, bl
00412369  |.  807C06 03 7A  ||cmp     byte ptr [esi+eax+3], 7A       ;  取第四个注册码
0041236E  |.  76 16         ||jbe     short 00412386                 ;  低于或等于则跳
00412370  |>  B9 64244100   ||mov     ecx, 00412464                  ;  invalid base64 character
00412375  |.  B2 01         ||mov     dl, 1
00412377  |.  A1 FC5B4000   ||mov     eax, dword ptr [405BFC]
0041237C  |.  E8 0F7AFFFF   ||call    00409D90
00412381  |.  E8 EE0FFFFF   ||call    00403374
00412386  |>  33C0          ||xor     eax, eax
00412388  |.  8A0416        ||mov     al, byte ptr [esi+edx]         ;  注册码第一个字符入al
0041238B  |.  8A80 71334100 ||mov     al, byte ptr [eax+413371]      ;  从解码表找对应的码
00412391  |.  884424 0A     ||mov     byte ptr [esp+A], al
00412395  |.  8BFB          ||mov     edi, ebx
00412397  |.  81E7 FF000000 ||and     edi, 0FF
0041239D  |.  33C0          ||xor     eax, eax
0041239F  |.  8A443E 01     ||mov     al, byte ptr [esi+edi+1]       ;  注册码第二个字符入al
004123A3  |.  8A80 71334100 ||mov     al, byte ptr [eax+413371]      ;  从解码表找对应的码
004123A9  |.  33D2          ||xor     edx, edx
004123AB  |.  8A543E 02     ||mov     dl, byte ptr [esi+edi+2]       ;  注册码第三个字符入al
004123AF  |.  8A92 71334100 ||mov     dl, byte ptr [edx+413371]      ;  从解码表找对应的码
004123B5  |.  885424 0B     ||mov     byte ptr [esp+B], dl
004123B9  |.  8A5424 0A     ||mov     dl, byte ptr [esp+A]           ;  解码后的第一个字符入dl
004123BD  |.  C1E2 02       ||shl     edx, 2                         ;  将第一个字符左移2bit
004123C0  |.  33C9          ||xor     ecx, ecx
004123C2  |.  8AC8          ||mov     cl, al
004123C4  |.  C1E9 04       ||shr     ecx, 4                         ;  将第二个字符右移4bit,这样剩下4bit,前2bit是填充的0,后2bit是第一个字符编码时移过来的
004123C7  |.  0AD1          ||or      dl, cl                         ;  与第一个字符相加
004123C9  |.  33C9          ||xor     ecx, ecx
004123CB  |.  8A4C24 08     ||mov     cl, byte ptr [esp+8]
004123CF  |.  88540C 64     ||mov     byte ptr [esp+ecx+64], dl      ;  第一个字符解码结束,结果保存
004123D3  |.  FE4424 08     ||inc     byte ptr [esp+8]
004123D7  |.  807C3E 02 3D  ||cmp     byte ptr [esi+edi+2], 3D       ;  取第三个字符与"="比较
004123DC  |.  74 44         ||je      short 00412422
004123DE  |.  C1E0 04       ||shl     eax, 4                         ;  注册码第二个字符解码时要左移4位
004123E1  |.  33D2          ||xor     edx, edx
004123E3  |.  8A5424 0B     ||mov     dl, byte ptr [esp+B]
004123E7  |.  C1EA 02       ||shr     edx, 2                         ;  原码中第二个字符有4bit到编码后的第三个字符的3-6bit位,故右移2bit即可
004123EA  |.  0AC2          ||or      al, dl                         ;  位相加完成第二个字符解码
004123EC  |.  33D2          ||xor     edx, edx
004123EE  |.  8A5424 08     ||mov     dl, byte ptr [esp+8]
004123F2  |.  884414 64     ||mov     byte ptr [esp+edx+64], al      ;  第二个字符解码结束,结果保存
004123F6  |.  FE4424 08     ||inc     byte ptr [esp+8]
004123FA  |.  807C3E 03 3D  ||cmp     byte ptr [esi+edi+3], 3D       ;  取第四个字符与"="比较
004123FF  |.  74 21         ||je      short 00412422
00412401  |.  8A4424 0B     ||mov     al, byte ptr [esp+B]
00412405  |.  C1E0 06       ||shl     eax, 6                         ;  注册码第三个字符解码时要左移6bit
00412408  |.  33D2          ||xor     edx, edx
0041240A  |.  8A543E 03     ||mov     dl, byte ptr [esi+edi+3]       ;  注册码第四个字符入dl
0041240E  |.  0A82 71334100 ||or      al, byte ptr [edx+413371]      ;  从解码表找对应的码,与al按位加完成第三个字符的解码
00412414  |.  33D2          ||xor     edx, edx
00412416  |.  8A5424 08     ||mov     dl, byte ptr [esp+8]
0041241A  |.  884414 64     ||mov     byte ptr [esp+edx+64], al      ;  第三个字符解码结束,结果保存
0041241E  |.  FE4424 08     ||inc     byte ptr [esp+8]
00412422  |>  80C3 04       ||add     bl, 4                          ;  解码时是每4个字节一组,进行解码
00412425  |.  3A5C24 09     ||cmp     bl, byte ptr [esp+9]
00412429  |.^ 0F82 F0FEFFFF |\jb      0041231F
0041242F  |>  33C9          |xor     ecx, ecx                        ;  (initial cpu selection)
00412431  |.  8A4C24 08     |mov     cl, byte ptr [esp+8]
00412435  |.  8D5424 64     |lea     edx, dword ptr [esp+64]         ;  将解码后的结果地址入EDX
00412439  |.  8B4424 04     |mov     eax, dword ptr [esp+4]
0041243D  |.  8B18          |mov     ebx, dword ptr [eax]
0041243F  |.  FF53 10       |call    dword ptr [ebx+10]
00412442  |.  33C0          |xor     eax, eax
00412444  |.  8A4424 09     |mov     al, byte ptr [esp+9]
00412448  |.  83F8 58       |cmp     eax, 58
0041244B  |.^ 0F83 9FFEFFFF \jnb     004122F0
00412451  |>  81C4 A8000000 add     esp, 0A8
00412457  |.  5F            pop     edi
00412458  |.  5E            pop     esi
00412459  |.  5B            pop     ebx
0041245A  \.  C3            retn
  ......
  其他一些收尾代码就不贴了。
上面的解码算法如下:
                                               
1、第一个注册码左移2bit,第二个注册码右移4bit,再按位相加,完成第一个字符解码;
2、第二个注册码左移4bit,第三个注册码右移2bit,再按位相加,完成第二个字符解码;
3、第三个注册码左移6bit,再从解码表中查得第四个注册码的编码,再按位相加,完成第三个字符的解码。       
4、循环进行直到所有注册码被解码完成。
       
  
  通过上面的算法可知,我们只要用BASE64的编码算法,编写编码程序,即可得到注册机。编码程序网上很多,罗聪的文章里也有我就不写了,我的水平菜,就不献丑了。
  
  
  
--------------------------------------------------------------------------------
【经验总结】
  具体算法应用时形式很多,这个Base64Crack,采用对输入的注册码解码,再与用户名比较,相等即表示注册码正确,所以只有了解编码算法,才可以得到正确的注册码。
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2008年02月26日 下午 04:49:47


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (5)
雪    币: 423
活跃值: (11)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
2
好贴。
正好是我的所急。
辛苦了。

醉过方晓酒浓
爱过才知心痛
破过特觉不易
写过倍感辛苦
2008-2-26 16:53
0
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
3
分析算法的都很厉害,谢谢分享
2008-2-26 21:14
0
雪    币: 479
活跃值: (25)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
对不住大家,分析的不太好,又补充了一些
2008-2-27 11:15
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
.386
  .model flat,stdcall
  option casemap:none
  
  include    windows.inc
  include    kernel32.inc
  include    user32.inc
  
  includelib   kernel32.lib
  includelib   user32.lib
  
  DLG_MAIN              equ    1
  IDC_USER_EDIT         equ    10
  IDC_CODE_EDIT         equ    20
  IDC_GETCODE_BUTTON    equ    30
  IDC_GETEXIT_BUTTON    equ    40
  CRC_VALUE             equ    0EDB88320h
  ;函数声明
  
  Base64Encode        proto :DWORD, :DWORD
  Base64Decode        proto :DWORD, :DWORD
  
  
  MainProc proto :DWORD,:DWORD,:DWORD,:DWORD
  
  .data

szBuffer                        db        255 dup(0)
szText                                db        340 dup(0)
szMsg                                db        450 dup(0)
szTemplate_Encode        db        "%s", 13, 10, 13, 10, "%s", 0
szTemplate_Decode        db        "%s", 13, 10, 13, 10, "%s", 0
;Base64 -> ASCII mapping table
base64_alphabet                db        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="

;ASCII -> Base64 mapping table
base64table                        db 43 dup (255)
                                         db 62,255,255,255,63,52,53,54,55,56,57,58,59,60,61,255
                                        db 255,255,0,255,255,255,0,1,2,3,4,5,6,7,8,9,10,11,12,13
                                        db 14,15,16,17,18,19,20,21,22,23,24,25,255,255,255,255
                                        db 255,255,26,27,28,29,30,31,32,33,34,35,36,37,38
                                        db 39,40,41,42,43,44,45,46,47,48,49,50,51
                                        db 132 dup (255)
  .data?
  hInst                 dd     ?
  szUserName            dd     ?
  szUserCode            dd     ?
  
  .code
  start:
    invoke GetModuleHandle,NULL
    mov hInst,eax
    ;调用窗口过程
    invoke DialogBoxParam,hInst,DLG_MAIN,NULL,offset MainProc,NULL
    invoke ExitProcess,NULL  
  
  ;窗口过程
  MainProc proc hDlg:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
    mov eax,uMsg
    .if eax==WM_COMMAND
      .if wParam==IDC_GETCODE_BUTTON;计算注册码按钮
        ;获取输入的用户名
        invoke GetDlgItemText, hDlg, IDC_USER_EDIT, offset szUserName, 256
      
                                ;进行 ASCII->Base64 转换:
                                invoke Base64Encode, addr szUserName, addr szText

                                ;格式化输出:
                                invoke wsprintf, addr szMsg, addr szTemplate_Encode, addr szBuffer, addr szText

        ;把注册码写到注册码框中
        invoke SetDlgItemText,hDlg,IDC_CODE_EDIT,offset szMsg
      .elseif wParam==IDC_GETEXIT_BUTTON;退出按钮
        invoke EndDialog,hDlg,NULL
      .else
        ret
      .endif
    .elseif eax==WM_CLOSE
      invoke EndDialog,hDlg,NULL
    .else
      mov eax,FALSE
      ret
    .endif
    mov eax,TRUE
    ret
  MainProc endp
  ;**********************************************************
;函数功能:进行Base64编码
;参数:
;        source                 =        传入的字符串
;        destination         =        返回的编码
;**********************************************************
Base64Encode        proc        uses ebx edi esi source:DWORD, destination:DWORD
        LOCAL        sourcelen:DWORD

        invoke lstrlen, source
        mov sourcelen, eax

        mov  esi, source
        mov  edi, destination
@@base64loop:
        xor eax, eax
        .if sourcelen == 1
                lodsb                                                ;source ptr + 1
                mov ecx, 2                                        ;bytes to output = 2
                mov edx, 03D3Dh                                ;padding = 2 byte
                dec sourcelen                                ;length - 1
        .elseif sourcelen == 2
                lodsw                                                ;source ptr + 2
                mov ecx, 3                                        ;bytes to output = 3
                mov edx, 03Dh                                ;padding = 1 byte
                sub sourcelen, 2                        ;length - 2
        .else
                lodsd
                mov ecx, 4                                        ;bytes to output = 4
                xor edx, edx                                ;padding = 0 byte
                dec esi                                                ;source ptr + 3 (+4-1)
                sub sourcelen, 3                        ;length - 3
        .endif

        xchg al,ah                                                ;flip eax completely
        rol  eax, 16                                        ;can this be done faster
        xchg al,ah

        @@:
        push  eax
        and   eax, 0FC000000h                        ;get the last 6 high bits
        rol   eax, 6                                        ;rotate them into al
        mov   al,  byte ptr [offset base64_alphabet + eax]                ;get encode character
        stosb                                                        ;write to destination
        pop   eax
        shl   eax, 6                                        ;shift left 6 bits
        dec   ecx
        jnz   @B                                                ;loop

        cmp   sourcelen, 0
        jnz   @@base64loop                                ;main loop

        mov   eax, edx                                        ;add padding and null terminate
        stosd

        ret
Base64Encode        endp

;**********************************************************
;函数功能:进行Base64解码
;参数:
;        source                 =        传入的编码
;        destination         =        返回的字符串
;**********************************************************
Base64Decode        proc        uses ebx edi esi source:DWORD, destination:DWORD
        LOCAL        sourcelen:DWORD

        invoke lstrlen, source
        mov sourcelen, eax
       
        mov    esi, source                        ;esi <- source
        mov    edi, destination                ;edi <- destination
        mov    ecx, sourcelen
        shr    ecx, 2
        cld
       
        ;-------------[decoding part]---------------
       
@@outer_loop:
        push   ecx
        mov    ecx, 4
        xor    ebx, ebx
        lodsd
@@inner_loop:
        push   eax
        and    eax, 0ffh
        mov    al, byte ptr [offset base64table + eax]
        cmp    al, 255
        je     @@invalid_char
        shl    ebx, 6
        or     bl, al
        pop    eax
        shr    eax, 8
        dec    ecx
        jnz    @@inner_loop
        mov    eax, ebx
        shl    eax, 8
        xchg   ah, al
        ror    eax, 16
        xchg   ah, al
        stosd
        dec    edi
        pop    ecx
        dec    ecx
        jnz    @@outer_loop
        xor    eax, eax
        jmp    @@decode_done
       
        ;-------------------------------------------
       
@@invalid_char:
        mov    eax, -1
@@decode_done:
        ret
Base64Decode ENDP
  
  
  end start
#include <resource.h>
  
  #define DLG_MAIN             1
  #define IDC_USER_EDIT        10
  #define IDC_CODE_EDIT        20
  #define IDC_GETCODE_BUTTON   30
  #define IDC_GETEXIT_BUTTON   40
  
  //主窗口
  DLG_MAIN DIALOG DISCARDABLE  0, 0, 273, 90
  STYLE DS_FIXEDSYS |DS_SETFONT |DS_MODALFRAME |DS_CENTER |WS_POPUP |WS_CAPTION |WS_VISIBLE |WS_SYSMENU |WS_MINIMIZEBOX
  CAPTION "Base64CrackMeKeyGen"
  FONT    9, "宋体"
  {
      LTEXT           "用户名:",-1,6,12,51,10
      EDITTEXT        IDC_USER_EDIT,37,10,230,13
      LTEXT           "注册码:",-1,6,42,51,10
      EDITTEXT        IDC_CODE_EDIT,37,40,230,13
      PUSHBUTTON      "计算",IDC_GETCODE_BUTTON,50,65,90,15
      PUSHBUTTON      "退出",IDC_GETEXIT_BUTTON,150,65,90,15
  }

怒海潜将

xa26o8exvas=
上传的附件:
  • 1.jpg (10.60kb,103次下载)
2008-6-20 15:56
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
从罗聪那里抄来的
2008-6-20 22:56
0
游客
登录 | 注册 方可回帖
返回
//