【破文标题】  安琪个人助理 5.6H 超强版注册算法分析+汇编注册机

【破文作者】  snake

【软件名称】  安琪个人助理 5.6H 超强版

【下载地址】  http://yncnc.onlinedown.net/soft/4660.htm

【软件简介】  电脑上的"商务通",集成了通讯录、日程表、笔记本、家庭记账、炒股理财、电子邮件、信息速查等功能,特别为中国人设计。她可以保存、处理大量的个人信息,无论是保存、查询、处理通讯录等信息,还是管理工作日志、个人日记、日程安排、待办事宜以及家庭记账、炒股理财等,《安琪个人助理》都将成为您最得力的助手。

【调试环境】  Win2000、PEiD、DEDE、Ollydbg

【作者声明】  只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!

----------------------------------------------------------------------------------------------
【破解过程】

一、程序脱壳

用PEiD查壳,为UPX 0.89.6 - 1.02 / 1.05 - 1.24 (Delphi) stub -> Markus & Laszlo,手动脱之。

Ollydbg载入主程序

00B15FD0 A>  60               pushad
00B15FD1     BE 00008B00      mov esi,AngelPIM.008B0000
00B15FD6     8DBE 0010B5FF    lea edi,dword ptr ds:[esi+FFB51000]
00B15FDC     C787 CCD04D00 8A>mov dword ptr ds:[edi+4DD0CC],B744D28A
00B15FE6     57               push edi
00B15FE7     83CD FF          or ebp,FFFFFFFF
00B15FEA     EB 0E            jmp short AngelPIM.00B15FFA
......

F8一次,在命令栏下命令 hr esp,回车,F9运行

00B16132     8903             mov dword ptr ds:[ebx],eax
00B16134     83C3 04          add ebx,4
00B16137   ^ EB E1            jmp short AngelPIM.00B1611A
00B16139     FF96 58E57100    call dword ptr ds:[esi+71E558]
00B1613F     61               popad
00B16140   ^ E9 FF58DCFF      jmp AngelPIM.008DBA44       ; 断在这里,飞向光明之颠!^_^
00B16145     0000             add byte ptr ds:[eax],al
00B16147     0060 61          add byte ptr ds:[eax+61],ah
......

F8到这里

008DBA44     55               push ebp           ; 程序OEP处用LordPE完全Dump这个进程
008DBA45     8BEC             mov ebp,esp
008DBA47     B9 1F000000      mov ecx,1F
008DBA4C     6A 00            push 0
008DBA4E     6A 00            push 0
008DBA50     49               dec ecx
008DBA51   ^ 75 F9            jnz short AngelPIM.008DBA4C
008DBA53     51               push ecx
008DBA54     53               push ebx
......

脱壳后程序可正常运行,用PEiD查为Borland Delphi 6.0 - 7.0编写。

---------------------------------------------------------------------------------------------
二、算法分析

运行脱壳后程序,输入相关信息

注册ID编号:  VMQRYUVT-JNPLVZYDK
用户姓名:  snake
软件受权序列号:78787878787878787878787

注:若输入的序列号位数不对,则提示“您输入的软件授权序列号长度不对,请仔细检查!”,序列号应为23位。

注册后提示:注册码若正确,则能正常打开功能窗口否则软件自动关闭。请仔细阅读注册码邮件。

因软件是Borland Delphi语言编写,只好请出DeDe小分析一下,好找个合适的断点继续分析

单元名    模块名    事件    RVA    提示
MAIN    TMainForm  mnZipCodeClick  008BCD18  0015

就找008BCD18这个断点吧,看着也顺眼,不影响心情,呵呵。

----------------------------------------------------------------------------------------
Ollydbg载入脱壳后的程序,F9运行,输入注册信息,注册,弹出提示信息,确定。 

在命令栏输入bp 008BCD18,回车,点击[工具]-->[邮编区号],程序被断下

008BCD18    .  55             push ebp                                 ;  断在这里
008BCD19    .  8BEC           mov ebp,esp
008BCD1B    .  83C4 F8        add esp,-8
008BCD1E    .  53             push ebx
008BCD1F    .  56             push esi
008BCD20    .  57             push edi
008BCD21    .  8955 F8        mov dword ptr ss:[ebp-8],edx
008BCD24    .  8945 FC        mov dword ptr ss:[ebp-4],eax
008BCD27    .  8B45 FC        mov eax,dword ptr ss:[ebp-4]
008BCD2A    .  50             push eax
008BCD2B    .  8B0D 24EC8E00  mov ecx,dword ptr ds:[8EEC24]            ;  x.008F7C94
008BCD31    .  8B15 64AD8700  mov edx,dword ptr ds:[87AD64]            ;  x.0087ADB0
008BCD37    .  8B45 FC        mov eax,dword ptr ss:[ebp-4]
008BCD3A    .  E8 8D140000    call x.008BE1CC                          ;  F7跟进
008BCD3F    .  A1 24EC8E00    mov eax,dword ptr ds:[8EEC24]
008BCD44    .  8338 00        cmp dword ptr ds:[eax],0
008BCD47    .  74 36          je short x.008BCD7F
008BCD49    .  33C0           xor eax,eax
008BCD4B    .  55             push ebp
008BCD4C    .  68 75CD8B00    push x.008BCD75
008BCD51    .  64:FF30        push dword ptr fs:[eax]
008BCD54    .  64:8920        mov dword ptr fs:[eax],esp
008BCD57    .  A1 24EC8E00    mov eax,dword ptr ds:[8EEC24]
008BCD5C    .  8B00           mov eax,dword ptr ds:[eax]
008BCD5E    .  8B80 54030000  mov eax,dword ptr ds:[eax+354]
008BCD64    .  B2 01          mov dl,1
008BCD66    .  E8 ADCCC0FF    call x.004C9A18
008BCD6B    .  33C0           xor eax,eax
008BCD6D    .  5A             pop edx
008BCD6E    .  59             pop ecx
008BCD6F    .  59             pop ecx
008BCD70    .  64:8910        mov dword ptr fs:[eax],edx
008BCD73    .  EB 0A          jmp short x.008BCD7F
......

