网络断魂 发表于 2007-10-24 16:17:48

A1档案管理系统算法简单分析(高手飞过)

【文章标题】: A1档案管理系统算法简单分析(高手飞过)
【文章作者】: 网络断魂
【软件名称】: A1档案管理系统
【下载地址】: http://www.cometgroup.com.cn
【加壳方式】: ASPACK
【保护方式】: 机器码
【编写语言】: Borland Delphi 6.0 - 7.0
【使用工具】: OD PEID PYG密码学综合工具
【操作平台】: winxp2
【作者声明】: 菜鸟学习算法,失误之处请多指教!

1、查壳:ASPack 2.12 -> Alexey Solodovnikov
2、用脱壳机或ESP定律脱壳修复后:Borland Delphi 6.0 - 7.0
3、进入软件后点“注册授权”,输入假码1111111111,提示“注册号码不正确,请重新输入!”
4、根据消息断点及字符串,找到注册算法函数,

003844A3    8B45 08         mov   eax, dword ptr          ; //送机器码
003844A6    50            push    eax
003844A7    8D45 F8         lea   eax, dword ptr
003844AA    50            push    eax
003844AB    E8 B8F8FFFF   call    00383D68                         ; //关键算法,跟进第一层,
003844B0    8B55 F8         mov   edx, dword ptr          ; //送真码,
003844B3    8B45 0C         mov   eax, dword ptr          ; //送假码,此处做注册机!
003844B6    E8 ADFCFEFF   call    00374168



003844AB    E8 B8F8FFFF   call    00383D68跟进后来到:

