小聪软件--餐饮娱乐管理的注册分析
【破解作者】 jsliyangsj
【作者邮箱】 sjcrack@yahoo.com.cn
【使用工具】 peid OllyDbg1.10
【破解平台】 Winxp
【软件名称】 餐饮娱乐管理
【软件地址】 http://www.jxcchina.com/
有壳ASPack 2.11 -> Alexey Solodovnikov,脱壳后,查找字符,有关键字符串,来到关键点:
004E0FC1    .  FF>push dword ptr ss:[ebp-10]                       ;  得到用户名
004E0FC4    .  8D>lea ecx,dword ptr ss:[ebp-30]
004E0FC7    .  BA>mov edx,3
004E0FCC    .  8B>mov eax,dword ptr ss:[ebp-8]
004E0FCF    .  E8>call unpacked.004DB2FC
004E0FD4    .  FF>push dword ptr ss:[ebp-30]
004E0FD7    .  FF>push dword ptr ss:[ebp-28]
004E0FDA    .  8D>lea eax,dword ptr ss:[ebp-2C]
004E0FDD    .  BA>mov edx,3
004E0FE2    .  E8>call unpacked.004041E0
004E0FE7    .  8B>mov eax,dword ptr ss:[ebp-2C]                    ; |
004E0FEA    .  8D>lea ecx,dword ptr ss:[ebp-4]                     ; |
004E0FED    .  8B>mov edx,dword ptr ss:[ebp-14]                    ; |得到注册码
004E0FF0    .  E8>call unpacked.004DAD24                           ; \对用户名,输入码进行计算判断的地方
004E0FF5    .  85>test eax,eax
004E0FF7    .  75>jnz short unpacked.004E1004                      ;  用用户名计算出注册码与输入码进行比较如果不相等要读狗
004E0FF9    .  8D>lea edx,dword ptr ss:[ebp-8]
004E0FFC    .  8D>lea eax,dword ptr ss:[ebp-C]
004E0FFF    .  E8>call unpacked.004E0DC4                           ;  读狗的CALL
004E1004    >  8A>mov bl,byte ptr ss:[ebp-C]                       ;  用输入码计算出标志位
004E1007    .  84>test bl,bl
004E1009    .  75>jnz short unpacked.004E1089                      ;  标志位是否为0
004E100B    .  C7>mov dword ptr ds:[5E7F58],0A
004E1015    .  B8>mov eax,unpacked.005E7F5C
004E101A    .  B9>mov ecx,unpacked.004E216C
004E101F    .  8B>mov edx,dword ptr ds:[5E7F98]
004E1025    .  E8>call unpacked.0040416C
004E102A    .  C7>mov dword ptr ds:[5E7F50],3C
004E1034    .  C7>mov dword ptr ds:[5E7F60],1
004E103E    .  BE>mov esi,unpacked.004E2174
004E1043    .  BF>mov edi,unpacked.005E7F64                        ;  ASCII 07,"sjcrack"
004E1048    .  B9>mov ecx,4
004E104D    .  F3>rep movs dword ptr es:[edi],dword ptr ds:[esi]
004E104F    .  A4 movs byte ptr es:[edi],byte ptr ds:[esi]
004E1050    .  B8>mov eax,unpacked.005E7F84
004E1055    .  BA>mov edx,unpacked.004E2190                        ;  标志位为0  注册失败
004E105A    .  E8>call unpacked.00403EF4
004E105F    .  B8>mov eax,unpacked.005E7F88
004E1064    .  E8>call unpacked.00403EA0
004E1069    .  B8>mov eax,unpacked.005E7F8C
004E106E    .  E8>call unpacked.00403EA0
004E1073    .  B8>mov eax,unpacked.005E7F90
004E1078    .  E8>call unpacked.00403EA0
004E107D    .  C6>mov byte ptr ds:[5E7F4C],0
004E1084    .  E9>jmp unpacked.004E1FC3
………………………………………………………………………………………………………………………………
后面是标志位(用用户名计算出来的标志位,看符合什么版本)
………………………………………………………………………………………………………………………………
004E1089   > \80>cmp bl,0B                                       ;  标志位是否等于0B

004E10EF   .  BA>mov edx,unpacked.004E21B8                       ;  单机普及版注册成功

004E112C   >  80>cmp bl,0C                                       ;  标志位是否等于0C
004E112F   .  0F>jnz unpacked.004E11CF

004E1192   .  BA>mov edx,unpacked.004E21EC                       ;  单机标志版注册成功

004E11CF   >  80>cmp bl,0D
004E11D2   .  0F>jnz unpacked.004E1272

004E1235   .  BA>mov edx,unpacked.004E2220                       ;  单机增强版注册成功

004E1272   >  80>cmp bl,0E
004E1275   .  0F>jnz unpacked.004E1315

004E12D8   .  BA>mov edx,unpacked.004E2250                       ;  试用版注册成功

004E1315   >  80>cmp bl,0F

004E137B   .  BA>mov edx,unpacked.004E227C                       ;  标准版注册成功

004E13B8   >  80>cmp bl,10
004E13BB   .  0F>jnz unpacked.004E145B

004E141E   .  BA>mov edx,unpacked.004E22A8                       ;  单机版注册成功

004E145B   >  80>cmp bl,11
004E145E   .  0F>jnz unpacked.004E14FE
0
004E14C1   .  BA>mov edx,unpacked.004E21B8                       ;  单机普及版注册成功

004E14FE   >  80>cmp bl,12
004E1501   .  0F>jnz unpacked.004E15A1

004E1564   .  BA>mov edx,unpacked.004E21EC                       ;  单机标准版注册成功

004E15A1   >  80>cmp bl,13
004E15A4   .  0F>jnz unpacked.004E1644

004E1607   .  BA>mov edx,unpacked.004E2220                       ;  单机增强版注册成功

004E1644   >  80>cmp bl,15
004E1647   .  0F>jnz unpacked.004E16E5

004E16A8   .  BA>mov edx,unpacked.004E22D8                       ;  网络试用版注册成功

004E16E5   >  80>cmp bl,17
004E16E8   .  0F>jnz unpacked.004E1786

004E1749   .  BA>mov edx,unpacked.004E2308                       ;  网络版注册成功

004E1786   >  80>cmp bl,18
004E1789   .  0F>jnz unpacked.004E1827

004E17EA   .  BA>mov edx,unpacked.004E22D8                       ;  网络试用版注册成功

004E1827   >  80>cmp bl,1A
004E182A   .  0F>jnz unpacked.004E18C8

004E188B   .  BA>mov edx,unpacked.004E2308                       ;  网络版注册成功

004E18C8   >  80>cmp bl,1B
004E18CB   .  0F>jnz unpacked.004E1969

004E192C   .  BA>mov edx,unpacked.004E22D8                       ;  网络试用版注册成功

004E1969   >  80>cmp bl,1D
004E196C   .  0F>jnz unpacked.004E1A0A

004E19CD   .  BA>mov edx,unpacked.004E2308                       ;  网络版注册成功

004E1A0A   >  80>cmp bl,1E
004E1A0D   .  0F>jnz unpacked.004E1AAD

004E1A70   .  BA>mov edx,unpacked.004E2338                       ;  网络演示版注册成功

004E1AAD   >  80>cmp bl,1F
004E1AB0   .  0F>jnz unpacked.004E1B4E

004E1B11   .  BA>mov edx,unpacked.004E236C                       ;  KTV试用版注册成功

004E1B4E   >  80>cmp bl,21
004E1B51   .  0F>jnz unpacked.004E1BEF

004E1BB2   .  BA>mov edx,unpacked.004E2398                       ;  KTV版注册成功

004E1BEF   >  80>cmp bl,22
004E1BF2   .  0F>jnz unpacked.004E1C90

004E1C53   .  BA>mov edx,unpacked.004E236C                       ;  KTV试用版注册成功

004E1C90   >  80>cmp bl,24
004E1C93   .  0F>jnz unpacked.004E1D31

004E1CF4   .  BA>mov edx,unpacked.004E2398                       ;  KTV版注册成功

004E1D31   >  80>cmp bl,25                                       ;  标志位25
004E1D34   .  0F>jnz unpacked.004E1DD2

004E1D95   .  BA>mov edx,unpacked.004E236C                       ;  KTV试用版注册成功

004E1DD2   >  80>cmp bl,27                                       ;  标志位27
004E1DD5   .  0F>jnz unpacked.004E1E73