========================= 跟进 008BCD3A    E8 8D140000    call x.008BE1CC  =========================

008BE1CC    $  55             push ebp
008BE1CD    .  8BEC           mov ebp,esp
008BE1CF    .  51             push ecx
008BE1D0    .  B9 2D000000    mov ecx,2D
008BE1D5    >  6A 00          push 0
008BE1D7    .  6A 00          push 0
008BE1D9    .  49             dec ecx
008BE1DA    .^ 75 F9          jnz short x.008BE1D5
008BE1DC    .  874D FC        xchg dword ptr ss:[ebp-4],ecx
008BE1DF    .  53             push ebx
008BE1E0    .  894D F4        mov dword ptr ss:[ebp-C],ecx
008BE1E3    .  8955 F8        mov dword ptr ss:[ebp-8],edx
008BE1E6    .  8945 FC        mov dword ptr ss:[ebp-4],eax
008BE1E9    .  33C0           xor eax,eax
008BE1EB    .  55             push ebp
008BE1EC    .  68 80E68B00    push x.008BE680
008BE1F1    .  64:FF30        push dword ptr fs:[eax]
008BE1F4    .  64:8920        mov dword ptr fs:[eax],esp
008BE1F7    .  8B45 FC        mov eax,dword ptr ss:[ebp-4]
008BE1FA    .  8B80 04030000  mov eax,dword ptr ds:[eax+304]
008BE200    .  8078 40 00     cmp byte ptr ds:[eax+40],0
008BE204    .  75 0A          jnz short x.008BE210
008BE206    .  E8 D53EB5FF    call x.004120E0
008BE20B    .  E9 48040000    jmp x.008BE658
008BE210    >  A1 34F18E00    mov eax,dword ptr ds:[8EF134]
008BE215    .  8B00           mov eax,dword ptr ds:[eax]
008BE217    .  E8 104CC3FF    call x.004F2E2C
008BE21C    .  A0 087E8F00    mov al,byte ptr ds:[8F7E08]
008BE221    .  0A05 6C8E8F00  or al,byte ptr ds:[8F8E6C]
008BE227    .  0F85 2B040000  jnz x.008BE658
008BE22D    .  803D 6D8E8F00 >cmp byte ptr ds:[8F8E6D],0
008BE234    .  0F85 1E040000  jnz x.008BE658
008BE23A    .  C605 087E8F00 >mov byte ptr ds:[8F7E08],1
008BE241    .  33C0           xor eax,eax
008BE243    .  55             push ebp
008BE244    .  68 51E68B00    push x.008BE651
008BE249    .  64:FF30        push dword ptr fs:[eax]
008BE24C    .  64:8920        mov dword ptr fs:[eax],esp
008BE24F    .  8D4D E0        lea ecx,dword ptr ss:[ebp-20]
008BE252    .  33D2           xor edx,edx
008BE254    .  B8 98E68B00    mov eax,x.008BE698                       ;  ASCII "MachineId"
008BE259    .  E8 165CFBFF    call x.00873E74
008BE25E    .  8B45 E0        mov eax,dword ptr ss:[ebp-20]            ;  取注册ID编号 VMQRYUVT-JNPLVZYDK
008BE261    .  8D4D E4        lea ecx,dword ptr ss:[ebp-1C]
008BE264    .  33D2           xor edx,edx
008BE266    .  E8 095CFBFF    call x.00873E74                          ;  取假序列号 78787878787878787878787
008BE26B    .  837D E4 00     cmp dword ptr ss:[ebp-1C],0              ;  是否为空
008BE26F    .  0F84 39010000  je x.008BE3AE
008BE275    .  8D45 DC        lea eax,dword ptr ss:[ebp-24]
008BE278    .  50             push eax
008BE279    .  8D4D D4        lea ecx,dword ptr ss:[ebp-2C]
008BE27C    .  33D2           xor edx,edx
008BE27E    .  B8 ACE68B00    mov eax,x.008BE6AC                       ;  ASCII "MachineID"
008BE283    .  E8 EC5BFBFF    call x.00873E74
008BE288    .  8D45 D4        lea eax,dword ptr ss:[ebp-2C]
008BE28B    .  50             push eax
008BE28C    .  8D4D CC        lea ecx,dword ptr ss:[ebp-34]
008BE28F    .  8B15 0CF18E00  mov edx,dword ptr ds:[8EF10C]            ;  x.008F7C38
008BE295    .  8B12           mov edx,dword ptr ds:[edx]               ;  取用户姓名 snake
008BE297    .  B8 C0E68B00    mov eax,x.008BE6C0                       ;  ASCII "RealName"
008BE29C    .  E8 D35BFBFF    call x.00873E74                          ;  小写字母转大写字母call
008BE2A1    .  8B45 CC        mov eax,dword ptr ss:[ebp-34]         ;  eax="SNAKE"
008BE2A4    .  8D55 D0        lea edx,dword ptr ss:[ebp-30]            
008BE2A7    .  E8 5C1DFBFF    call x.00870008
008BE2AC    .  8B55 D0        mov edx,dword ptr ss:[ebp-30]
008BE2AF    .  58             pop eax
008BE2B0    .  E8 FB72B4FF    call x.004055B0                          ;  字符串连接call
008BE2B5    .  8B45 D4        mov eax,dword ptr ss:[ebp-2C]            ;  eax="VMQRYUVT-JNPLVZYDKSNAKE"
008BE2B8    .  8D55 D8        lea edx,dword ptr ss:[ebp-28]
008BE2BB    .  E8 A0010100    call x.008CE460                          ;  算法call,F7跟进
008BE2C0    .  8B45 D8        mov eax,dword ptr ss:[ebp-28]            ;  ★eax="D8TXQ-DCZTE-CDKXZ-WQMGF" 真序列号
008BE2C3    .  B9 0D000000    mov ecx,0D
008BE2C8    .  BA 01000000    mov edx,1
008BE2CD    .  E8 3675B4FF    call x.00405808
008BE2D2    .  8B45 DC        mov eax,dword ptr ss:[ebp-24]
008BE2D5    .  50             push eax
008BE2D6    .  8D45 C8        lea eax,dword ptr ss:[ebp-38]
008BE2D9    .  50             push eax
008BE2DA    .  8D4D C0        lea ecx,dword ptr ss:[ebp-40]
008BE2DD    .  33D2           xor edx,edx
008BE2DF    .  B8 98E68B00    mov eax,x.008BE698                       ;  ASCII "MachineId"
008BE2E4    .  E8 8B5BFBFF    call x.00873E74
008BE2E9    .  8B45 C0        mov eax,dword ptr ss:[ebp-40]
008BE2EC    .  8D4D C4        lea ecx,dword ptr ss:[ebp-3C]
008BE2EF    .  33D2           xor edx,edx
008BE2F1    .  E8 7E5BFBFF    call x.00873E74
008BE2F6    .  8B45 C4        mov eax,dword ptr ss:[ebp-3C]
008BE2F9    .  B9 0D000000    mov ecx,0D
008BE2FE    .  BA 01000000    mov edx,1
008BE303    .  E8 0075B4FF    call x.00405808
008BE308    .  8B55 C8        mov edx,dword ptr ss:[ebp-38]
008BE30B    .  58             pop eax
008BE30C    .  E8 E373B4FF    call x.004056F4
008BE311    .  0F84 97000000  je x.008BE3AE                            ;  ★★关键跳转,跳则为正式版,爆破点
008BE317    .  8B15 0CF18E00  mov edx,dword ptr ds:[8EF10C]            ;  x.008F7C38
008BE31D    .  8B12           mov edx,dword ptr ds:[edx]
008BE31F    .  8D45 BC        lea eax,dword ptr ss:[ebp-44]
008BE322    .  B9 D4E68B00    mov ecx,x.008BE6D4                       ;  ASCII "LastFunc"
008BE327    .  E8 C872B4FF    call x.004055F4
008BE32C    .  8B45 BC        mov eax,dword ptr ss:[ebp-44]
008BE32F    .  B1 01          mov cl,1
008BE331    .  33D2           xor edx,edx
008BE333    .  E8 9454FBFF    call x.008737CC
008BE338    .  A1 34F18E00    mov eax,dword ptr ds:[8EF134]
008BE33D    .  8B00           mov eax,dword ptr ds:[eax]
008BE33F    .  E8 E84AC3FF    call x.004F2E2C
008BE344    .  8B15 0CF18E00  mov edx,dword ptr ds:[8EF10C]            ;  x.008F7C38
008BE34A    .  8B12           mov edx,dword ptr ds:[edx]
008BE34C    .  8D45 B8        lea eax,dword ptr ss:[ebp-48]
......

