本帖最后由 H夜 于 2019-6-6 18:25 编辑
【文章标题】:易速快递单打印软件算法分析[新手思路]
【文章作者】:pj2020
【软件名称】:易速快递单打印软件1.65
【软件大小】:7.55MB
【保护方式】:注册码
【下载地址】:自己搜索
【加壳方式】:无壳
【编写工具】:Borland Delphi 6.0 -7.0
【破解工具】:PEID、OD
【操作平台】:盗版XP3
【作者声明】:只是感兴趣,没有其他目的
【软件简介】:易速快递单打印软件是一款简单好用的快递单打印软件,即有申通、中通、圆通等现成的快递单模板供您选择,您也可以根据自己手中的快递单自己动手设计模板并进行保存,格式底图可以更换成您手中的快递单图片。
【思路方法】
写在前面:
易速快递单打印软件在本坛早已有人破解了,破解方法包括爆破、追码、内存注册机,能做出内存注册机,很明显是明码比较,所以这里不再讨论这些方法,本文只探讨算法部分。因前面的步骤比较简单,在此不再啰嗦,直接进入算法分部:(以机器码“WD-WCC2EL8ZELFA”为例)
[Asm] 纯文本查看 复制代码 00697A68 |. E8 17010000 call kdd.00697B84 ; //进入算法部分
00697B84 /$ 55 push ebp
00697B85 |. 8BEC mov ebp,esp
00697B87 |. 51 push ecx
00697B88 |. B9 04000000 mov ecx,0x4
00697B8D |> 6A 00 /push 0x0
00697B8F |. 6A 00 |push 0x0
00697B91 |. 49 |dec ecx
00697B92 |.^ 75 F9 \jnz short kdd.00697B8D
00697B94 |. 51 push ecx
00697B95 |. 874D FC xchg [local.1],ecx
00697B98 |. 53 push ebx
00697B99 |. 56 push esi
00697B9A |. 57 push edi
00697B9B |. 8BF9 mov edi,ecx
00697B9D |. 8955 FC mov [local.1],edx ; 取机器码 "WD-WCC2EL8ZELFA"
00697BA0 |. 8B45 FC mov eax,[local.1]
00697BA3 |. E8 58D7D6FF call kdd.00405300
00697BA8 |. 33C0 xor eax,eax
00697BAA |. 55 push ebp
00697BAB |. 68 457D6900 push kdd.00697D45
00697BB0 |. 64:FF30 push dword ptr fs:[eax]
00697BB3 |. 64:8920 mov dword ptr fs:[eax],esp
00697BB6 |. 8BC7 mov eax,edi
00697BB8 |. E8 83D2D6FF call kdd.00404E40
00697BBD |. 8B45 FC mov eax,[local.1]
00697BC0 |. E8 4BD5D6FF call kdd.00405110
00697BC5 |. 8BF0 mov esi,eax ; 机器码长度eax=0xF
00697BC7 |. 85F6 test esi,esi
00697BC9 |. /7E 26 jle short kdd.00697BF1 ; 机器码为空跳走(有这种情况吗?)
00697BCB |. BB 01000000 mov ebx,0x1
00697BD0 |> 8D4D EC /lea ecx,[local.5]
00697BD3 |. 8B45 FC |mov eax,[local.1] ; 机器码: (ASCII "WD-WCC2EL8ZELFA")
00697BD6 |. 0FB64418 FF |movzx eax,byte ptr ds:[eax+ebx-0x1] ; 依次取机器码ASC码:ds:[01F20930]=57 ('W')
00697BDB |. 33D2 |xor edx,edx
00697BDD |. E8 C628D7FF |call kdd.0040A4A8
00697BE2 |. 8B55 EC |mov edx,[local.5] ;
00697BE5 |. 8D45 F8 |lea eax,[local.2]
00697BE8 |. E8 2BD5D6FF |call kdd.00405118
00697BED |. 43 |inc ebx
00697BEE |. 4E |dec esi
00697BEF |.^ 75 DF \jnz short kdd.00697BD0
00697BF1 |> 8B45 F8 mov eax,[local.2] ; 机器码ASC码连成新名: (ASCII "57442D57434332454C385A454C4641")
00697BF4 |. E8 17D5D6FF call kdd.00405110
00697BF9 |. 8BF0 mov esi,eax ; 新名长度eax=0x1E
00697BFB |. 85F6 test esi,esi
00697BFD |. /7E 2C jle short kdd.00697C2B ; 机器码为空跳走(有这种情况吗?)
00697BFF |. BB 01000000 mov ebx,0x1
00697C04 |> 8B45 F8 /mov eax,[local.2] ; 新名: (ASCII "57442D57434332454C385A454C4641")
00697C07 |. E8 04D5D6FF |call kdd.00405110
00697C0C |. 2BC3 |sub eax,ebx ; 新名长度1E-ebx(计数器)
00697C0E |. 8B55 F8 |mov edx,[local.2]
00697C11 |. 8A1402 |mov dl,byte ptr ds:[edx+eax] ; 倒序取新名ASC码:31 ('1')/34 ('4')/36 ('6')/...
00697C14 |. 8D45 E8 |lea eax,[local.6]
00697C17 |. E8 0CD4D6FF |call kdd.00405028
00697C1C |. 8B55 E8 |mov edx,[local.6]
00697C1F |. 8D45 F4 |lea eax,[local.3]
00697C22 |. E8 F1D4D6FF |call kdd.00405118
00697C27 |. 43 |inc ebx
00697C28 |. 4E |dec esi
00697C29 |.^ 75 D9 \jnz short kdd.00697C04
00697C2B |> 8D45 F8 lea eax,[local.2]
00697C2E |. 50 push eax
00697C2F |. B9 04000000 mov ecx,0x4 ; ecx=0x4,共取4位
00697C34 |. BA 01000000 mov edx,0x1 ; edx=0x1,从第1位开始
00697C39 |. 8B45 F4 mov eax,[local.3] ; 新名倒序: (ASCII "1464C454A583C45423343475D24475")
00697C3C |. E8 2FD7D6FF call kdd.00405370
00697C41 |. 8D45 F4 lea eax,[local.3]
00697C44 |. 50 push eax
00697C45 |. B9 04000000 mov ecx,0x4 ; ecx=0x4,共取4位
00697C4A |. BA 05000000 mov edx,0x5 ; edx=0x5,从第5位开始
00697C4F |. 8B45 F4 mov eax,[local.3] ; 新名倒序: (ASCII "1464C454A583C45423343475D24475")
00697C52 |. E8 19D7D6FF call kdd.00405370
00697C57 |. 8B45 F8 mov eax,[local.2] ; 取新名倒序第1-4位, (ASCII "1464")
00697C5A |. E8 B1D4D6FF call kdd.00405110
00697C5F |. 83F8 04 cmp eax,0x4 ; 是否够4位?eax=0x4
00697C62 |. 7D 2F jge short kdd.00697C93 ; 够不够4位?够跳走,不够继续
00697C64 |. 8B45 F8 mov eax,[local.2]
00697C67 |. E8 A4D4D6FF call kdd.00405110
00697C6C |. 8BD8 mov ebx,eax
00697C6E |. 83FB 03 cmp ebx,0x3
00697C71 |. /7F 20 jg short kdd.00697C93 ; 是否大于3位?大于跳走,否则继续
00697C73 |> |8D4D E4 /lea ecx,[local.7]
00697C76 |. |8BC3 |mov eax,ebx ; eax=第1-4位的实际位数
00697C78 |. |C1E0 02 |shl eax,0x2 ; 实际位数作左移2位(根据第1-4位的实际位数来左移)
00697C7B |. |33D2 |xor edx,edx ; edx清零
00697C7D |. E8 2628D7FF |call kdd.0040A4A8
00697C82 |. 8B55 E4 |mov edx,[local.7]
00697C85 |. 8D45 F8 |lea eax,[local.2]
00697C88 |. E8 8BD4D6FF |call kdd.00405118
00697C8D |. 43 |inc ebx
00697C8E |. 83FB 04 |cmp ebx,0x4
00697C91 |.^ 75 E0 \jnz short kdd.00697C73
00697C93 |> 8B45 F4 mov eax,[local.3] ; 取新名倒序第5-8位, (ASCII "C454")
00697C96 |. E8 75D4D6FF call kdd.00405110
00697C9B |. 83F8 04 cmp eax,0x4 ; 是否够4位?eax=0x4
00697C9E |. /7D 2F jge short kdd.00697CCF ; 够不够4位?够跳走,不够继续
00697CA0 |. |8B45 F4 mov eax,[local.3] ; 取新名倒序第5-8位
00697CA3 |. |E8 68D4D6FF call kdd.00405110
00697CA8 |. |8BD8 mov ebx,eax
00697CAA |. |83FB 03 cmp ebx,0x3
00697CAD |. |7F 20 jg short kdd.00697CCF ; 是否大于3位?大于跳走,否则继续
00697CAF |> |8D4D E0 /lea ecx,[local.8]
00697CB2 |. |8BC3 |mov eax,ebx ; eax=第5-8位的实际位数
00697CB4 |. |C1E0 02 |shl eax,0x2 ; 实际位数作左移2位(根据第5-8位的实际位数来左移)
00697CB7 |. |33D2 |xor edx,edx ; edx清零
00697CB9 |. |E8 EA27D7FF |call kdd.0040A4A8
00697CBE |. |8B55 E0 |mov edx,[local.8]
00697CC1 |. |8D45 F4 |lea eax,[local.3]
00697CC4 |. |E8 4FD4D6FF |call kdd.00405118
00697CC9 |. |43 |inc ebx
00697CCA |. |83FB 04 |cmp ebx,0x4
00697CCD |.^|75 E0 \jnz short kdd.00697CAF ; 够4位了吗?不够继续
00697CCF |> 8D45 F0 lea eax,[local.4]
00697CD2 |. BA 5C7D6900 mov edx,kdd.00697D5C ; 固定字串:KDD24588d54c
00697CD7 |. E8 FCD1D6FF call kdd.00404ED8
00697CDC |. 8D45 DC lea eax,[local.9]
00697CDF |. 50 push eax
00697CE0 |. B9 04000000 mov ecx,0x4 ; ecx=0x4,共取4位
00697CE5 |. BA 01000000 mov edx,0x1 ; edx=0x1,从第1位开始
00697CEA |. 8B45 F0 mov eax,[local.4]
00697CED |. E8 7ED6D6FF call kdd.00405370 ;
00697CF2 |. FF75 DC push [local.9] ; 取固定字串第1-4位:(ASCII "KDD2")
00697CF5 |. 68 747D6900 push kdd.00697D74 ; 用“-”号连接
00697CFA |. FF75 F8 push [local.2] ; 新名倒序第1-4位, (ASCII "1464")
00697CFD |. 8D45 D8 lea eax,[local.10]
00697D00 |. 50 push eax
00697D01 |. B9 05000000 mov ecx,0x5 ; ecx=0x5,共取5位
00697D06 |. BA 05000000 mov edx,0x5 ; edx=0x5,从第5位开始
00697D0B |. 8B45 F0 mov eax,[local.4]
00697D0E |. E8 5DD6D6FF call kdd.00405370 ;
00697D13 |. FF75 D8 push [local.10] ; 取固定字串第5-9位:(ASCII "4588d")
00697D16 |. 68 747D6900 push kdd.00697D74 ; 用“-”号连接
00697D1B |. FF75 F4 push [local.3] ; 新名倒序第5-8位, (ASCII "C454")
00697D1E |. 8BC7 mov eax,edi
00697D20 |. BA 06000000 mov edx,0x6 ; edx=0x6
00697D25 |. E8 A6D4D6FF call kdd.004051D0
00697D2A |. 33C0 xor eax,eax
00697D2C |. 5A pop edx ; 0012EC08
00697D2D |. 59 pop ecx ; 0012EC08
00697D2E |. 59 pop ecx ; 0012EC08
00697D2F |. 64:8910 mov dword ptr fs:[eax],edx
00697D32 |. 68 4C7D6900 push kdd.00697D4C
00697D37 |> 8D45 D8 lea eax,[local.10]
00697D3A |. BA 0A000000 mov edx,0xA
00697D3F |. E8 20D1D6FF call kdd.00404E64
00697D44 \. C3 retn
算法总结:(以机器码“WD-WCC2EL8ZELFA”为例)注册码根据机器码和固定字串计算得出:
当机器码为4位数或以上时: 机器码各ASC码相连后57442D57434332454C385A454C4641取倒序:1464C454A583C45423343475D24475 取倒序第1-4位,记为A:"1464" 取倒序第5-8位,记为B:"C454" 取固定字串KDD24588d54c第1-4位,记为C:"KDD2" 取固定字串KDD24588d54c第5-9位:记为D:"4588d" 注册码=C-AD-B,注册码为:"KDD2-14644588d-C454" 当机器码为3位数时:新名倒序后第5-8位实际上只有第5-6位,那么第7-8位必须通过两次左移2位来获取:第1次左移为2(第5-8位的实际位数)左移2位=8(作为第7位),第2次左移为3(第5-8位的实际位数+1)左移2位=C(作为第8位)。结果第7-8位为“8C”。 当机器码为2位数时:新名倒序后第5-8位实际上没有,那么第5-8位必须通过四次左移2位来获取:第1次左移为0(第5-8位的实际位数)左移2位=1(作为第5位);第2次左移为1(第5-8位的实际位数+1)左移2位=4(作为第6位);第3次左移为2(第5-8位的实际位数+2)左移2位=8(作为第7位);第4次左移为3(第5-8位的实际位数+3)左移2位=C(作为第8位)。结果第5-8位为“048C”。 当机器码为1位数时:新名倒序后第1-4位只有第1-2位,那么第3-4位必须通过两次左移2位来获取:第1次左移为2(第1-2位的实际位数)左移2位=8(作为第3位),第2次左移为3(第1-2位的实际位数+1)左移2位=C(作为第4位)。结果第3-4位为“8C”。 而第5-8位实际上没有,第5-8位必须通过四次左移2位来获取:第1次左移为0(第5-8位的实际位数)左移2位=1(作为第5位);第2次左移为1(第5-8位的实际位数+1)左移2位=4(作为第6位);第3次左移为2(第5-8位的实际位数+2)左移2位=8(作为第7位);第4次左移为3(第5-8位的实际位数+3)左移2位=C(作为第8位)。结果第5-8位为“048C”。 当机器码为0位数时:即机器码为空时,新名倒序后第1-8位均为零,所以在算第1-4及5-8位时,均是从0、1、2、3开始左移2位各四次,最终第1-4及5-8位结果均为:“048C”。
写在后面:本软件为明码比较,就算小白中的小白也很容易追到注册码,但若以为追到码就成功了,那有可能你就错了,听说该软件有暗桩。至于是否真有暗桩,有何暗桩,又如何去暗桩,那就不在本文的分析范围内了,因本文旨在探讨算法,别无其他。对于那些的确需要这个软件的朋友,还是建议去购买正版,支持一下国软!
算法注册机:不提供!欢迎购买正版,支持国软! |