00383D68    55            push    ebp
00383D69    8BEC            mov   ebp, esp
00383D6B    B9 0D000000   mov   ecx, 0D                        ; //13
00383D70    6A 00         push    0
00383D72    6A 00         push    0
00383D74    49            dec   ecx
00383D75^ 75 F9         jnz   short 00383D70
00383D77    51            push    ecx
00383D78    53            push    ebx
00383D79    8B5D 08         mov   ebx, dword ptr
00383D7C    8B45 0C         mov   eax, dword ptr          ; //送机器码
00383D7F    E8 8804FFFF   call    0037420C                         ; //EDX=3
00383D84    33C0            xor   eax, eax
00383D86    55            push    ebp
00383D87    68 BB403800   push    003840BB
00383D8C    64:FF30         push    dword ptr fs:
00383D8F    64:8920         mov   dword ptr fs:, esp
00383D92    8BC3            mov   eax, ebx
00383D94    E8 E7FFFEFF   call    00373D80
00383D99    8D4D FC         lea   ecx, dword ptr
00383D9C    8B15 8C573800   mov   edx, dword ptr           ; //“SalaKey2005” 常量
00383DA2    8B45 0C         mov   eax, dword ptr          ; //送机器码
00383DA5    E8 D2F4FFFF   call    0038327C                         ; //计算得出一串字符串,(跟进第二层)
00383DAA    8B45 FC         mov   eax, dword ptr          ; //送计算后的一串字符串,
00383DAD    E8 6A02FFFF   call    0037401C                         ; //计算上面字符串长度
00383DB2    83F8 20         cmp   eax, 20                        ; //长度与20(32)比较,
00383DB5    0F8E FC000000   jle   00383EB7                         ; //小于或等于则跳走
00383DBB    8D45 F8         lea   eax, dword ptr
00383DBE    50            push    eax
00383DBF    B9 02000000   mov   ecx, 2                           ; //取2位,
00383DC4    BA 01000000   mov   edx, 1                           ; //从第1位开始取
00383DC9    8B45 FC         mov   eax, dword ptr          ; //送加密后的字符串
00383DCC    E8 AB04FFFF   call    0037427C                         ; //取字符
00383DD1    FF75 F8         push    dword ptr                 ; //储存取值结果给016ADAC8
00383DD4    8D45 F4         lea   eax, dword ptr
00383DD7    50            push    eax
00383DD8    B9 02000000   mov   ecx, 2                           ; //取2位,
00383DDD    BA 07000000   mov   edx, 7                           ; //从第7位开始取
00383DE2    8B45 FC         mov   eax, dword ptr          ; //送字符串
00383DE5    E8 9204FFFF   call    0037427C                         ; //取字符
00383DEA    FF75 F4         push    dword ptr                 ; //储存取值结果给016ADAC8
00383DED    8D45 F0         lea   eax, dword ptr
00383DF0    50            push    eax
00383DF1    B9 01000000   mov   ecx, 1                           ; //取1位
00383DF6    BA 11000000   mov   edx, 11                        ; //从第17位开始取
00383DFB    8B45 FC         mov   eax, dword ptr          ; //送字符串
00383DFE    E8 7904FFFF   call    0037427C                         ; //取字符
00383E03    FF75 F0         push    dword ptr                ; //保存结果
00383E06    68 D4403800   push    003840D4                         ; //以上5位做为第一段注册码!
00383E0B    8D45 EC         lea   eax, dword ptr
00383E0E    50            push    eax
00383E0F    B9 01000000   mov   ecx, 1                           ; //取1位
00383E14    BA 12000000   mov   edx, 12                        ; //从第18位开始取
00383E19    8B45 FC         mov   eax, dword ptr          ; //送字符串
00383E1C    E8 5B04FFFF   call    0037427C                         ; //取字符
00383E21    FF75 EC         push    dword ptr                ; //存结果 到01697340中
00383E24    8D45 E8         lea   eax, dword ptr
00383E27    50            push    eax
00383E28    B9 02000000   mov   ecx, 2                           ; //取2位
00383E2D    BA 17000000   mov   edx, 17                        ; //从第23位开始取
00383E32    8B45 FC         mov   eax, dword ptr          ; //送字符串
00383E35    E8 4204FFFF   call    0037427C                         ; //取字符
00383E3A    FF75 E8         push    dword ptr                ; //存结果到016A9CF4中
00383E3D    8D45 E4         lea   eax, dword ptr
00383E40    50            push    eax
00383E41    B9 02000000   mov   ecx, 2                           ; //取2位
00383E46    BA 1D000000   mov   edx, 1D                        ; //从第29位开始取
00383E4B    8B45 FC         mov   eax, dword ptr          ; //送字符串
00383E4E    E8 2904FFFF   call    0037427C                         ; //取字符
00383E53    FF75 E4         push    dword ptr                ; //存结果到016A9CF4中
00383E56    68 D4403800   push    003840D4                         ; //以上5位作为第二段注册码
00383E5B    8D45 E0         lea   eax, dword ptr
00383E5E    50            push    eax
00383E5F    B9 02000000   mov   ecx, 2                           ; //取2位
00383E64    BA 23000000   mov   edx, 23                        ; //从第35位开始取
00383E69    8B45 FC         mov   eax, dword ptr          ; //送字符串
00383E6C    E8 0B04FFFF   call    0037427C                         ; //取字符
00383E71    FF75 E0         push    dword ptr                ; //存结果
00383E74    8D45 DC         lea   eax, dword ptr
00383E77    50            push    eax
00383E78    B9 02000000   mov   ecx, 2                           ; //取2位
00383E7D    BA 29000000   mov   edx, 29                        ; //从第41位开始取
00383E82    8B45 FC         mov   eax, dword ptr          ; //送字符串
00383E85    E8 F203FFFF   call    0037427C                         ; //取字符
00383E8A    FF75 DC         push    dword ptr                ; //存结果016B6CA0中
00383E8D    8D45 D8         lea   eax, dword ptr
00383E90    50            push    eax
00383E91    B9 01000000   mov   ecx, 1                           ; //取第1位
00383E96    BA 2F000000   mov   edx, 2F                        ; //从第47位开始取
00383E9B    8B45 FC         mov   eax, dword ptr          ; //送字符串
00383E9E    E8 D903FFFF   call    0037427C                         ; //取字符
00383EA3    FF75 D8         push    dword ptr                ; //存结果
00383EA6    8BC3            mov   eax, ebx
00383EA8    BA 0B000000   mov   edx, 0B
00383EAD    E8 2A02FFFF   call    003740DC
00383EB2    E9 E1010000   jmp   00384098
00383EB7    8B45 FC         mov   eax, dword ptr          ; //若加密后字符串小于或等于32位,则跳来此处
00383EBA    E8 5D01FFFF   call    0037401C                         ; //再次计算字符串长度
00383EBF    83F8 10         cmp   eax, 10                        ; //与16比较
00383EC2    0F8E FC000000   jle   00383FC4                         ; //小于或等于16位则跳走
00383EC8    8D45 D4         lea   eax, dword ptr
00383ECB    50            push    eax
00383ECC    B9 02000000   mov   ecx, 2                           ; //取2位,
00383ED1    BA 01000000   mov   edx, 1                           ; 从第1位开始取
00383ED6    8B45 FC         mov   eax, dword ptr
00383ED9    E8 9E03FFFF   call    0037427C
00383EDE    FF75 D4         push    dword ptr
00383EE1    8D45 D0         lea   eax, dword ptr
00383EE4    50            push    eax
00383EE5    B9 02000000   mov   ecx, 2                           ; //取2位
00383EEA    BA 05000000   mov   edx, 5                           ; 从第5位开始取
00383EEF    8B45 FC         mov   eax, dword ptr
00383EF2    E8 8503FFFF   call    0037427C
00383EF7    FF75 D0         push    dword ptr
00383EFA    8D45 CC         lea   eax, dword ptr
00383EFD    50            push    eax
00383EFE    B9 01000000   mov   ecx, 1                           ; //取1位,
00383F03    BA 0B000000   mov   edx, 0B                        ; //从第11位开始取
00383F08    8B45 FC         mov   eax, dword ptr
00383F0B    E8 6C03FFFF   call    0037427C
00383F10    FF75 CC         push    dword ptr
00383F13    68 D4403800   push    003840D4
00383F18    8D45 C8         lea   eax, dword ptr
00383F1B    50            push    eax
00383F1C    B9 01000000   mov   ecx, 1                           ; //取1位
00383F21    BA 0C000000   mov   edx, 0C                        ; //从第12位开始取
00383F26    8B45 FC         mov   eax, dword ptr
00383F29    E8 4E03FFFF   call    0037427C
00383F2E    FF75 C8         push    dword ptr
00383F31    8D45 C4         lea   eax, dword ptr
00383F34    50            push    eax
00383F35    B9 02000000   mov   ecx, 2                           ; //取2位,
00383F3A    BA 0F000000   mov   edx, 0F                        ; //从第15位开始取
00383F3F    8B45 FC         mov   eax, dword ptr
00383F42    E8 3503FFFF   call    0037427C
00383F47    FF75 C4         push    dword ptr
00383F4A    8D45 C0         lea   eax, dword ptr
00383F4D    50            push    eax
00383F4E    B9 02000000   mov   ecx, 2                           ; //取2位,
00383F53    BA 13000000   mov   edx, 13                        ; //从第19位开始取
00383F58    8B45 FC         mov   eax, dword ptr
00383F5B    E8 1C03FFFF   call    0037427C
00383F60    FF75 C0         push    dword ptr
00383F63    68 D4403800   push    003840D4
00383F68    8D45 BC         lea   eax, dword ptr
00383F6B    50            push    eax
00383F6C    B9 02000000   mov   ecx, 2                           ; //取2位,
00383F71    BA 17000000   mov   edx, 17                        ; //从第23位开始取
00383F76    8B45 FC         mov   eax, dword ptr
00383F79    E8 FE02FFFF   call    0037427C
00383F7E    FF75 BC         push    dword ptr
00383F81    8D45 B8         lea   eax, dword ptr
00383F84    50            push    eax
00383F85    B9 02000000   mov   ecx, 2                           ; //取2位,
00383F8A    BA 1B000000   mov   edx, 1B                        ; //从第27位开始取
00383F8F    8B45 FC         mov   eax, dword ptr
00383F92    E8 E502FFFF   call    0037427C
00383F97    FF75 B8         push    dword ptr
00383F9A    8D45 B4         lea   eax, dword ptr
00383F9D    50            push    eax
00383F9E    B9 01000000   mov   ecx, 1                           ; //取1位
00383FA3    BA 1F000000   mov   edx, 1F                        ; //从第31位开始取
00383FA8    8B45 FC         mov   eax, dword ptr
00383FAB    E8 CC02FFFF   call    0037427C
00383FB0    FF75 B4         push    dword ptr
00383FB3    8BC3            mov   eax, ebx
00383FB5    BA 0B000000   mov   edx, 0B
00383FBA    E8 1D01FFFF   call    003740DC
00383FBF    E9 D4000000   jmp   00384098
00383FC4    8D45 B0         lea   eax, dword ptr           ; //若加密后的字符串小于或等于16位则跳来此处
00383FC7    50            push    eax
00383FC8    B9 01000000   mov   ecx, 1                           ; //取1位
00383FCD    BA 01000000   mov   edx, 1                           ; //从第1位开始取
00383FD2    8B45 FC         mov   eax, dword ptr
00383FD5    E8 A202FFFF   call    0037427C
00383FDA    FF75 B0         push    dword ptr
00383FDD    8D45 AC         lea   eax, dword ptr
00383FE0    50            push    eax
00383FE1    B9 01000000   mov   ecx, 1                           ; //取1位
00383FE6    BA 03000000   mov   edx, 3                           ; //从第3位开始取(隔1位取1位,类推下去,取到15位)
00383FEB    8B45 FC         mov   eax, dword ptr
00383FEE    E8 8902FFFF   call    0037427C
00383FF3    FF75 AC         push    dword ptr
00383FF6    8D45 A8         lea   eax, dword ptr
00383FF9    50            push    eax
00383FFA    B9 01000000   mov   ecx, 1                           ; //1
00383FFF    BA 05000000   mov   edx, 5                           ; //5
00384004    8B45 FC         mov   eax, dword ptr
00384007    E8 7002FFFF   call    0037427C
0038400C    FF75 A8         push    dword ptr
0038400F    8D45 A4         lea   eax, dword ptr
00384012    50            push    eax
00384013    B9 01000000   mov   ecx, 1                           ; //1
00384018    BA 07000000   mov   edx, 7                           ; //7
0038401D    8B45 FC         mov   eax, dword ptr
00384020    E8 5702FFFF   call    0037427C
00384025    FF75 A4         push    dword ptr
00384028    8D45 A0         lea   eax, dword ptr
0038402B    50            push    eax
0038402C    B9 01000000   mov   ecx, 1                           ; //1
00384031    BA 09000000   mov   edx, 9                           ; //9
00384036    8B45 FC         mov   eax, dword ptr
00384039    E8 3E02FFFF   call    0037427C
0038403E    FF75 A0         push    dword ptr
00384041    8D45 9C         lea   eax, dword ptr
00384044    50            push    eax
00384045    B9 01000000   mov   ecx, 1                           ; //1
0038404A    BA 0B000000   mov   edx, 0B                        ; //11
0038404F    8B45 FC         mov   eax, dword ptr
00384052    E8 2502FFFF   call    0037427C
00384057    FF75 9C         push    dword ptr
0038405A    8D45 98         lea   eax, dword ptr
0038405D    50            push    eax
0038405E    B9 01000000   mov   ecx, 1                           ; //1
00384063    BA 0D000000   mov   edx, 0D                        ; //13
00384068    8B45 FC         mov   eax, dword ptr
0038406B    E8 0C02FFFF   call    0037427C
00384070    FF75 98         push    dword ptr
00384073    8D45 94         lea   eax, dword ptr
00384076    50            push    eax
00384077    B9 01000000   mov   ecx, 1                           ; //1
0038407C    BA 0F000000   mov   edx, 0F                        ; //15
00384081    8B45 FC         mov   eax, dword ptr
00384084    E8 F301FFFF   call    0037427C
00384089    FF75 94         push    dword ptr
0038408C    8BC3            mov   eax, ebx
0038408E    BA 08000000   mov   edx, 8
00384093    E8 4400FFFF   call    003740DC
00384098    33C0            xor   eax, eax
0038409A    5A            pop   edx
0038409B    59            pop   ecx
0038409C    59            pop   ecx
0038409D    64:8910         mov   dword ptr fs:, edx
003840A0    68 C2403800   push    003840C2
003840A5    8D45 94         lea   eax, dword ptr
003840A8    BA 1B000000   mov   edx, 1B
003840AD    E8 F2FCFEFF   call    00373DA4
003840B2    8D45 0C         lea   eax, dword ptr
003840B5    E8 C6FCFEFF   call    00373D80
003840BA    C3            retn
003840BB^ E9 38F6FEFF   jmp   003736F8
003840C0^ EB E3         jmp   short 003840A5
003840C2    5B            pop   ebx
003840C3    8BE5            mov   esp, ebp
003840C5    5D            pop   ebp
003840C6    C2 0800         retn    8