========================= 跟进 008BE2BB   E8 A0010100    call x.008CE460 =========================

008CE460   /$  55             push ebp
008CE461   |.  8BEC           mov ebp,esp
008CE463   |.  B9 12000000    mov ecx,12
008CE468   |>  6A 00          /push 0
008CE46A   |.  6A 00          |push 0
008CE46C   |.  49             |dec ecx
008CE46D   |.^ 75 F9          \jnz short x.008CE468
008CE46F   |.  8955 F8        mov [local.2],edx
008CE472   |.  8945 FC        mov [local.1],eax
008CE475   |.  8B45 FC        mov eax,[local.1]
008CE478   |.  E8 1B73B3FF    call x.00405798
008CE47D   |.  33C0           xor eax,eax
008CE47F   |.  55             push ebp
008CE480   |.  68 E5E88C00    push x.008CE8E5
008CE485   |.  64:FF30        push dword ptr fs:[eax]
008CE488   |.  64:8920        mov dword ptr fs:[eax],esp
008CE48B   |.  EB 26          jmp short x.008CE4B3
008CE48D   |>  FF75 FC        /push [local.1]
008CE490   |.  8B45 FC        |mov eax,[local.1]
008CE493   |.  E8 1071B3FF    |call x.004055A8
008CE498   |.  8D55 D8        |lea edx,[local.10]
008CE49B   |.  E8 B8D5B3FF    |call x.0040BA58
008CE4A0   |.  FF75 D8        |push [local.10]
008CE4A3   |.  FF75 FC        |push [local.1]
008CE4A6   |.  8D45 FC        |lea eax,[local.1]
008CE4A9   |.  BA 03000000    |mov edx,3
008CE4AE   |.  E8 B571B3FF    |call x.00405668
008CE4B3   |>  8B45 FC         mov eax,[local.1]                       ;  eax="VMQRYUVT-JNPLVZYDKSNAKE"
008CE4B6   |.  E8 ED70B3FF    |call x.004055A8                         ;  计算长度call
008CE4BB   |.  83F8 08        |cmp eax,8
008CE4BE   |.^ 7C CD          \jl short x.008CE48D
008CE4C0   |.  8D45 E8        lea eax,[local.6]
008CE4C3   |.  BA F8E88C00    mov edx,x.008CE8F8                       ;  ASCII "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
008CE4C8   |.  E8 876EB3FF    call x.00405354
008CE4CD   |.  8D45 E4        lea eax,[local.7]
008CE4D0   |.  BA 40E98C00    mov edx,x.008CE940                       ;  ASCII "GHghuct28C1F67DXvwfjxn34py5eJKYE9AstuZaLklmMPQBRSUVWdzeNOboqrT"
008CE4D5   |.  E8 7A6EB3FF    call x.00405354
008CE4DA   |.  8D45 E4        lea eax,[local.7]
008CE4DD   |.  BA 88E98C00    mov edx,x.008CE988                       ;  ASCII "dzestuvhuct28DKZaLklmMNORSUVXYE9APQBJWboqrTwfjxn34py5eC1F67GHg"
008CE4E2   |.  E8 6D6EB3FF    call x.00405354
008CE4E7   |.  8D45 E4        lea eax,[local.7]
008CE4EA   |.  BA D0E98C00    mov edx,x.008CE9D0                       ;  ASCII "LklmMNORSUVWboE9APQBdzestuvwfjxqrTC1F67GHghuct28Dn34py5eJKZaXY"
008CE4EF   |.  E8 606EB3FF    call x.00405354
008CE4F4   |.  8D45 E4        lea eax,[local.7]
008CE4F7   |.  BA 18EA8C00    mov edx,x.008CEA18                       ;  ASCII "XYE9APQBdzestu34py5eJKZaLkv1F67GHghuwfjxnlmMNORSUVWboqrTCct28D"
008CE4FC   |.  E8 536EB3FF    call x.00405354
008CE501   |.  8D45 E0        lea eax,[local.8]
008CE504   |.  BA 60EA8C00    mov edx,x.008CEA60                       ;  ASCII "!1F67@Hgh#c0$8DX5E9%PQB^zes+uvw)jx?04py5}JKZaP{lmMNO|SU\Wbo(rT"
008CE509   |.  E8 466EB3FF    call x.00405354
008CE50E   |.  A0 A0EA8C00    mov al,byte ptr ds:[8CEAA0]
008CE513   |.  50             push eax
008CE514   |.  8D45 D4        lea eax,[local.11]
008CE517   |.  50             push eax
008CE518   |.  33C9           xor ecx,ecx
008CE51A   |.  BA ACEA8C00    mov edx,x.008CEAAC
008CE51F   |.  8B45 FC        mov eax,[local.1]
008CE522   |.  E8 C54CB4FF    call x.004131EC                          ;  去掉连接符'-'call
008CE527   |.  8B55 D4        mov edx,[local.11]                       ;  edx="VMQRYUVTJNPLVZYDKSNAKE"
008CE52A   |.  8D45 FC        lea eax,[local.1]
008CE52D   |.  E8 226EB3FF    call x.00405354
008CE532   |.  8D45 EC        lea eax,[local.5]
008CE535   |.  E8 826DB3FF    call x.004052BC
008CE53A   |.  8B45 FC        mov eax,[local.1]                        ;  eax="VMQRYUVTJNPLVZYDKSNAKE"
008CE53D   |.  E8 6670B3FF    call x.004055A8                          ;  计算长度call
008CE542   |.  85C0           test eax,eax                             ;  eax=16
008CE544   |.  7E 4D          jle short x.008CE593
008CE546   |.  8945 DC        mov [local.9],eax                        ;  [12FAFC]=16,做计数器
008CE549   |.  C745 F4 010000>mov [local.3],1                          ;  [12FB14]=1
008CE550   |>  8D45 D0        /lea eax,[local.12]                      ;  eax=12FAF0
008CE553   |.  50             |push eax
008CE554   |.  8D45 CC        |lea eax,[local.13]                      ;  eax=12FAFC
008CE557   |.  8B55 FC        |mov edx,[local.1]                       ;  edx="VMQRYUVTJNPLVZYDKSNAKE"
008CE55A   |.  8B4D F4        |mov ecx,[local.3]                       ;  ecx=1
008CE55D   |.  8A540A FF      |mov dl,byte ptr ds:[edx+ecx-1]          ;  dl='V'
008CE561   |.  E8 3E6FB3FF    |call x.004054A4                         ;  转存字符
008CE566   |.  8B45 CC        |mov eax,[local.13]                      ;  eax='V'
008CE569   |.  8B55 E4        |mov edx,[local.7]                       ;  edx="XYE9APQBdzestu34py5eJKZaLkv1F67GHghuwfjxnlmMNORSUVWboqrTCct28D"
008CE56C   |.  E8 7B73B3FF    |call x.004058EC                         ;  计算eax中字符在edx字符串中的位置序号call
008CE571   |.  8BD0           |mov edx,eax                             ;  edx=32
008CE573   |.  B9 01000000    |mov ecx,1                               ;  ecx=1
008CE578   |.  8B45 E8        |mov eax,[local.6]                       ;  eax="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
008CE57B   |.  E8 8872B3FF    |call x.00405808                         ;  取eax字符串中位置为edx-ecx处的字符call
008CE580   |.  8B55 D0        |mov edx,[local.12]                      ;  取得的新字符
008CE583   |.  8D45 EC        |lea eax,[local.5]                       ;  存放新字符,最终组成新字符串
008CE586   |.  E8 2570B3FF    |call x.004055B0
008CE58B   |.  FF45 F4        |inc [local.3]
008CE58E   |.  FF4D DC        |dec [local.9]
008CE591   |.^ 75 BD          \jnz short x.008CE550
008CE593   |>  8D45 C8        lea eax,[local.14]
008CE596   |.  50             push eax
008CE597   |.  B9 01000000    mov ecx,1
008CE59C   |.  BA 10000000    mov edx,10
008CE5A1   |.  8B45 EC        mov eax,[local.5]                        ;  eax="nh6k1mntKi5OnM1zLli4L2" 生成的字符串
008CE5A4   |.  E8 5F72B3FF    call x.00405808                          ;  取子串call
008CE5A9   |.  FF75 C8        push [local.14]                          ;  "z"
008CE5AC   |.  8D45 C4        lea eax,[local.15]
008CE5AF   |.  50             push eax
008CE5B0   |.  8B45 EC        mov eax,[local.5]
008CE5B3   |.  E8 F06FB3FF    call x.004055A8                          ;  计算长度call
008CE5B8   |.  8BC8           mov ecx,eax
008CE5BA   |.  83E9 12        sub ecx,12
008CE5BD   |.  BA 13000000    mov edx,13
008CE5C2   |.  8B45 EC        mov eax,[local.5]
008CE5C5   |.  E8 3E72B3FF    call x.00405808
008CE5CA   |.  FF75 C4        push [local.15]                          ;  "i4L2"
008CE5CD   |.  8D45 C0        lea eax,[local.16]
008CE5D0   |.  50             push eax
008CE5D1   |.  B9 05000000    mov ecx,5
008CE5D6   |.  BA 01000000    mov edx,1
008CE5DB   |.  8B45 EC        mov eax,[local.5]
008CE5DE   |.  E8 2572B3FF    call x.00405808
008CE5E3   |.  FF75 C0        push [local.16]                          ;  "nh6k1"
008CE5E6   |.  8D45 BC        lea eax,[local.17]
008CE5E9   |.  50             push eax
008CE5EA   |.  B9 01000000    mov ecx,1
008CE5EF   |.  BA 10000000    mov edx,10
008CE5F4   |.  8B45 EC        mov eax,[local.5]
008CE5F7   |.  E8 0C72B3FF    call x.00405808
008CE5FC   |.  FF75 BC        push [local.17]                          ;  "z"
008CE5FF   |.  8D45 B8        lea eax,[local.18]
008CE602   |.  50             push eax
008CE603   |.  B9 05000000    mov ecx,5
008CE608   |.  BA 06000000    mov edx,6
008CE60D   |.  8B45 EC        mov eax,[local.5]
008CE610   |.  E8 F371B3FF    call x.00405808
008CE615   |.  FF75 B8        push [local.18]                          ;  "mntKi"
008CE618   |.  8D45 B4        lea eax,[local.19]
008CE61B   |.  50             push eax
008CE61C   |.  B9 01000000    mov ecx,1
008CE621   |.  BA 11000000    mov edx,11
008CE626   |.  8B45 EC        mov eax,[local.5]
008CE629   |.  E8 DA71B3FF    call x.00405808
008CE62E   |.  FF75 B4        push [local.19]                          ;  "L"
008CE631   |.  8D45 B0        lea eax,[local.20]
008CE634   |.  50             push eax
008CE635   |.  8B45 EC        mov eax,[local.5]
008CE638   |.  E8 6B6FB3FF    call x.004055A8
008CE63D   |.  8BC8           mov ecx,eax
008CE63F   |.  83E9 12        sub ecx,12
008CE642   |.  BA 13000000    mov edx,13
008CE647   |.  8B45 EC        mov eax,[local.5]
008CE64A   |.  E8 B971B3FF    call x.00405808
008CE64F   |.  FF75 B0        push [local.20]                          ;  "i4L2"
008CE652   |.  8D45 AC        lea eax,[local.21]
008CE655   |.  50             push eax
008CE656   |.  B9 05000000    mov ecx,5
008CE65B   |.  BA 0B000000    mov edx,0B
008CE660   |.  8B45 EC        mov eax,[local.5]
008CE663   |.  E8 A071B3FF    call x.00405808
008CE668   |.  FF75 AC        push [local.21]                          ;  "5OnM1"
008CE66B   |.  8D45 A8        lea eax,[local.22]
008CE66E   |.  50             push eax
008CE66F   |.  B9 01000000    mov ecx,1
008CE674   |.  BA 11000000    mov edx,11
008CE679   |.  8B45 EC        mov eax,[local.5]
008CE67C   |.  E8 8771B3FF    call x.00405808
008CE681   |.  FF75 A8        push [local.22]                          ;  "L"
008CE684   |.  8D45 A4        lea eax,[local.23]
008CE687   |.  50             push eax
008CE688   |.  B9 05000000    mov ecx,5
008CE68D   |.  BA 06000000    mov edx,6
008CE692   |.  8B45 EC        mov eax,[local.5]
008CE695   |.  E8 6E71B3FF    call x.00405808
008CE69A   |.  FF75 A4        push [local.23]                          ;  "mntKi"
008CE69D   |.  8D45 A0        lea eax,[local.24]
008CE6A0   |.  50             push eax
008CE6A1   |.  B9 05000000    mov ecx,5
008CE6A6   |.  BA 06000000    mov edx,6
008CE6AB   |.  8B45 EC        mov eax,[local.5]
008CE6AE   |.  E8 5571B3FF    call x.00405808
008CE6B3   |.  FF75 A0        push [local.24]                          ;  "mntKi"
008CE6B6   |.  8D45 9C        lea eax,[local.25]
008CE6B9   |.  50             push eax
008CE6BA   |.  B9 01000000    mov ecx,1
008CE6BF   |.  BA 11000000    mov edx,11
008CE6C4   |.  8B45 EC        mov eax,[local.5]
008CE6C7   |.  E8 3C71B3FF    call x.00405808
008CE6CC   |.  FF75 9C        push [local.25]                          ;  "L"
008CE6CF   |.  8D45 98        lea eax,[local.26]
008CE6D2   |.  50             push eax
008CE6D3   |.  8B45 EC        mov eax,[local.5]
008CE6D6   |.  E8 CD6EB3FF    call x.004055A8
008CE6DB   |.  8BC8           mov ecx,eax
008CE6DD   |.  83E9 12        sub ecx,12
008CE6E0   |.  BA 13000000    mov edx,13
008CE6E5   |.  8B45 EC        mov eax,[local.5]
008CE6E8   |.  E8 1B71B3FF    call x.00405808
008CE6ED   |.  FF75 98        push [local.26]                          ;  "i4L2"
008CE6F0   |.  8D45 94        lea eax,[local.27]
008CE6F3   |.  50             push eax
008CE6F4   |.  B9 05000000    mov ecx,5
008CE6F9   |.  BA 0B000000    mov edx,0B
008CE6FE   |.  8B45 EC        mov eax,[local.5]
008CE701   |.  E8 0271B3FF    call x.00405808
008CE706   |.  FF75 94        push [local.27]                          ;  "5OnM1"
008CE709   |.  8D45 90        lea eax,[local.28]
008CE70C   |.  50             push eax
008CE70D   |.  B9 01000000    mov ecx,1
008CE712   |.  BA 11000000    mov edx,11
008CE717   |.  8B45 EC        mov eax,[local.5]
008CE71A   |.  E8 E970B3FF    call x.00405808
008CE71F   |.  FF75 90        push [local.28]                          ;  "L"
008CE722   |.  8D45 8C        lea eax,[local.29]
008CE725   |.  50             push eax
008CE726   |.  B9 05000000    mov ecx,5
008CE72B   |.  BA 06000000    mov edx,6
008CE730   |.  8B45 EC        mov eax,[local.5]
008CE733   |.  E8 D070B3FF    call x.00405808
008CE738   |.  FF75 8C        push [local.29]                          ;  "mntKi"
008CE73B   |.  8D45 88        lea eax,[local.30]
008CE73E   |.  50             push eax
008CE73F   |.  B9 01000000    mov ecx,1
008CE744   |.  BA 12000000    mov edx,12
008CE749   |.  8B45 EC        mov eax,[local.5]
008CE74C   |.  E8 B770B3FF    call x.00405808
008CE751   |.  FF75 88        push [local.30]                          ;  "l"
008CE754   |.  8D45 84        lea eax,[local.31]
008CE757   |.  50             push eax
008CE758   |.  8B45 EC        mov eax,[local.5]
008CE75B   |.  E8 486EB3FF    call x.004055A8
008CE760   |.  8BC8           mov ecx,eax
008CE762   |.  83E9 12        sub ecx,12
008CE765   |.  BA 13000000    mov edx,13
008CE76A   |.  8B45 EC        mov eax,[local.5]
008CE76D   |.  E8 9670B3FF    call x.00405808
008CE772   |.  FF75 84        push [local.31]                          ;  "i4L2"
008CE775   |.  8D45 FC        lea eax,[local.1]
008CE778   |.  BA 12000000    mov edx,12
008CE77D   |.  E8 E66EB3FF    call x.00405668
008CE782   |.  33C0           xor eax,eax
008CE784   |.  8945 F0        mov [local.4],eax
008CE787   |.  8D45 EC        lea eax,[local.5]
008CE78A   |.  E8 2D6BB3FF    call x.004052BC                          ;  连接字符串call,把子串连成新字符串
008CE78F   |.  8B45 FC        mov eax,[local.1]                        ;  eax="zi4L2nh6k1zmntKiLi4L25OnM1LmntKimntKiLi4L25OnM1LmntKili4L2"
008CE792   |.  E8 116EB3FF    call x.004055A8                          ;  计算字符串的长度
008CE797   |.  85C0           test eax,eax                             ;  eax=3A
008CE799   |.  7E 55          jle short x.008CE7F0
008CE79B   |.  8945 DC        mov [local.9],eax                        ;  计数器
008CE79E   |.  C745 F4 010000>mov [local.3],1
008CE7A5   |>  8B45 FC        /mov eax,[local.1]                       ;  eax=新字符串
008CE7A8   |.  8B55 F4        |mov edx,[local.3]                       ;  edx递增
008CE7AB   |.  0FB64410 FF    |movzx eax,byte ptr ds:[eax+edx-1]       ;  依次取串中的每个字符
008CE7B0   |.  0145 F0        |add [local.4],eax                       ;  累加
008CE7B3   |.  8D45 80        |lea eax,[local.32]
008CE7B6   |.  50             |push eax
008CE7B7   |.  8B45 F0        |mov eax,[local.4]
008CE7BA   |.  B9 3E000000    |mov ecx,3E
008CE7BF   |.  99             |cdq
008CE7C0   |.  F7F9           |idiv ecx
008CE7C2   |.  42             |inc edx
008CE7C3   |.  B9 01000000    |mov ecx,1
008CE7C8   |.  8B45 E4        |mov eax,[local.7]                       ;  eax="XYE9APQBdzestu34py5eJKZaLkv1F67GHghuwfjxnlmMNORSUVWboqrTCct28D"
008CE7CB   |.  E8 3870B3FF    |call x.00405808                         ;  在eax字符串中的edx位置处取ecx个字符
008CE7D0   |.  8B55 80        |mov edx,[local.32]
008CE7D3   |.  8D45 EC        |lea eax,[local.5]
008CE7D6   |.  E8 D56DB3FF    |call x.004055B0
008CE7DB   |.  FF45 F4        |inc [local.3]
008CE7DE   |.  FF4D DC        |dec [local.9]
008CE7E1   |.^ 75 C2          \jnz short x.008CE7A5
008CE7E3   |.  EB 0B          jmp short x.008CE7F0
008CE7E5   |>  8D45 EC        /lea eax,[local.5]
008CE7E8   |.  8B55 EC        |mov edx,[local.5]
008CE7EB   |.  E8 C06DB3FF    |call x.004055B0
008CE7F0   |>  8B45 EC         mov eax,[local.5]                       ;  eax=新字符串"8lGOgeDqwaKQrR2nrukx15uKwafZdXuCl1eHu1d8tXqdCztecMuU6uCR8U"
008CE7F3   |.  E8 B06DB3FF    |call x.004055A8
008CE7F8   |.  83F8 14        |cmp eax,14
008CE7FB   |.^ 7C E8          \jl short x.008CE7E5
008CE7FD   |.  8B45 EC        mov eax,[local.5]
008CE800   |.  E8 A36DB3FF    call x.004055A8
008CE805   |.  83F8 0A        cmp eax,0A
008CE808   |.  7E 1E          jle short x.008CE828
008CE80A   |.  8D45 EC        lea eax,[local.5]
008CE80D   |.  50             push eax
008CE80E   |.  8B45 EC        mov eax,[local.5]                        ;  新生成的字符串
008CE811   |.  E8 926DB3FF    call x.004055A8                          ;  字符串长度call
008CE816   |.  8BD0           mov edx,eax                              ;  字符串长为3A
008CE818   |.  83EA 13        sub edx,13
008CE81B   |.  B9 0B000000    mov ecx,0B
008CE820   |.  8B45 EC        mov eax,[local.5]                        ;  eax为新生成的字符串
008CE823   |.  E8 E06FB3FF    call x.00405808                          ;  取子字符串call
008CE828   |>  8D85 78FFFFFF  lea eax,[local.34]                       ;  "d8tXqdCztec"
008CE82E   |.  50             push eax
008CE82F   |.  B9 05000000    mov ecx,5
008CE834   |.  BA 01000000    mov edx,1
008CE839   |.  8B45 EC        mov eax,[local.5]                        ;  eax="d8tXqdCztec"
008CE83C   |.  E8 C76FB3FF    call x.00405808
008CE841   |.  FFB5 78FFFFFF  push [local.34]                          ;  "d8tXq"
008CE847   |.  68 ACEA8C00    push x.008CEAAC
008CE84C   |.  8D85 74FFFFFF  lea eax,[local.35]
008CE852   |.  50             push eax
008CE853   |.  B9 05000000    mov ecx,5
008CE858   |.  BA 06000000    mov edx,6
008CE85D   |.  8B45 EC        mov eax,[local.5]
008CE860   |.  E8 A36FB3FF    call x.00405808
008CE865   |.  FFB5 74FFFFFF  push [local.35]                          ;  "dCzte"
008CE86B   |.  68 ACEA8C00    push x.008CEAAC
008CE870   |.  8D85 70FFFFFF  lea eax,[local.36]
008CE876   |.  50             push eax
008CE877   |.  B9 01000000    mov ecx,1
008CE87C   |.  BA 0B000000    mov edx,0B
008CE881   |.  8B45 EC        mov eax,[local.5]
008CE884   |.  E8 7F6FB3FF    call x.00405808
008CE889   |.  FFB5 70FFFFFF  push [local.36]                          ;  "c"
008CE88F   |.  68 B8EA8C00    push x.008CEAB8                          ;  ASCII "DKXZ-WQMGF"
008CE894   |.  8D85 7CFFFFFF  lea eax,[local.33]
008CE89A   |.  BA 06000000    mov edx,6
008CE89F   |.  E8 C46DB3FF    call x.00405668                          ;  字符串连接call
008CE8A4   |.  8B85 7CFFFFFF  mov eax,[local.33]                       ;  eax="d8tXq-dCzte-cDKXZ-WQMGF"
008CE8AA   |.  8B55 F8        mov edx,[local.2]
008CE8AD   |.  E8 F6C4B3FF    call x.0040ADA8             ;  转换成大写字母
008CE8B2   |.  33C0           xor eax,eax
008CE8B4   |.  5A             pop edx
008CE8B5   |.  59             pop ecx
008CE8B6   |.  59             pop ecx
008CE8B7   |.  64:8910        mov dword ptr fs:[eax],edx
008CE8BA   |.  68 ECE88C00    push x.008CE8EC
008CE8BF   |>  8D85 70FFFFFF  lea eax,[local.36]
008CE8C5   |.  BA 1B000000    mov edx,1B
008CE8CA   |.  E8 116AB3FF    call x.004052E0
008CE8CF   |.  8D45 E0        lea eax,[local.8]
008CE8D2   |.  BA 04000000    mov edx,4
008CE8D7   |.  E8 046AB3FF    call x.004052E0
008CE8DC   |.  8D45 FC        lea eax,[local.1]
008CE8DF   |.  E8 D869B3FF    call x.004052BC
008CE8E4   \.  C3             retn