004E1E36   .  BA>mov edx,unpacked.004E2398                       ;  KTV版注册成功

004E1E73   >  80>cmp bl,64                                       ;  标志位64
004E1E76   .  0F>jbe unpacked.004E1F2E
004E1E7C   .  C7>mov dword ptr ds:[5E7F58],3E7                   ;  标志位大于64
004E1E86   .  B8>mov eax,unpacked.005E7F5C
004E1E8B   .  B9>mov ecx,unpacked.004E22F8                       ;  网络版
004E1E90   .  8B>mov edx,dword ptr ds:[5E7F98]
004E1E96   .  E8>call unpacked.0040416C
004E1E9B   .  33>xor eax,eax
004E1E9D   .  8A>mov al,bl
004E1E9F   .  83>sub eax,64
004E1EA2   .  A3>mov dword ptr ds:[5E7F60],eax
004E1EA7   .  C7>mov dword ptr ds:[5E7F50],3C
004E1EB1   .  8D>lea eax,dword ptr ss:[ebp-130]
004E1EB7   .  8B>mov edx,dword ptr ss:[ebp-10]
004E1EBA   .  B9>mov ecx,0FF
004E1EBF   .  E8>call unpacked.004040FC
004E1EC4   .  8D>lea edx,dword ptr ss:[ebp-130]
004E1ECA   .  B8>mov eax,unpacked.005E7F64                       ;  ASCII 07,"sjcrack"
004E1ECF   .  B1>mov cl,1E
004E1ED1   .  E8>call unpacked.00402C70
004E1ED6   .  8D>lea edx,dword ptr ss:[ebp-134]
004E1EDC   .  A1>mov eax,dword ptr ds:[5E7F60]
004E1EE1   .  E8>call unpacked.00409B98
004E1EE6   .  8B>mov ecx,dword ptr ss:[ebp-134]
004E1EEC   .  B8>mov eax,unpacked.005E7F84
004E1EF1   .  BA>mov edx,unpacked.004E23B0                       ;  网络版注册成功 许可证数为
004E1EF6   .  E8>call unpacked.0040416C
004E1EFB   .  B8>mov eax,unpacked.005E7F88
004E1F00   .  8B>mov edx,dword ptr ss:[ebp-18]
004E1F03   .  E8>call unpacked.00403EF4
004E1F08   .  B8>mov eax,unpacked.005E7F8C
004E1F0D   .  8B>mov edx,dword ptr ss:[ebp-1C]
004E1F10   .  E8>call unpacked.00403EF4
004E1F15   .  B8>mov eax,unpacked.005E7F90
004E1F1A   .  8B>mov edx,dword ptr ss:[ebp-20]
004E1F1D   .  E8>call unpacked.00403EF4
004E1F22   .  C6>mov byte ptr ds:[5E7F4C],1
004E1F29   .  E9>jmp unpacked.004E1FC3
004E1F2E   >  C7>mov dword ptr ds:[5E7F58],3E7                   ;  标志位小于64
004E1F38   .  B8>mov eax,unpacked.005E7F5C
004E1F3D   .  B9>mov ecx,unpacked.004E21D8                       ;  单机标准版
004E1F42   .  8B>mov edx,dword ptr ds:[5E7F98]
004E1F48   .  E8>call unpacked.0040416C
004E1F4D   .  C7>mov dword ptr ds:[5E7F50],3C
004E1F57   .  C7>mov dword ptr ds:[5E7F60],1
004E1F61   .  8D>lea eax,dword ptr ss:[ebp-130]
004E1F67   .  8B>mov edx,dword ptr ss:[ebp-10]
004E1F6A   .  B9>mov ecx,0FF
004E1F6F   .  E8>call unpacked.004040FC
004E1F74   .  8D>lea edx,dword ptr ss:[ebp-130]
004E1F7A   .  B8>mov eax,unpacked.005E7F64                       ;  ASCII 07,"sjcrack"
004E1F7F   .  B1>mov cl,1E
004E1F81   .  E8>call unpacked.00402C70
004E1F86   .  B8>mov eax,unpacked.005E7F84
004E1F8B   .  BA>mov edx,unpacked.004E21EC                       ;  单机标准版注册成功
004E1F90   .  E8>call unpacked.00403EF4
004E1F95   .  B8>mov eax,unpacked.005E7F88
004E1F9A   .  8B>mov edx,dword ptr ss:[ebp-18]
……………………………………………………………………………………………………………………………
进入关键 :004E0FF0    .  E8>call unpacked.004DAD24                  
…………………………………………………………………………………………………………………………
004DAD24   /$  55 push ebp
004DAD25   |.  8B>mov ebp,esp
004DAD27   |.  83>add esp,-10
004DAD2A   |.  53 push ebx
004DAD2B   |.  56 push esi
004DAD2C   |.  57 push edi
004DAD2D   |.  8B>mov ebx,ecx
004DAD2F   |.  8B>mov edi,eax
004DAD31   |.  8B>mov esi,dword ptr ss:[ebp+8]
004DAD34   |.  8D>lea eax,dword ptr ss:[ebp-10]
004DAD37   |.  E8>call unpacked.004DAAD0                  ;  注册码符合的条件
004DAD3C   |.  85>test eax,eax                            ;  正常出来就是8
004DAD3E   |.  75>jnz short unpacked.004DAD44
004DAD40   |.  33>xor eax,eax
004DAD42   |.  EB>jmp short unpacked.004DAD8D
004DAD44   |>  8B>mov eax,esi
004DAD46   |.  8D>lea edx,dword ptr ss:[ebp-10]           ;  得到上面把字符串形式的输入码,变成一个一个的16进制数据得到地址
004DAD49   |.  E8>call unpacked.004DAA54                  ;  注册码处理的地方!!
004DAD4E   |.  89>mov dword ptr ds:[ebx],eax
004DAD50   |.  8B>mov eax,dword ptr ds:[esi]              ;  取出标志值
004DAD52   |.  50 push eax
004DAD53   |.  8B>mov ecx,dword ptr ds:[ebx]
004DAD55   |.  8D>lea eax,dword ptr ss:[ebp-8]
004DAD58   |.  8B>mov edx,edi                             ;  用户名的地址
004DAD5A   |.  E8>call unpacked.004DA8A4                  ;  处理用户名的地方!
004DAD5F   |.  85>test eax,eax                            ;  固定为8
004DAD61   |.  75>jnz short unpacked.004DAD67
004DAD63   |.  33>xor eax,eax
004DAD65   |.  EB>jmp short unpacked.004DAD8D
004DAD67   |>  8B>mov ecx,dword ptr ds:[5E36F0]           ;  固定为8
004DAD6D   |.  49 dec ecx
004DAD6E   |.  85>test ecx,ecx
004DAD70   |.  7C>jl short unpacked.004DAD88
004DAD72   |.  41 inc ecx
004DAD73   |.  8D>lea eax,dword ptr ss:[ebp-8]
004DAD76   |.  8D>lea edx,dword ptr ss:[ebp-10]
004DAD79   |>  8A>/mov bl,byte ptr ds:[eax]               ;  输入码比较的地方!!!
004DAD7B   |.  3A>|cmp bl,byte ptr ds:[edx]
004DAD7D   |.  74>|je short unpacked.004DAD83
004DAD7F   |.  33>|xor eax,eax
004DAD81   |.  EB>|jmp short unpacked.004DAD8D
004DAD83   |>  42 |inc edx
004DAD84   |.  40 |inc eax
004DAD85   |.  49 |dec ecx
004DAD86   |.^ 75>\jnz short unpacked.004DAD79
004DAD88   |>  B8>mov eax,1
004DAD8D   |>  5F pop edi
004DAD8E   |.  5E pop esi
004DAD8F   |.  5B pop ebx
004DAD90   |.  8B>mov esp,ebp
004DAD92   |.  5D pop ebp
004DAD93   \.  C2>retn 4
…………………………………………………………………………………………………………………………
进入004DAD49   |.  E8>call unpacked.004DAA54                  ;  注册码处理的地方!!用来计算标志位的!
…………………………………………………………………………………………………………………………
004DAA54   /$  53 push ebx
004DAA55   |.  56 push esi
004DAA56   |.  57 push edi
004DAA57   |.  83>add esp,-10
004DAA5A   |.  8B>mov esi,edx
004DAA5C   |.  8D>lea edi,dword ptr ss:[esp]
004DAA5F   |.  A5 movs dword ptr es:[edi],dword ptr ds:[e>
004DAA60   |.  A5 movs dword ptr es:[edi],dword ptr ds:[e>;  拷贝注册码
004DAA61   |.  8B>mov esi,eax
004DAA63   |.  A1>mov eax,dword ptr ds:[5E36F0]           ;  数据固定脂8
004DAA68   |.  48 dec eax
004DAA69   |.  85>test eax,eax
004DAA6B   |.  7C>jl short unpacked.004DAA7D
004DAA6D   |.  40 inc eax
004DAA6E   |.  8B>mov edx,esp
004DAA70   |.  8D>lea ecx,dword ptr ss:[esp+8]
004DAA74   |>  8A>/mov bl,byte ptr ds:[edx]
004DAA76   |.  88>|mov byte ptr ds:[ecx],bl
004DAA78   |.  41 |inc ecx
004DAA79   |.  42 |inc edx
004DAA7A   |.  48 |dec eax
004DAA7B   |.^ 75>\jnz short unpacked.004DAA74            ;  这段是复制一个注册码
004DAA7D   |>  B9>mov ecx,unpacked.005E6A7C
004DAA82   |.  BA>mov edx,unpacked.005E6A34
004DAA87   |.  A1>mov eax,dword ptr ds:[5E36EC]           ;  出现一个字符串,用来参数一个数据密码表!!
004DAA8C   |.  E8>call unpacked.004DA3EC                  ;  用固定字符串计算数据密码表的地方
004DAA91   |.  68>push unpacked.005E6A7C                  ; /Arg1 = 005E6A7C
004DAA96   |.  8D>lea edx,dword ptr ss:[esp+C]            ; |
004DAA9A   |.  8D>lea eax,dword ptr ss:[esp+C]            ; |前8位输入码
004DAA9E   |.  B9>mov ecx,unpacked.005E6A34               ; |得到处理后的密码表数据
004DAAA3   |.  E8>call unpacked.004DA7AC                  ; \真正对注册码进行处理的地方!!
004DAAA8   |.  A1>mov eax,dword ptr ds:[5E36E4]           ;  固定为3
004DAAAD   |.  48 dec eax
004DAAAE   |.  85>test eax,eax
004DAAB0   |.  7C>jl short unpacked.004DAAC2
004DAAB2   |.  40 inc eax
004DAAB3   |.  8D>lea edx,dword ptr ss:[esp+8]
004DAAB7   |.  8B>mov ecx,esi
004DAAB9   |>  8A>/mov bl,byte ptr ds:[edx]
004DAABB   |.  88>|mov byte ptr ds:[ecx],bl               ;  标志位赋值
004DAABD   |.  41 |inc ecx
004DAABE   |.  42 |inc edx
004DAABF   |.  48 |dec eax
004DAAC0   |.^ 75>\jnz short unpacked.004DAAB9            ;  一共3次赋值,第一次是标志位
004DAAC2   |>  A1>mov eax,dword ptr ds:[5E36E4]
004DAAC7   |.  83>add esp,10
004DAACA   |.  5F pop edi
004DAACB   |.  5E pop esi
004DAACC   |.  5B pop ebx
004DAACD   \.  C3 retn
………………………………………………………………………………………………………………………………
处理密码表的地方(作了部分注)对固定的密码表再次作变化,动态生成的密码表作为下面计算的参数
………………………………………………………………………………………………………………………………
004DA44C   /$  55 push ebp                                ;  处理密码表的地方!!
004DA44D   |.  8B>mov ebp,esp
004DA44F   |.  83>add esp,-1C
004DA452   |.  53 push ebx
004DA453   |.  56 push esi
004DA454   |.  57 push edi
004DA455   |.  89>mov dword ptr ss:[ebp-C],ecx
004DA458   |.  89>mov dword ptr ss:[ebp-8],edx
004DA45B   |.  89>mov dword ptr ss:[ebp-4],eax
004DA45E   |.  BA>mov edx,unpacked.005E2354
004DA463   |.  C6>mov byte ptr ss:[ebp-D],1
004DA467   |.  8B>mov esi,dword ptr ss:[ebp-C]
004DA46A   |>  33>/xor eax,eax
004DA46C   |.  89>|mov dword ptr ds:[esi],eax
004DA46E   |.  C6>|mov byte ptr ss:[ebp-E],0
004DA472   |>  33>|/xor eax,eax
004DA474   |.  8A>||mov al,byte ptr ss:[ebp-D]
004DA477   |.  48 ||dec eax
004DA478   |.  C1>||shl eax,2
004DA47B   |.  33>||xor ecx,ecx
004DA47D   |.  8A>||mov cl,byte ptr ss:[ebp-E]            ;  得到位数
004DA480   |.  03>||add eax,ecx
004DA482   |.  0F>||movzx eax,byte ptr ds:[edx+eax]       ;  取值
004DA486   |.  8B>||mov ecx,dword ptr ds:[esi]
004DA488   |.  C1>||shl ecx,8
004DA48B   |.  03>||add eax,ecx
004DA48D   |.  89>||mov dword ptr ds:[esi],eax            ;  存储
004DA48F   |.  FE>||inc byte ptr ss:[ebp-E]               ;  位数加1
004DA492   |.  80>||cmp byte ptr ss:[ebp-E],4             ;  一共4次
004DA496   |.^ 75>|\jnz short unpacked.004DA472
004DA498   |.  FE>|inc byte ptr ss:[ebp-D]
004DA49B   |.  83>|add esi,4
004DA49E   |.  80>|cmp byte ptr ss:[ebp-D],13
004DA4A2   |.^ 75>\jnz short unpacked.004DA46A            ;  实际上就是得到固定密码表EDX中的18组数据(每组反着存放)
004DA4A4   |.  BF>mov edi,48
004DA4A9   |.  C6>mov byte ptr ss:[ebp-D],4               ;  计数器
004DA4AD   |.  8B>mov eax,dword ptr ss:[ebp+8]
004DA4B0   |.  89>mov dword ptr ss:[ebp-1C],eax           ;  得到刚才得到数据的最后一组下一个地址
004DA4B3   |>  C6>/mov byte ptr ss:[ebp-E],0              ;  计数器
004DA4B7   |.  8B>|mov eax,dword ptr ss:[ebp-1C]          ;  得到刚才得到数据的最后一组下一个地址
004DA4BA   |.  8B>|mov esi,eax
004DA4BC   |>  33>|/xor eax,eax
004DA4BE   |.  89>||mov dword ptr ds:[esi],eax
004DA4C0   |.  33>||xor ecx,ecx
004DA4C2   |>  33>||/xor eax,eax
004DA4C4   |.  8A>|||mov al,byte ptr ss:[ebp-E]           ;  每组数据的位数
004DA4C7   |.  C1>|||shl eax,2
004DA4CA   |.  03>|||add eax,edi
004DA4CC   |.  33>|||xor ebx,ebx
004DA4CE   |.  8A>|||mov bl,cl
004DA4D0   |.  03>|||add eax,ebx
004DA4D2   |.  0F>|||movzx eax,byte ptr ds:[edx+eax]      ;  又从固定密码表中取值(接着上次没有取完的)
004DA4D6   |.  8B>|||mov ebx,dword ptr ds:[esi]
004DA4D8   |.  C1>|||shl ebx,8
004DA4DB   |.  03>|||add eax,ebx
004DA4DD   |.  89>|||mov dword ptr ds:[esi],eax           ;  存储   也接着上面没有存放完的地方继续存储
004DA4DF   |.  41 |||inc ecx                              ;  计数器
004DA4E0   |.  80>|||cmp cl,4
004DA4E3   |.^ 75>||\jnz short unpacked.004DA4C2          ;  这一小段完成一组数据的拷贝!!
004DA4E5   |.  FE>||inc byte ptr ss:[ebp-E]
004DA4E8   |.  83>||add esi,4
004DA4EB   |.  80>||cmp byte ptr ss:[ebp-E],0
004DA4EF   |.^ 75>|\jnz short unpacked.004DA4BC           ;  将要复制过来10进制的256组数据过来(接着上面一次)反着存储
004DA4F1   |.  81>|add edi,400                            ;  接着后存储数据
004DA4F7   |.  81>|add dword ptr ss:[ebp-1C],400          ;  准备接着储存的地址!!
004DA4FE   |.  FE>|dec byte ptr ss:[ebp-D]                ;  一共4次256组数据被拷贝过来!!!
004DA501   |.^ 75>\jnz short unpacked.004DA4B3            ;  上面一共拷贝了1042组数据!!!反着放的
004DA503   |.  C6>mov byte ptr ss:[ebp-E],1
004DA507   |.  C6>mov byte ptr ss:[ebp-D],12
004DA50B   |.  8B>mov eax,dword ptr ss:[ebp-C]            ;  拷贝密码表之后的头地址!尾地址放在EBP-1C中
004DA50E   |>  33>/xor esi,esi
004DA510   |.  B1>|mov cl,4
004DA512   |>  33>|/xor edx,edx
004DA514   |.  8A>||mov dl,byte ptr ss:[ebp-E]            ;  计数器
004DA517   |.  8B>||mov ebx,dword ptr ss:[ebp-4]          ;  得到固定字符串!
004DA51A   |.  0F>||movzx edx,byte ptr ds:[ebx+edx-1]     ;  得到每一位字符的ASCII
004DA51F   |.  C1>||shl esi,8
004DA522   |.  0B>||or edx,esi
004DA524   |.  8B>||mov esi,edx
004DA526   |.  FE>||inc byte ptr ss:[ebp-E]               ;  位数加1
004DA529   |.  33>||xor edx,edx
004DA52B   |.  8A>||mov dl,byte ptr ss:[ebp-E]
004DA52E   |.  3B>||cmp edx,dword ptr ss:[ebp-8]          ;  比较字符串的位数1B
004DA531   |.  7E>||jle short unpacked.004DA537
004DA533   |.  C6>||mov byte ptr ss:[ebp-E],1             ;  当位数超过1B时将重新从第1位开始取值
004DA537   |>  FE>||dec cl                                ;  取每4位字符的ASCII作为一组数据
004DA539   |.^ 75>|\jnz short unpacked.004DA512
004DA53B   |.  31>|xor dword ptr ds:[eax],esi             ;  用取每4位字符的ASCII作为一组数据与拷贝过来的密码表依次异或
004DA53D   |.  83>|add eax,4                              ;  下一组拷贝过来的密码表数据
004DA540   |.  FE>|dec byte ptr ss:[ebp-D]                ;  一共处理18组数据
004DA543   |.^ 75>\jnz short unpacked.004DA50E
004DA545   |.  33>xor eax,eax
004DA547   |.  89>mov dword ptr ss:[ebp-14],eax
004DA54A   |.  33>xor eax,eax
004DA54C   |.  89>mov dword ptr ss:[ebp-18],eax
004DA54F   |.  C6>mov byte ptr ss:[ebp-D],1               ;  计数器
004DA553   |>  8B>/mov eax,dword ptr ss:[ebp+8]           ;  得到第19位拷贝地址(准备处理)
004DA556   |.  50 |push eax                               ; /Arg1
004DA557   |.  8B>|mov ecx,dword ptr ss:[ebp-C]           ; |拷贝后的头数据地址
004DA55A   |.  8D>|lea edx,dword ptr ss:[ebp-18]          ; |
004DA55D   |.  8D>|lea eax,dword ptr ss:[ebp-14]          ; |
004DA560   |.  E8>|call unpacked.004DA638                 ; \处理什么??
004DA565   |.  33>|xor eax,eax
004DA567   |.  8A>|mov al,byte ptr ss:[ebp-D]
004DA56A   |.  03>|add eax,eax
004DA56C   |.  8B>|mov edx,dword ptr ss:[ebp-C]
004DA56F   |.  8B>|mov ecx,dword ptr ss:[ebp-14]
004DA572   |.  89>|mov dword ptr ds:[edx+eax*4-8],ecx
004DA576   |.  8B>|mov edx,dword ptr ss:[ebp-C]
004DA579   |.  8B>|mov ecx,dword ptr ss:[ebp-18]
004DA57C   |.  89>|mov dword ptr ds:[edx+eax*4-4],ecx
004DA580   |.  FE>|inc byte ptr ss:[ebp-D]
004DA583   |.  80>|cmp byte ptr ss:[ebp-D],0A
004DA587   |.^ 75>\jnz short unpacked.004DA553
004DA589   |.  C6>mov byte ptr ss:[ebp-E],4
004DA58D   |.  8B>mov ebx,dword ptr ss:[ebp+8]
004DA590   |.  81>add ebx,400
004DA596   |>  C6>/mov byte ptr ss:[ebp-D],0
004DA59A   |>  8B>|mov eax,dword ptr ss:[ebp+8]
004DA59D   |.  50 |push eax                               ; /Arg1
004DA59E   |.  8B>|mov ecx,dword ptr ss:[ebp-C]           ; |
004DA5A1   |.  8D>|lea edx,dword ptr ss:[ebp-18]          ; |
004DA5A4   |.  8D>|lea eax,dword ptr ss:[ebp-14]          ; |
004DA5A7   |.  E8>|call unpacked.004DA638                 ; \unpacked.004DA638
004DA5AC   |.  33>|xor eax,eax
004DA5AE   |.  8A>|mov al,byte ptr ss:[ebp-D]
004DA5B1   |.  03>|add eax,eax
004DA5B3   |.  8B>|mov edx,dword ptr ss:[ebp-14]
004DA5B6   |.  89>|mov dword ptr ds:[ebx+eax*4-400],edx
004DA5BD   |.  8B>|mov edx,dword ptr ss:[ebp-18]
004DA5C0   |.  89>|mov dword ptr ds:[ebx+eax*4-3FC],edx
004DA5C7   |.  FE>|inc byte ptr ss:[ebp-D]
004DA5CA   |.  80>|cmp byte ptr ss:[ebp-D],80
004DA5CE   |.^ 75>|jnz short unpacked.004DA59A
004DA5D0   |.  81>|add ebx,400
004DA5D6   |.  FE>|dec byte ptr ss:[ebp-E]
004DA5D9   |.^ 75>\jnz short unpacked.004DA596
004DA5DB   |.  5F pop edi
004DA5DC   |.  5E pop esi
004DA5DD   |.  5B pop ebx
004DA5DE   |.  8B>mov esp,ebp
004DA5E0   |.  5D pop ebp
004DA5E1   \.  C2>retn 4

…………………………………………………………………………………………………………………………
进入004DAAA3   |.  E8>call unpacked.004DA7AC                  ; \真正对注册码进行处理的地方!!
…………………………………………………………………………………………………………………………
004DA7AC   /$  55 push ebp
004DA7AD   |.  8B>mov ebp,esp
004DA7AF   |.  81>add esp,-0FFC
004DA7B5   |.  50 push eax
004DA7B6   |.  83>add esp,-50
004DA7B9   |.  53 push ebx
004DA7BA   |.  56 push esi
004DA7BB   |.  57 push edi
004DA7BC   |.  8B>mov esi,dword ptr ss:[ebp+8]
004DA7BF   |.  8D>lea edi,dword ptr ss:[ebp-1050]
004DA7C5   |.  51 push ecx                                ;  密码表的头地址
004DA7C6   |.  B9>mov ecx,400                             ;  准备得到1024组密码表
004DA7CB   |.  F3>rep movs dword ptr es:[edi],dword ptr d>;  这里没有拷贝最前面的18个数据
004DA7CD   |.  59 pop ecx
004DA7CE   |.  8B>mov esi,ecx                             ;  准备拷贝头18个密码表数据将放在刚才拷贝的最后面
004DA7D0   |.  8D>lea edi,dword ptr ss:[ebp-50]
004DA7D3   |.  B9>mov ecx,12                              ;  18组数据
004DA7D8   |.  F3>rep movs dword ptr es:[edi],dword ptr d>;  拷贝完毕
004DA7DA   |.  8B>mov ebx,eax
004DA7DC   |.  8B>mov eax,edx
004DA7DE   |.  83>add edx,4
004DA7E1   |.  8B>mov eax,dword ptr ds:[eax]              ;  得到前8位注册码(反着放的!)
004DA7E3   |.  89>mov dword ptr ss:[ebp-4],eax            ;  存储
004DA7E6   |.  8B>mov eax,dword ptr ds:[edx]              ;  得到后8位注册码(反着放的)
004DA7E8   |.  89>mov dword ptr ss:[ebp-8],eax            ;  存储
004DA7EB   |.  8D>lea eax,dword ptr ss:[ebp-1050]         ;  密码表的第1组数据
004DA7F1   |.  50 push eax                                ; /Arg1
004DA7F2   |.  8D>lea edx,dword ptr ss:[ebp-8]            ; |输入码的后8(反)
004DA7F5   |.  8D>lea eax,dword ptr ss:[ebp-4]            ; |输入码的前8(反)
004DA7F8   |.  8D>lea ecx,dword ptr ss:[ebp-50]           ; |最后18位的头地址
004DA7FB   |.  E8>call unpacked.004DA6BC                  ; \注册码处理的关键地方!!
004DA800   |.  8B>mov eax,ebx
004DA802   |.  8D>lea edx,dword ptr ds:[ebx+4]
004DA805   |.  8B>mov ecx,dword ptr ss:[ebp-4]
004DA808   |.  89>mov dword ptr ds:[eax],ecx              ;  将计算出来的结果赋值
004DA80A   |.  8B>mov eax,dword ptr ss:[ebp-8]
004DA80D   |.  89>mov dword ptr ds:[edx],eax              ;  将计算出来的结果赋值
004DA80F   |.  5F pop edi
004DA810   |.  5E pop esi
004DA811   |.  5B pop ebx
004DA812   |.  8B>mov esp,ebp
004DA814   |.  5D pop ebp
004DA815   \.  C2>retn 4

…………………………………………………………………………………………………………………………
进入004DA7FB   |.  E8>call unpacked.004DA6BC                  ; \注册码处理的关键地方
这部分,有三处是一样的,只是分成两组数据(共16位,分前8,后8,前8分别拆成2位2位,进行取值
运算来改变后8,然后交换后8改变前8
…………………………………………………………………………………………………………………………
004DA6BC   /$  55 push ebp                                ;  对注册码的处理的地方!!!
004DA6BD   |.  8B>mov ebp,esp
004DA6BF   |.  81>add esp,-0FFC
004DA6C5   |.  50 push eax
004DA6C6   |.  83>add esp,-54
004DA6C9   |.  53 push ebx
004DA6CA   |.  56 push esi
004DA6CB   |.  57 push edi
004DA6CC   |.  8B>mov esi,dword ptr ss:[ebp+8]
004DA6CF   |.  8D>lea edi,dword ptr ss:[ebp-1054]
004DA6D5   |.  51 push ecx
004DA6D6   |.  B9>mov ecx,400
004DA6DB   |.  F3>rep movs dword ptr es:[edi],dword ptr d>;  拷贝1024组密码表数据不包括前18组
004DA6DD   |.  59 pop ecx
004DA6DE   |.  8B>mov esi,ecx
004DA6E0   |.  8D>lea edi,dword ptr ss:[ebp-54]
004DA6E3   |.  B9>mov ecx,12
004DA6E8   |.  F3>rep movs dword ptr es:[edi],dword ptr d>;  拷贝前18位密码表数据放在上面密码表的后面
004DA6EA   |.  89>mov dword ptr ss:[ebp-8],edx
004DA6ED   |.  89>mov dword ptr ss:[ebp-4],eax
004DA6F0   |.  8B>mov ebx,dword ptr ss:[ebp-4]
004DA6F3   |.  8B>mov ebx,dword ptr ds:[ebx]              ;  前8位注册码(反)
004DA6F5   |.  8B>mov edi,dword ptr ss:[ebp-8]
004DA6F8   |.  8B>mov edi,dword ptr ds:[edi]              ;  后8位注册码(反)
004DA6FA   |.  C6>mov byte ptr ss:[ebp-9],0F0
004DA6FE   |.  8D>lea esi,dword ptr ss:[ebp-10]
004DA701   |>  33>/xor ebx,dword ptr ds:[esi]             ;  取最后的密码表数据60CBF06A与前8位异或
004DA703   |.  8D>|lea edx,dword ptr ss:[ebp-1054]        ;  取密码表
004DA709   |.  8B>|mov eax,ebx
004DA70B   |.  E8>|call unpacked.004DA5E4                 ;  把异或后的值在密码表中取值运算结果EAX中
004DA710   |.  33>|xor edi,eax                            ;  运算的结果与注册码的后8位(反着放)异或
004DA712   |.  8B>|mov eax,ebx                            ;  又取得前8位异或得到的值
004DA714   |.  8B>|mov ebx,edi                            ;  刚才的结果给了EBX
004DA716   |.  8B>|mov edi,eax
004DA718   |.  83>|sub esi,4                              ;  取上一个值用于异或的值
004DA71B   |.  FE>|inc byte ptr ss:[ebp-9]                ;  一共循环16次
004DA71E   |.^ 75>\jnz short unpacked.004DA701
004DA720   |.  8B>mov eax,ebx
004DA722   |.  8B>mov ebx,edi
004DA724   |.  8B>mov edi,eax
004DA726   |.  33>xor edi,dword ptr ss:[ebp-50]           ;  与密码表中的第2组数据D9DB2B90异或得到最终结果
004DA729   |.  33>xor ebx,dword ptr ss:[ebp-54]           ;  与密码表中的第1组数据6A113CAB异或得到标志位结果
004DA72C   |.  8B>mov eax,dword ptr ss:[ebp-4]
004DA72F   |.  89>mov dword ptr ds:[eax],ebx              ;  存储了
004DA731   |.  8B>mov eax,dword ptr ss:[ebp-8]
004DA734   |.  89>mov dword ptr ds:[eax],edi              ;  存储
004DA736   |.  5F pop edi
004DA737   |.  5E pop esi
004DA738   |.  5B pop ebx
004DA739   |.  8B>mov esp,ebp
004DA73B   |.  5D pop ebp
004DA73C   \.  C2>retn 4
…………………………………………………………………………………………………………………………
进入   取值运算   004DA70B   |.  E8>|call unpacked.004DA5E4  
…………………………………………………………………………………………………………………………
004DA604   |.  8A>mov dl,byte ptr ds:[eax+3]              ;  取刚才异或的的前2位
004DA607   |.  8B>mov edx,dword ptr ss:[esp+edx*4+4]      ;  取值
004DA60B   |.  33>xor ecx,ecx
004DA60D   |.  8A>mov cl,byte ptr ds:[eax+2]              ;  取刚才异或的的3,4位
004DA610   |.  03>add edx,dword ptr ss:[esp+ecx*4+404]    ;  取值加上原来的值
004DA617   |.  33>xor ecx,ecx
004DA619   |.  8A>mov cl,byte ptr ds:[eax+1]              ;  取刚才异或的的5,6位
004DA61C   |.  33>xor edx,dword ptr ss:[esp+ecx*4+804]    ;  取值后异或原来的值
004DA623   |.  0F>movzx eax,byte ptr ds:[eax]             ;  取刚才异或的的7,8
004DA626   |.  03>add edx,dword ptr ss:[esp+eax*4+C04]    ;  取值加上原来的值
004DA62D   |.  8B>mov eax,edx
004DA62F   |.  81>add esp,1004
004DA635   |.  5F pop edi
004DA636   |.  5E pop esi
004DA637   \.  C3 retn

………………………………………………………………………………………………………………………………
进入 004DAD5A   |.  E8>call unpacked.004DA8A4                  ;  处理用户名的地方!
………………………………………………………………………………………………………………………………
004DA8A4   /$  55 push ebp
004DA8A5   |.  8B>mov ebp,esp
004DA8A7   |.  81>add esp,-110
004DA8AD   |.  53 push ebx
004DA8AE   |.  56 push esi
004DA8AF   |.  89>mov dword ptr ss:[ebp-C],ecx
004DA8B2   |.  89>mov dword ptr ss:[ebp-8],edx
004DA8B5   |.  89>mov dword ptr ss:[ebp-4],eax
004DA8B8   |.  8B>mov eax,dword ptr ss:[ebp-8]
004DA8BB   |.  E8>call unpacked.004042D4                  ;  没什么
004DA8C0   |.  33>xor eax,eax
004DA8C2   |.  55 push ebp
004DA8C3   |.  68>push unpacked.004DAA41
004DA8C8   |.  64>push dword ptr fs:[eax]
004DA8CB   |.  64>mov dword ptr fs:[eax],esp
004DA8CE   |.  8B>mov eax,dword ptr ss:[ebp-8]
004DA8D1   |.  E8>call unpacked.00404120                  ;  得到用户名位数
004DA8D6   |.  8B>mov ebx,eax                             ;  位数
004DA8D8   |.  85>test ebx,ebx
004DA8DA   |.  75>jnz short unpacked.004DA8E3
004DA8DC   |.  33>xor ebx,ebx
004DA8DE   |.  E9>jmp unpacked.004DAA2B
004DA8E3   |>  B9>mov ecx,unpacked.005E6A7C
004DA8E8   |.  BA>mov edx,unpacked.005E6A34
004DA8ED   |.  A1>mov eax,dword ptr ds:[5E36E8]           ;  得到一串字符串 另一个
004DA8F2   |.  E8>call unpacked.004DA3EC                  ;  将字符串处理成为密码表
004DA8F7   |.  A1>mov eax,dword ptr ds:[5E36F0]
004DA8FC   |.  03>add eax,ebx
004DA8FE   |.  48 dec eax
004DA8FF   |.  99 cdq
004DA900   |.  F7>idiv dword ptr ds:[5E36F0]              ;  除以8
004DA906   |.  89>mov dword ptr ss:[ebp-10],eax           ;  得到商
004DA909   |.  8B>mov eax,dword ptr ss:[ebp-10]
004DA90C   |.  F7>imul dword ptr ds:[5E36F0]              ;  商乘以8
004DA912   |.  8B>mov ebx,eax
004DA914   |.  4B dec ebx                                 ;  位数减1
004DA915   |.  85>test ebx,ebx
004DA917   |.  7C>jl short unpacked.004DA927
004DA919   |.  43 inc ebx
004DA91A   |.  8D>lea eax,dword ptr ss:[ebp-110]          ;  得到密码表地址
004DA920   |>  C6>/mov byte ptr ds:[eax],0                ;  密码表前16个(前4组)为0
004DA923   |.  40 |inc eax
004DA924   |.  4B |dec ebx
004DA925   |.^ 75>\jnz short unpacked.004DA920
004DA927   |>  8D>lea eax,dword ptr ss:[ebp-110]
004DA92D   |.  B9>mov ecx,0FF
004DA932   |.  8B>mov edx,dword ptr ss:[ebp-8]            ;  用户名地址
004DA935   |.  E8>call unpacked.0040A4B0                  ;  拷贝一下用户名
004DA93A   |.  8B>mov ebx,dword ptr ss:[ebp-10]
004DA93D   |.  4B dec ebx
004DA93E   |.  85>test ebx,ebx
004DA940   |.  7C>jl short unpacked.004DA96B
004DA942   |.  43 inc ebx
004DA943   |.  33>xor esi,esi
004DA945   |>  8D>/lea eax,dword ptr ss:[ebp-110]         ;  用户名地址
004DA94B   |.  8B>|mov edx,esi
004DA94D   |.  0F>|imul edx,dword ptr ds:[5E36F0]         ;  乘以8
004DA954   |.  03>|add eax,edx
004DA956   |.  68>|push unpacked.005E6A7C                 ; /Arg1 = 005E6A7C
004DA95B   |.  B9>|mov ecx,unpacked.005E6A34              ; |真正密码表
004DA960   |.  8B>|mov edx,eax                            ; |
004DA962   |.  E8>|call unpacked.004DA740                 ; \用密码表处理用户名的地方
004DA967   |.  46 |inc esi
004DA968   |.  4B |dec ebx
004DA969   |.^ 75>\jnz short unpacked.004DA945
004DA96B   |>  8B>mov ebx,dword ptr ss:[ebp-10]
004DA96E   |.  4B dec ebx
004DA96F   |.  85>test ebx,ebx
004DA971   |.  7E>jle short unpacked.004DA9BD
004DA973   |.  BE>mov esi,1
004DA978   |>  68>/push unpacked.005E6A7C                 ; /Arg1 = 005E6A7C
004DA97D   |.  8D>|lea eax,dword ptr ss:[ebp-110]         ; |
004DA983   |.  8B>|mov edx,esi                            ; |
004DA985   |.  0F>|imul edx,dword ptr ds:[5E36F0]         ; |
004DA98C   |.  03>|add eax,edx                            ; |
004DA98E   |.  B9>|mov ecx,unpacked.005E6A34              ; |
004DA993   |.  8B>|mov edx,dword ptr ds:[5E36F0]          ; |
004DA999   |.  E8>|call unpacked.004DA44C                 ; \unpacked.004DA44C
004DA99E   |.  68>|push unpacked.005E6A7C                 ; /Arg1 = 005E6A7C
004DA9A3   |.  8D>|lea edx,dword ptr ss:[ebp-110]         ; |
004DA9A9   |.  8D>|lea eax,dword ptr ss:[ebp-110]         ; |
004DA9AF   |.  B9>|mov ecx,unpacked.005E6A34              ; |
004DA9B4   |.  E8>|call unpacked.004DA740                 ; \unpacked.004DA740
004DA9B9   |.  46 |inc esi
004DA9BA   |.  4B |dec ebx
004DA9BB   |.^ 75>\jnz short unpacked.004DA978
004DA9BD   |>  8B>mov ebx,dword ptr ss:[ebp-C]
004DA9C0   |.  4B dec ebx
004DA9C1   |.  85>test ebx,ebx
004DA9C3   |.  7C>jl short unpacked.004DA9D8
004DA9C5   |.  43 inc ebx
004DA9C6   |.  8D>lea eax,dword ptr ss:[ebp+8]
004DA9C9   |.  8D>lea edx,dword ptr ss:[ebp-110]
004DA9CF   |>  8A>/mov cl,byte ptr ds:[eax]             对用户名计算出来的赋标志值
004DA9D1   |.  88>|mov byte ptr ds:[edx],cl
004DA9D3   |.  42 |inc edx
004DA9D4   |.  40 |inc eax
004DA9D5   |.  4B |dec ebx
004DA9D6   |.^ 75>\jnz short unpacked.004DA9CF
004DA9D8   |>  B9>mov ecx,unpacked.005E6A7C
004DA9DD   |.  BA>mov edx,unpacked.005E6A34
004DA9E2   |.  A1>mov eax,dword ptr ds:[5E36EC]
004DA9E7   |.  E8>call unpacked.004DA3EC          处理密码表的地方,这次的密码表与刚才处理输入码的密码表一样,为的就是还原
004DA9EC   |.  68>push unpacked.005E6A7C                  ; /Arg1 = 005E6A7C
004DA9F1   |.  8D>lea edx,dword ptr ss:[ebp-110]          ; |
004DA9F7   |.  8D>lea eax,dword ptr ss:[ebp-110]          ; |
004DA9FD   |.  B9>mov ecx,unpacked.005E6A34               ; |
004DAA02   |.  E8>call unpacked.004DA740                  ; 对得到的结果还原(它与处理输入码的函数是可逆函数,但本身不可逆)
004DAA07   |.  8B>mov ebx,dword ptr ds:[5E36F0]
004DAA0D   |.  4B dec ebx
004DAA0E   |.  85>test ebx,ebx
004DAA10   |.  7C>jl short unpacked.004DAA25
004DAA12   |.  43 inc ebx
004DAA13   |.  8D>lea eax,dword ptr ss:[ebp-110]
004DAA19   |.  8B>mov edx,dword ptr ss:[ebp-4]
004DAA1C   |>  8A>/mov cl,byte ptr ds:[eax]
004DAA1E   |.  88>|mov byte ptr ds:[edx],cl
004DAA20   |.  42 |inc edx
004DAA21   |.  40 |inc eax
004DAA22   |.  4B |dec ebx
004DAA23   |.^ 75>\jnz short unpacked.004DAA1C
004DAA25   |>  8B>mov ebx,dword ptr ds:[5E36F0]
004DAA2B   |>  33>xor eax,eax
004DAA2D   |.  5A pop edx
004DAA2E   |.  59 pop ecx
004DAA2F   |.  59 pop ecx
004DAA30   |.  64>mov dword ptr fs:[eax],edx
004DAA33   |.  68>push unpacked.004DAA48
004DAA38   |>  8D>lea eax,dword ptr ss:[ebp-8]
004DAA3B   |.  E8>call unpacked.00403EA0
004DAA40   \.  C3 retn
……………………………………………………………………………………………………………………
进入  004DA962   |.  E8>|call unpacked.004DA740                 ; \用密码表处理用户名的地方

……………………………………………………………………………………………………………………
004DA753   |.  8D>lea edi,dword ptr ss:[ebp-1050]
004DA759   |.  51 push ecx
004DA75A   |.  B9>mov ecx,400
004DA75F   |.  F3>rep movs dword ptr es:[edi],dword ptr d>;  拷贝从第19开始的密码表数据
004DA761   |.  59 pop ecx
004DA762   |.  8B>mov esi,ecx
004DA764   |.  8D>lea edi,dword ptr ss:[ebp-50]
004DA767   |.  B9>mov ecx,12
004DA76C   |.  F3>rep movs dword ptr es:[edi],dword ptr d>;  拷贝前18位密码表数据放于最后
004DA76E   |.  8B>mov ebx,eax
004DA770   |.  8B>mov eax,edx
004DA772   |.  83>add edx,4
004DA775   |.  8B>mov eax,dword ptr ds:[eax]              ;  取用户名的前4位ASCII(反)
004DA777   |.  89>mov dword ptr ss:[ebp-4],eax            ;  存储
004DA77A   |.  8B>mov eax,dword ptr ds:[edx]              ;  取用户名的5-8位ASCII(反)
004DA77C   |.  89>mov dword ptr ss:[ebp-8],eax            ;  存储
004DA77F   |.  8D>lea eax,dword ptr ss:[ebp-1050]         ;  密码表的头
004DA785   |.  50 push eax                                ; /Arg1
004DA786   |.  8D>lea edx,dword ptr ss:[ebp-8]            ; |取用户名的5-8位ASCII(反)
004DA789   |.  8D>lea eax,dword ptr ss:[ebp-4]            ; |取用户名的前4位ASCII(反)
004DA78C   |.  8D>lea ecx,dword ptr ss:[ebp-50]           ; |密码表的头地址
004DA78F   |.  E8>call unpacked.004DA638                  ; \用户名的处理
004DA794   |.  8B>mov eax,ebx
004DA796   |.  8D>lea edx,dword ptr ds:[ebx+4]
004DA799   |.  8B>mov ecx,dword ptr ss:[ebp-4]
004DA79C   |.  89>mov dword ptr ds:[eax],ecx
004DA79E   |.  8B>mov eax,dword ptr ss:[ebp-8]
004DA7A1   |.  89>mov dword ptr ds:[edx],eax
004DA7A3   |.  5F pop edi
004DA7A4   |.  5E pop esi
004DA7A5   |.  5B pop ebx
004DA7A6   |.  8B>mov esp,ebp
004DA7A8   |.  5D pop ebp
004DA7A9   \.  C2>retn 4
……………………………………………………………………………………………………………………
004DA78F   |.  E8>call unpacked.004DA638
………………………………………………………………………………………………………………
004DA648   |.  8B>mov esi,dword ptr ss:[ebp+8]            ;  密码表的头地址
004DA64B   |.  8D>lea edi,dword ptr ss:[ebp-1054]
004DA651   |.  51 push ecx                                ;  密码表头地址
004DA652   |.  B9>mov ecx,400                             ;  拷贝100组数据
004DA657   |.  F3>rep movs dword ptr es:[edi],dword ptr d>;  从第19位开始开始拷贝的1024位数据到堆栈
004DA659   |.  59 pop ecx
004DA65A   |.  8B>mov esi,ecx
004DA65C   |.  8D>lea edi,dword ptr ss:[ebp-54]
004DA65F   |.  B9>mov ecx,12
004DA664   |.  F3>rep movs dword ptr es:[edi],dword ptr d>;  又将前18数据拷贝到整个数据的后面!!!!
004DA666   |.  89>mov dword ptr ss:[ebp-8],edx
004DA669   |.  89>mov dword ptr ss:[ebp-4],eax
004DA66C   |.  8B>mov ebx,dword ptr ss:[ebp-4]
004DA66F   |.  8B>mov ebx,dword ptr ds:[ebx]              ;  用户名的前4
004DA671   |.  8B>mov edi,dword ptr ss:[ebp-8]
004DA674   |.  8B>mov edi,dword ptr ds:[edi]              ;  用户名2
004DA676   |.  C6>mov byte ptr ss:[ebp-9],10
004DA67A   |.  8D>lea esi,dword ptr ss:[ebp-54]           ;  得到是原来的第1组数据
004DA67D   |>  33>/xor ebx,dword ptr ds:[esi]
004DA67F   |.  8D>|lea edx,dword ptr ss:[ebp-1054]        ;  另一个密码表
004DA685   |.  8B>|mov eax,ebx
004DA687   |.  E8>|call unpacked.004DA5E4
004DA68C   |.  33>|xor edi,eax
004DA68E   |.  8B>|mov eax,ebx
004DA690   |.  8B>|mov ebx,edi
004DA692   |.  8B>|mov edi,eax
004DA694   |.  83>|add esi,4
004DA697   |.  FE>|dec byte ptr ss:[ebp-9]
004DA69A   |.^ 75>\jnz short unpacked.004DA67D
004DA69C   |.  8B>mov eax,ebx
004DA69E   |.  8B>mov ebx,edi
004DA6A0   |.  8B>mov edi,eax
004DA6A2   |.  33>xor edi,dword ptr ss:[ebp-14]
004DA6A5   |.  33>xor ebx,dword ptr ss:[ebp-10]
004DA6A8   |.  8B>mov eax,dword ptr ss:[ebp-4]
004DA6AB   |.  89>mov dword ptr ds:[eax],ebx
004DA6AD   |.  8B>mov eax,dword ptr ss:[ebp-8]
004DA6B0   |.  89>mov dword ptr ds:[eax],edi
004DA6B2   |.  5F pop edi
004DA6B3   |.  5E pop esi
004DA6B4   |.  5B pop ebx
004DA6B5   |.  8B>mov esp,ebp
004DA6B7   |.  5D pop ebp
004DA6B8   \.  C2>retn 4
函数与上面很像,但有点不一样,
………………………………………………………………………………………………………………………………
进入 004DAA02   |.  E8>call unpacked.004DA740   和处理用户名的函数一样,
只是密码表不一样
………………………………………………………………………………………………………………………………
004DA75A   |.  B9>mov ecx,400
004DA75F   |.  F3>rep movs dword ptr es:[edi],dword ptr d>;  拷贝从第19开始的密码表数据
004DA761   |.  59 pop ecx
004DA762   |.  8B>mov esi,ecx
004DA764   |.  8D>lea edi,dword ptr ss:[ebp-50]
004DA767   |.  B9>mov ecx,12
004DA76C   |.  F3>rep movs dword ptr es:[edi],dword ptr d>;  拷贝前18位密码表数据放于最后
004DA76E   |.  8B>mov ebx,eax
004DA770   |.  8B>mov eax,edx
004DA772   |.  83>add edx,4
004DA775   |.  8B>mov eax,dword ptr ds:[eax]              ;  取用户名的前4位ASCII(反)
004DA777   |.  89>mov dword ptr ss:[ebp-4],eax            ;  存储
004DA77A   |.  8B>mov eax,dword ptr ds:[edx]              ;  取用户名的5-8位ASCII(反)
004DA77C   |.  89>mov dword ptr ss:[ebp-8],eax            ;  存储
004DA77F   |.  8D>lea eax,dword ptr ss:[ebp-1050]         ;  密码表的头
004DA785   |.  50 push eax                                ; /Arg1
004DA786   |.  8D>lea edx,dword ptr ss:[ebp-8]            ; |取用户名的5-8位ASCII(反)
004DA789   |.  8D>lea eax,dword ptr ss:[ebp-4]            ; |取用户名的前4位ASCII(反)
004DA78C   |.  8D>lea ecx,dword ptr ss:[ebp-50]           ; |密码表的头地址
004DA78F   |.  E8>call unpacked.004DA638                  ; \用户名的处理
004DA794   |.  8B>mov eax,ebx
004DA796   |.  8D>lea edx,dword ptr ds:[ebx+4]
004DA799   |.  8B>mov ecx,dword ptr ss:[ebp-4]
004DA79C   |.  89>mov dword ptr ds:[eax],ecx
004DA79E   |.  8B>mov eax,dword ptr ss:[ebp-8]
004DA7A1   |.  89>mov dword ptr ds:[edx],eax
004DA7A3   |.  5F pop edi
004DA7A4   |.  5E pop esi
004DA7A5   |.  5B pop ebx
004DA7A6   |.  8B>mov esp,ebp
004DA7A8   |.  5D pop ebp
004DA7A9   \.  C2>retn 4
对得到的结果还原(它与处理输入码的函数是可逆函数,但本身不可逆)
………………………………………………………………………………………………………………………………
里面有2套密码表,都是动态改变之后的,
1套用来处理用户名,
还有1套有2处用,一处:处理输入码标志位时用,还有一处还原用户名计算出来的结果(还要用标志赋值)时用到,
也就是说这2处的函数是互相可逆的!

输入码的格式:前4位-中间8位-后4位,共16位,计算中分成前8和后8位。
整个处理函数是这样的:
第一步:用得到输入码,在用内部密码表动态修改的密码表1(1024个密码)一系列取值并运算,得到16位值,
取前三位(内存看到的值)作为标志位(其实只有一位起作用)
第二步:用得到用户名,在用内部密码表动态修改的密码表2(1024个密码)一系列取值并运算,得到16位值,
再把第一步中得到标志位给了第二步中前3位(内存看到的值)记为A
第三步:把A,再在密码表1中一系列的运算又得到16位值(这个过程其实是第一步的逆过程)
把第三步得到的值与输入码进行比较,不等就读狗,相等,再比较标志位,看属于什么版本!!
………………………………………………………………………………………………………………………………
附:
注册机代码:
unsigned long int quzhi(zhi,mimabiao)
unsigned long int zhi,mimabiao[];
{
unsigned long int a12,a34,a56,a78,jieguo;
a12=zhi>>24;
a34=zhi<<8;
a34=a34>>24;
a56=zhi<<16;
a56=a56>>24;
a78=zhi<<24;
a78=a78>>24;
jieguo=((mimabiao[a12]+mimabiao[a34+256])^mimabiao[a56+512])+mimabiao[a78+768];
return jieguo;
}


chucun(yhm)
unsigned long int yhm[];
{
unsigned long int a12,a34,a56,a78,i;
for(i=0;i<2;i++)
{
a12=yhm[i]>>24;
a34=yhm[i]<<8;
a34=a34>>24;
a34=a34<<8;
a56=yhm[i]<<16;
a56=a56>>24;
a56=a56<<16;
a78=yhm[i]<<24;
yhm[i]=a78+a56+a34+a12;
}
}



jisuan(mimabiao1,mimabiao2,yhm)
unsigned long int mimabiao1[],mimabiao2[],yhm[];
{
unsigned long int zj,jiaoh;
int i,a;
for (i=0;i<16;i++)
{
yhm[0]=yhm[0]^mimabiao2[i];
zj=quzhi(yhm[0],mimabiao1);
yhm[1]=yhm[1]^zj;
jiaoh=yhm[0];
yhm[0]=yhm[1];
yhm[1]=jiaoh;
}
yhm[0]=yhm[0]^mimabiao2[16];
yhm[1]=yhm[1]^mimabiao2[17];
jiaoh=yhm[0];
yhm[0]=yhm[1];
yhm[1]=jiaoh;
}



main()
{
int i;
static char jianpan[30];
static unsigned long int mimabiao1[1030]={    一共有1024个密码,太长删除了)
0xF19286DD
,0xBDDE51E0
,0xF5E20EE3
,0x3B0160B5
,0x798BA7B7


,0x66C9A723
,0x35E35760
,0xADBF5726
,0xBF2646AD
,0x2E7F3549
,0xAF2C5755
,0x09D535B5
,0x7385EC1F
,0x74812FB1
,0x110837D2};


static unsigned long int mimabiao2[18]={
0x92D6B98A
,0x7A0B23A8
,0x9468B773
,0x52159430
,0xEF4A56D1
,0x048BEAF8
,0x858654F5
,0xD5334140
,0x98781392
,0x1193DA10
,0x7807B105
,0xCACAE69E
,0xA8D85878
,0x7F52AA92
,0xB73836B2
,0x982EE709
,0x12C65B64
,0xA30BF858};



static unsigned long int mimabiao3[1030]={       一共有1024个密码,太长删除了)
0x69F54F2A
,0x24304D20
,0xAB2D3164
,0x73FB62D3
,0x0378FDC9
,0xC4D77DB1

,0xA6024CDF
,0xA359624C
,0xDB5CBF55
,0x3EFC6690
,0x81121B05
,0x6C5EE2A7
,0xC0A1CB79
,0x2ED1E51C
,0x725024B4
,0xBAEDD525
,0xA9AE2DF5
,0x2A9305FB
,0x31D00F44
,0x41C014D9
,0x07CD8995
,0xABAD4CD6
,0xBCE74C71
,0x793BA497
,0xB98C16A4
,0x4FBF1604
,0xA4698352
,0xC00A31E5
,0xD7996532
,0x32513D64
,0x2A93B281
,0xAB92FD57
,0x765E9335
,0x6859363B
,0x5E9E4181
,0x32800FEF
,0xBB322DA2
,0x9E06BE93
,0xC54267F1
,0x53510575
,0xF313CF63
,0x38F133B9
,0xB7279BE5
,0xC48F3AED
,0xA9D79810
,0xC66CD00E
,0x1CB8977E
,0x773DDD89
,0x785BB7E7
,0xDAFCAC34
,0xC0A8718B
,0xCB7B7E2D
,0xDB03A787
,0x263E6760
,0x6AE0DD15
,0x2CD840CC
,0x86547621
,0x8EA5E1F3
,0x3EE87425
,0x1B63CEA8
,0x2EFDF020
,0xE81186AD
,0x38207844
,0xEAA5305D
,0x86D65229
,0x80842E73
,0x7CEFF318
,0x9CDD72BB
,0xA846ED8F
,0x35C852A0
,0x7BEDFB4F};


static unsigned long int mimabiao4[18]={
0x6A113CAB
,0xD9DB2B90
,0x63F390FB
,0x52C63AF0
,0xE38325D2
,0x30AA71EC
,0x08A6F903
,0x0885F7AC
,0x0FE5EE34
,0xE252442E
,0x7EF86E10
,0x9269A91C
,0x2299478D
,0xDA099822
,0x78A49777
,0xC5F7442D
,0xBD22B702
,0x60CBF06A};


unsigned long int yhm[2],wls,xuanzhe,qian4,hou4,xuan,danji=0,guding=0x64,t;
printf("qing shu ru yong hu ming:");
scanf("%s",jianpan);

yhm[0]=jianpan[3];
yhm[0]=yhm[0]<<8;
yhm[0]=yhm[0]+jianpan[2];
yhm[0]=yhm[0]<<8;
yhm[0]=yhm[0]+jianpan[1];
yhm[0]=yhm[0]<<8;
yhm[0]=yhm[0]+jianpan[0];

yhm[1]=jianpan[7];
yhm[1]=yhm[1]<<8;
yhm[1]=yhm[1]+jianpan[6];
yhm[1]=yhm[1]<<8;
yhm[1]=yhm[1]+jianpan[5];
yhm[1]=yhm[1]<<8;
yhm[1]=yhm[1]+jianpan[4];


jisuan(mimabiao1,mimabiao2,yhm);

yhm[0]=yhm[0]>>8;
yhm[0]=yhm[0]<<8;

printf("dan ji ban xuanzhe : 0; wang luo ban xuan zhe : 1\n");
scanf("%d",&xuan);

if(xuan==danji)
{
printf("dan ji ban zhu ce ma:");
yhm[0]=yhm[0]+0x28;
jisuan(mimabiao3,mimabiao4,yhm);
chucun(yhm);
for(i=0;i<2;i++)
{
qian4=yhm[i]>>16;
hou4=yhm[i]<<16;
hou4=hou4>>16;
printf("%4lx-%4lx",qian4,hou4);
}
printf("\n");
}

else
{
printf("qing shu ru wang luo xu ke zheng shu:\n");
scanf("%d",&wls);
guding=guding+wls;
t=yhm[0]>>16;
t=t<<16;
yhm[0]=yhm[0]+guding;
yhm[0]=yhm[0]<<16;
yhm[0]=yhm[0]>>16;
yhm[0]=yhm[0]+t;
jisuan(mimabiao3,mimabiao4,yhm);
chucun(yhm);
printf("wang luo ban zhu ce ma:");
for(i=0;i<2;i++)
{
qian4=yhm[i]>>16;
hou4=yhm[i]<<16;
hou4=hou4>>16;
printf("%4lx-%4lx",qian4,hou4);

}
}
}

结果中的如果有空格应该为0