00383DA5    E8 D2F4FFFF   call    0038327C ; //计算得出一串字符串,(跟进第二层)跟进后来到:

0038327C    55            push    ebp
0038327D    8BEC            mov   ebp, esp
0038327F    83C4 E4         add   esp, -1C
00383282    53            push    ebx
00383283    56            push    esi
00383284    57            push    edi
00383285    33DB            xor   ebx, ebx
00383287    895D F4         mov   dword ptr , ebx
0038328A    895D F0         mov   dword ptr , ebx
0038328D    895D EC         mov   dword ptr , ebx
00383290    8BF9            mov   edi, ecx
00383292    8955 F8         mov   dword ptr , edx         
00383295    8945 FC         mov   dword ptr , eax         
00383298    8B45 FC         mov   eax, dword ptr          
0038329B    E8 6C0FFFFF   call    0037420C                        
003832A0    8B45 F8         mov   eax, dword ptr          
003832A3    E8 640FFFFF   call    0037420C                        
003832A8    33C0            xor   eax, eax                        
003832AA    55            push    ebp
003832AB    68 4E333800   push    0038334E
003832B0    64:FF30         push    dword ptr fs:
003832B3    64:8920         mov   dword ptr fs:, esp
003832B6    8D4D F0         lea   ecx, dword ptr
003832B9    8B55 F8         mov   edx, dword ptr          ; //送常量
003832BC    8B45 FC         mov   eax, dword ptr          ; //送机器码
003832BF    E8 40FCFFFF   call    00382F04                         ; //跟进此CALL,第三层
003832C4    8D45 F4         lea   eax, dword ptr
003832C7    E8 B40AFFFF   call    00373D80
003832CC    8B45 F0         mov   eax, dword ptr
003832CF    E8 480DFFFF   call    0037401C
003832D4    8BD8            mov   ebx, eax
003832D6    4B            dec   ebx
003832D7    85DB            test    ebx, ebx
003832D9    7C 4E         jl      short 00383329
003832DB    43            inc   ebx
003832DC    33F6            xor   esi, esi
003832DE    8D45 EC         lea   eax, dword ptr
003832E1    50            push    eax
003832E2    8B45 F0         mov   eax, dword ptr
003832E5    0FB60430      movzx   eax, byte ptr
003832E9    8945 E4         mov   dword ptr , eax
003832EC    C645 E8 00      mov   byte ptr , 0
003832F0    8D55 E4         lea   edx, dword ptr
003832F3    33C9            xor   ecx, ecx
003832F5    B8 64333800   mov   eax, 00383364                  ; ASCII "%x"
003832FA    E8 B547FFFF   call    00377AB4
003832FF    8B45 EC         mov   eax, dword ptr
00383302    E8 150DFFFF   call    0037401C
00383307    48            dec   eax
00383308    75 10         jnz   short 0038331A
0038330A    8D45 EC         lea   eax, dword ptr
0038330D    8B4D EC         mov   ecx, dword ptr
00383310    BA 70333800   mov   edx, 00383370
00383315    E8 4E0DFFFF   call    00374068
0038331A    8D45 F4         lea   eax, dword ptr
0038331D    8B55 EC         mov   edx, dword ptr
00383320    E8 FF0CFFFF   call    00374024
00383325    46            inc   esi
00383326    4B            dec   ebx
00383327^ 75 B5         jnz   short 003832DE                   ; //循环取加密后的值
00383329    8BC7            mov   eax, edi
0038332B    8B55 F4         mov   edx, dword ptr
0038332E    E8 A10AFFFF   call    00373DD4
00383333    33C0            xor   eax, eax
00383335    5A            pop   edx
00383336    59            pop   ecx
00383337    59            pop   ecx
00383338    64:8910         mov   dword ptr fs:, edx
0038333B    68 55333800   push    00383355
00383340    8D45 EC         lea   eax, dword ptr
00383343    BA 05000000   mov   edx, 5
00383348    E8 570AFFFF   call    00373DA4
0038334D    C3            retn