---------------------------------------------------------------------------------------------------------
【汇编注册机算法部分源码】

    .data
szStr1    db  'XYE9APQBdzestu34py5eJKZaLkv1F67GHghuwfjxnlmMNORSUVWboqrTCct28D',0
szStr2    db  '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',0
szStrCon  db  'DKXZ-WQMGF',0

    .code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;函数功能:从给定字符串中取指定位置和指定个数的子字符串函数
;函数参数:
;  lpszStr:  指针,待取子串的字符串地址
;  lpszSubStr:   指针,取得的子字符串的地址
;  nPos:    取子串的位置
;  nNum:    取子串的个数
;返回值:没有
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
StrMidBuffer  proc  lpszStr:DWORD,nPos:DWORD,nNum:DWORD,lpszSubStr:DWORD
  pushad
  mov  esi,lpszStr
  mov  edi,lpszSubStr
  invoke  lstrlen,esi
  mov  ebx,eax
  mov  ecx,nNum
  mov  edx,nPos
  dec  edx
  sub  ebx,edx
  add  edx,lpszStr
  mov  esi,edx
  rep movs BYTE ptr es:[edi],BYTE ptr ds:[esi]
  mov  BYTE ptr [edi+ecx],0
  popad
  ret
StrMidBuffer  endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
GetRegKey  proc  hDlg:DWORD
  local  szRegName[32]:BYTE,szRegNum[64]:BYTE,szRegID[64]:BYTE
  local  nLen1:DWORD,nLen2:DWORD,szTmp1[80]:BYTE,szTmp2[80]:BYTE,szTmp3[32]:BYTE
  pushad
  invoke  GetDlgItemText,hDlg,IDC_NAME,addr szRegName,sizeof szRegName    ;取用户姓名
  .if  !eax
    invoke  SetDlgItemText,hDlg,IDC_REG,addr szTextErr1
  .else
    invoke  GetDlgItemText,hDlg,IDC_ID,addr szRegID,sizeof szRegID    ;取注册ID编号
    .if  !eax
      invoke  SetDlgItemText,hDlg,IDC_REG,addr szTextErr2
    .else
;-------------------------------------------------------------------------------------
;    将注册ID编号和用户姓名连接起来、转换为大写并去掉'-'字符
;-------------------------------------------------------------------------------------
      invoke  lstrlen,addr szRegName
      invoke  CharUpperBuff,addr szRegName,eax
      invoke  lstrcat,addr szRegID,addr szRegName
      invoke  lstrlen,addr szRegID
      mov  nLen1,eax
      mov  ecx,eax
      xor  ebx,ebx
      xor  edx,edx
    @1:
      mov  al,BYTE ptr [szRegID+edx]
      inc  edx
      dec  ecx
      cmp  al,2dh
      je  @1
      mov  BYTE ptr [szTmp1+ebx],al
      inc  ebx
      cmp  al,0
      jnz  @1
;---------------------------------------------------------------------------------------
;    在给定字符串中循环取相应的字符并组成新字符串1
;---------------------------------------------------------------------------------------
      invoke  lstrlen,addr szStr1
      mov  nLen2,eax
      mov  ecx,nLen1
      xor  edx,edx
      xor  esi,esi
    @2:  
      push  ecx
      mov  ecx,nLen2
      mov  al,BYTE ptr [szTmp1+edx]
      lea  edi,szStr1
      repne scas BYTE ptr es:[edi]
      mov  ebx,nLen2
      sub  ebx,ecx
      dec  ebx
      mov  al,BYTE ptr [szStr2+ebx]
      mov  BYTE ptr [szTmp2+esi],al
      inc  edx
      inc  esi
      pop  ecx
      dec  ecx
      jnz  @2
      mov  BYTE ptr [szTmp2+esi-1],0