003832BF    E8 40FCFFFF   call    00382F04 ; //跟进此CALL,第三层,跟进后来到:

00382F04    55            push    ebp
00382F05    8BEC            mov   ebp, esp
00382F07    83C4 CC         add   esp, -34
00382F0A    53            push    ebx
00382F0B    56            push    esi
00382F0C    33DB            xor   ebx, ebx
00382F0E    895D CC         mov   dword ptr , ebx
00382F11    895D D8         mov   dword ptr , ebx
00382F14    894D F4         mov   dword ptr , ecx
00382F17    8955 F8         mov   dword ptr , edx         ; //送常量
00382F1A    8945 FC         mov   dword ptr , eax         ; //送机器码
00382F1D    8B45 FC         mov   eax, dword ptr
00382F20    E8 E712FFFF   call    0037420C
00382F25    8B45 F8         mov   eax, dword ptr
00382F28    E8 DF12FFFF   call    0037420C
00382F2D    33C0            xor   eax, eax
00382F2F    55            push    ebp
00382F30    68 A1303800   push    003830A1
00382F35    64:FF30         push    dword ptr fs:
00382F38    64:8920         mov   dword ptr fs:, esp
00382F3B    8B45 FC         mov   eax, dword ptr          ; //送机器码
00382F3E    E8 D910FFFF   call    0037401C                         ; //计算长度
00382F43    85C0            test    eax, eax                         ; //是否为空
00382F45    7E 28         jle   short 00382F6F
00382F47    8B45 FC         mov   eax, dword ptr          ; //送机器码
00382F4A    E8 CD10FFFF   call    0037401C                         ; //计算长度
00382F4F    8B55 FC         mov   edx, dword ptr
00382F52    807C02 FF 00    cmp   byte ptr , 0          ; //机器码最后一位是否为0
00382F57    75 16         jnz   short 00382F6F
00382F59    B9 B8303800   mov   ecx, 003830B8                  ; ASCII "Error: the last char is NULL char."
00382F5E    B2 01         mov   dl, 1
00382F60    A1 4C613700   mov   eax, dword ptr
00382F65    E8 1A74FFFF   call    0037A384
00382F6A    E8 C107FFFF   call    00373730
00382F6F    8B45 F8         mov   eax, dword ptr          ; //送常量
00382F72    E8 A510FFFF   call    0037401C                         ; //计算长度
00382F77    83F8 08         cmp   eax, 8                           ; //长度与8比较
00382F7A    7D 2B         jge   short 00382FA7                   ; //大于或等于转移
00382F7C    EB 0D         jmp   short 00382F8B
00382F7E    8D45 F8         lea   eax, dword ptr
00382F81    BA E4303800   mov   edx, 003830E4
00382F86    E8 9910FFFF   call    00374024
00382F8B    8B45 F8         mov   eax, dword ptr          ; //小于8位则转到此处
00382F8E    E8 8910FFFF   call    0037401C
00382F93    83F8 08         cmp   eax, 8
00382F96^ 7C E6         jl      short 00382F7E
00382F98    EB 0D         jmp   short 00382FA7
00382F9A    8D45 FC         lea   eax, dword ptr
00382F9D    BA E4303800   mov   edx, 003830E4
00382FA2    E8 7D10FFFF   call    00374024
00382FA7    8B45 FC         mov   eax, dword ptr          ; //常量KEY的长度大于或等于8位则转到此处,送机器码
00382FAA    E8 6D10FFFF   call    0037401C                         ; //取机器码长度
00382FAF    25 07000080   and   eax, 80000007                  ; //长度跟80000007作“与”运算
00382FB4    79 05         jns   short 00382FBB                   ; //JNS    符号位为 "0" 时转移
00382FB6    48            dec   eax
00382FB7    83C8 F8         or      eax, FFFFFFF8
00382FBA    40            inc   eax
00382FBB    85C0            test    eax, eax                         ; //EAX是否为0
00382FBD^ 75 DB         jnz   short 00382F9A                   ; //不为0则跳
00382FBF    33DB            xor   ebx, ebx
00382FC1    8D45 DC         lea   eax, dword ptr
00382FC4    8B55 F8         mov   edx, dword ptr          ; //送常量
00382FC7    8A141A          mov   dl, byte ptr
00382FCA    8810            mov   byte ptr , dl
00382FCC    43            inc   ebx
00382FCD    40            inc   eax
00382FCE    83FB 08         cmp   ebx, 8
00382FD1^ 75 F1         jnz   short 00382FC4                   ; //循环取常量的前8位,作为KEY
00382FD3    6A 0F         push    0F
00382FD5    B9 80683800   mov   ecx, 00386880
00382FDA    8D45 DC         lea   eax, dword ptr
00382FDD    BA 07000000   mov   edx, 7
00382FE2    E8 EDFAFFFF   call    00382AD4
00382FE7    8D45 D8         lea   eax, dword ptr
00382FEA    E8 910DFFFF   call    00373D80
00382FEF    8B45 FC         mov   eax, dword ptr
00382FF2    E8 2510FFFF   call    0037401C
00382FF7    85C0            test    eax, eax
00382FF9    79 03         jns   short 00382FFE
00382FFB    83C0 07         add   eax, 7
00382FFE    C1F8 03         sar   eax, 3
00383001    48            dec   eax
00383002    85C0            test    eax, eax
00383004    7C 65         jl      short 0038306B
00383006    40            inc   eax
00383007    8945 D0         mov   dword ptr , eax
0038300A    C745 D4 0000000>mov   dword ptr , 0
00383011    33DB            xor   ebx, ebx
00383013    8D45 EC         lea   eax, dword ptr
00383016    8B55 D4         mov   edx, dword ptr
00383019    C1E2 03         shl   edx, 3
0038301C    03D3            add   edx, ebx
0038301E    8B4D FC         mov   ecx, dword ptr
00383021    8A1411          mov   dl, byte ptr
00383024    8810            mov   byte ptr , dl
00383026    43            inc   ebx
00383027    40            inc   eax
00383028    83FB 08         cmp   ebx, 8
0038302B^ 75 E9         jnz   short 00383016                   ; //循环取机器码8位进行DES标准加密
0038302D    8D45 E4         lea   eax, dword ptr
00383030    50            push    eax
00383031    6A 07         push    7
00383033    8D55 EC         lea   edx, dword ptr
00383036    B9 07000000   mov   ecx, 7
0038303B    33C0            xor   eax, eax
0038303D    E8 EAFCFFFF   call    00382D2C
00383042    BB 08000000   mov   ebx, 8
00383047    8D75 E4         lea   esi, dword ptr
0038304A    8D45 CC         lea   eax, dword ptr
0038304D    8A16            mov   dl, byte ptr
0038304F    E8 140FFFFF   call    00373F68
00383054    8B55 CC         mov   edx, dword ptr
00383057    8D45 D8         lea   eax, dword ptr
0038305A    E8 C50FFFFF   call    00374024
0038305F    46            inc   esi
00383060    4B            dec   ebx
00383061^ 75 E7         jnz   short 0038304A
00383063    FF45 D4         inc   dword ptr
00383066    FF4D D0         dec   dword ptr
00383069^ 75 A6         jnz   short 00383011
0038306B    8B45 F4         mov   eax, dword ptr
0038306E    8B55 D8         mov   edx, dword ptr
00383071    E8 5E0DFFFF   call    00373DD4
00383076    33C0            xor   eax, eax
00383078    5A            pop   edx
00383079    59            pop   ecx
0038307A    59            pop   ecx
0038307B    64:8910         mov   dword ptr fs:, edx
0038307E    68 A8303800   push    003830A8
00383083    8D45 CC         lea   eax, dword ptr
00383086    E8 F50CFFFF   call    00373D80
0038308B    8D45 D8         lea   eax, dword ptr
0038308E    E8 ED0CFFFF   call    00373D80
00383093    8D45 F8         lea   eax, dword ptr
00383096    BA 02000000   mov   edx, 2
0038309B    E8 040DFFFF   call    00373DA4
003830A0    C3            retn
003830A1^ E9 5206FFFF   jmp   003736F8
003830A6^ EB DB         jmp   short 00383083
003830A8    5E            pop   esi
003830A9    5B            pop   ebx
003830AA    8BE5            mov   esp, ebp
003830AC    5D            pop   ebp
003830AD    C3            retn


算法总结:

1、以SalaKey2005的前8位“SalaKey2”作为密钥KEY,对机器码(含中间的“-”)进行DES标准加密,每次加密8位,
2、加密后的字符串跟32,16比较(DES算法的结果长度都是16的倍数),
3、若加密后的字符串大于32位,则取第1、2、7、8、17位作为注册码第一段,第18、23、24、29、30位作为注册码第二段,第35、   36、41、42、47位作为注册码第三段,
4、若加密后的字符串小于等于32位且大于16位,则取第1、2、5、6、11位作为注册码第一段,第12、15、16、19、20作为注册码第   二段,第23、24、27、28、31作为注册码第三段,
5、若加密后的字符串小于等于16位,则取1、3、5、7、9、11、13、15作为注册码;

glts 发表于 2007-10-24 19:32:10

分析得很详细,学习下。

网络断魂 发表于 2007-10-24 20:51:36

谢谢glts抬举,一定继续努力
页: [1]
查看完整版本: A1档案管理系统算法简单分析(高手飞过)