;--------------------------------------------------------------------------------------
;    在新字符串1中取相应的子字符串并连接成新字符串2
;--------------------------------------------------------------------------------------
      invoke  lstrlen,addr szTmp2
      mov  nLen1,eax
      invoke  RtlZeroMemory, addr szTmp1, sizeof szTmp1
      invoke  StrMidBuffer,addr szTmp2,10h,1,addr szTmp3
      invoke  lstrcat,addr szTmp1,addr szTmp3
      mov  ecx,nLen1
      sub  ecx,12h
      invoke  StrMidBuffer,addr szTmp2,13h,ecx,addr szTmp3
      invoke  lstrcat,addr szTmp1,addr szTmp3
      invoke  StrMidBuffer,addr szTmp2,1,5,addr szTmp3
      invoke  lstrcat,addr szTmp1,addr szTmp3
      invoke  StrMidBuffer,addr szTmp2,10h,1,addr szTmp3
      invoke  lstrcat,addr szTmp1,addr szTmp3
      invoke  StrMidBuffer,addr szTmp2,6,5,addr szTmp3
      invoke  lstrcat,addr szTmp1,addr szTmp3
      invoke  StrMidBuffer,addr szTmp2,11h,1,addr szTmp3
      invoke  lstrcat,addr szTmp1,addr szTmp3
      mov  ecx,nLen1
      sub  ecx,12h
      invoke  StrMidBuffer,addr szTmp2,13h,ecx,addr szTmp3
      invoke  lstrcat,addr szTmp1,addr szTmp3
      invoke  StrMidBuffer,addr szTmp2,0Bh,5,addr szTmp3
      invoke  lstrcat,addr szTmp1,addr szTmp3
      invoke  StrMidBuffer,addr szTmp2,11h,1,addr szTmp3
      invoke  lstrcat,addr szTmp1,addr szTmp3
      invoke  StrMidBuffer,addr szTmp2,6,5,addr szTmp3
      invoke  lstrcat,addr szTmp1,addr szTmp3
      invoke  StrMidBuffer,addr szTmp2,6,5,addr szTmp3
      invoke  lstrcat,addr szTmp1,addr szTmp3
      invoke  StrMidBuffer,addr szTmp2,11h,1,addr szTmp3
      invoke  lstrcat,addr szTmp1,addr szTmp3
      mov  ecx,nLen1
      sub  ecx,12h
      invoke  StrMidBuffer,addr szTmp2,13h,ecx,addr szTmp3
      invoke  lstrcat,addr szTmp1,addr szTmp3
      invoke  StrMidBuffer,addr szTmp2,0Bh,5,addr szTmp3
      invoke  lstrcat,addr szTmp1,addr szTmp3
      invoke  StrMidBuffer,addr szTmp2,11h,1,addr szTmp3
      invoke  lstrcat,addr szTmp1,addr szTmp3
      invoke  StrMidBuffer,addr szTmp2,6,5,addr szTmp3
      invoke  lstrcat,addr szTmp1,addr szTmp3
      invoke  StrMidBuffer,addr szTmp2,12h,1,addr szTmp3
      invoke  lstrcat,addr szTmp1,addr szTmp3
      mov  ecx,nLen1
      sub  ecx,12h
      invoke  StrMidBuffer,addr szTmp2,13h,ecx,addr szTmp3
      invoke  lstrcat,addr szTmp1,addr szTmp3
;------------------------------------------------------------------------------------------
;    在新字符串2中循环取相应的字符组成新字符串3
;------------------------------------------------------------------------------------------
      invoke  RtlZeroMemory, addr szTmp2, sizeof szTmp2
      invoke  lstrlen,addr szTmp1
      mov  nLen1,eax
      mov  ecx,eax
      xor  edi,edi
      xor  edx,edx
      xor  esi,esi
    @3:
      movzx   ebx,BYTE ptr [szTmp1+esi]
      add  edi,ebx
      mov  eax,edi
      push  ecx
      mov  ecx,3eh
      cdq
      idiv  ecx
      mov  bl,BYTE ptr [szStr1+edx]
      mov  BYTE ptr [szTmp2+esi],bl
      pop  ecx
      inc  esi
      dec  ecx
      jnz  @3
;--------------------------------------------------------------------------------------------
;    在新字符串3中取相应的了字符串与固定字符串连接并转换成大写生成序列号
;--------------------------------------------------------------------------------------------
      invoke  RtlZeroMemory, addr szRegNum, sizeof szRegNum
      mov  edx,nLen1
      sub  edx,13h
      mov  ecx,0Bh
      invoke  StrMidBuffer,addr szTmp2,edx,ecx,addr szTmp1
      invoke  CharUpperBuff,addr szTmp1,ecx
      invoke  StrMidBuffer,addr szTmp1,1,5,addr szTmp3
      invoke  lstrcat,addr szRegNum,addr szTmp3
      mov  BYTE ptr [szRegNum+5],2dh
      invoke  StrMidBuffer,addr szTmp1,6,5,addr szTmp3
      invoke  lstrcat,addr szRegNum,addr szTmp3
      mov  BYTE ptr [szRegNum+11],2dh
      invoke  StrMidBuffer,addr szTmp1,0Bh,1,addr szTmp3
      invoke  lstrcat,addr szRegNum,addr szTmp3
      invoke  lstrcat,addr szRegNum,addr szStrCon
      invoke  SetDlgItemText,hDlg,IDC_REG,addr szRegNum
    .endif
  .endif
  popad
  ret
GetRegKey  endp

【版权声明】   本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢! 

---------------------------------------------------------------------------------------------------------