佳宜进销存管理软件--简单注册分析
【破解作者】 jsliyangsj
【作者邮箱】 sjcrack@yahoo.com.cn
【使用工具】 peid OllyDbg1.10
【破解平台】 Winxp
【软件名称】 佳宜进销存管理软件
【软件地址】 http://www.jyitsoft.com/
【编写语言】 Borland Delphi 6.0 - 7.0
    
过程:
………………………………………………………………………………………………………………………………
00695777    .  51 push ecx
00695778    .  53 push ebx
00695779    .  56 push esi
0069577A    .  57 push edi
0069577B    .  89>mov dword ptr ss:[ebp-4],eax
0069577E    .  33>xor eax,eax
00695780    .  55 push ebp
00695781    .  68>push JxcAcces.006959E6
00695786    .  64>push dword ptr fs:[eax]
00695789    .  64>mov dword ptr fs:[eax],esp
0069578C    .  8D>lea edx,dword ptr ss:[ebp-10]
0069578F    .  8B>mov eax,dword ptr ss:[ebp-4]
00695792    .  8B>mov eax,dword ptr ds:[eax+304]
00695798    .  E8>call JxcAcces.0044F070               ;  取得用户名  返回位数
0069579D    .  8B>mov eax,dword ptr ss:[ebp-10]
006957A0    .  8D>lea edx,dword ptr ss:[ebp-C]
006957A3    .  E8>call JxcAcces.00409720
006957A8    .  83>cmp dword ptr ss:[ebp-C],0           ;  检查用户名是否输入
006957AC    .  75>jnz short JxcAcces.006957D0
006957AE    .  6A>push 0
006957B0    .  68>push JxcAcces.006959F4
006957B5    .  E8>call <jmp.&PunUnitLib.ShowMess>
006957BA    .  8B>mov eax,dword ptr ss:[ebp-4]
006957BD    .  8B>mov eax,dword ptr ds:[eax+304]
006957C3    .  8B>mov edx,dword ptr ds:[eax]
006957C5    .  FF>call dword ptr ds:[edx+C0]
006957CB    .  E9>jmp JxcAcces.00695981
006957D0    >  8D>lea edx,dword ptr ss:[ebp-18]
006957D3    .  8B>mov eax,dword ptr ss:[ebp-4]
006957D6    .  8B>mov eax,dword ptr ds:[eax+2FC]
006957DC    .  E8>call JxcAcces.0044F070               ;  取得输入码  返回位数
006957E1    .  8B>mov eax,dword ptr ss:[ebp-18]
006957E4    .  8D>lea edx,dword ptr ss:[ebp-14]
006957E7    .  E8>call JxcAcces.00409720
006957EC    .  83>cmp dword ptr ss:[ebp-14],0          ;  检查是否输入
006957F0    .  75>jnz short JxcAcces.00695814
006957F2    .  6A>push 0
006957F4    .  68>push JxcAcces.00695A08
006957F9    .  E8>call <jmp.&PunUnitLib.ShowMess>      ;  错误窗口,授权号不能为空
006957FE    .  8B>mov eax,dword ptr ss:[ebp-4]
00695801    .  8B>mov eax,dword ptr ds:[eax+2FC]
00695807    .  8B>mov edx,dword ptr ds:[eax]
00695809    .  FF>call dword ptr ds:[edx+C0]
0069580F    .  E9>jmp JxcAcces.00695981
00695814    >  A1>mov eax,dword ptr ds:[6A870C]
00695819    .  8B>mov eax,dword ptr ds:[eax]           ;  得到一个固定字符串C26P-Q618
0069581B    .  E8>call JxcAcces.00404FD0
00695820    .  50 push eax
00695821    .  8D>lea edx,dword ptr ss:[ebp-1C]
00695824    .  8B>mov eax,dword ptr ss:[ebp-4]
00695827    .  8B>mov eax,dword ptr ds:[eax+2F4]
0069582D    .  E8>call JxcAcces.0044F070               ;  计算出机器码  返回字符串位数
00695832    .  8B>mov eax,dword ptr ss:[ebp-1C]        ;  取出机器码字符形式
00695835    .  E8>call JxcAcces.00404FD0
0069583A    .  50 push eax                             ;  压入机器码准备处理
0069583B    .  E8>call <jmp.&PunUnitLib.GetRegPass>    ;  看名称就知道,到了关键的CALL 进入
00695840    .  8B>mov edx,eax                          ;  结果得到字符窜4组  这个就是真正的注册码
00695842    .  8D>lea eax,dword ptr ss:[ebp-8]
00695845    .  E8>call JxcAcces.00404D10
0069584A    .  8D>lea edx,dword ptr ss:[ebp-24]
0069584D    .  8B>mov eax,dword ptr ss:[ebp-4]
00695850    .  8B>mov eax,dword ptr ds:[eax+2FC]
00695856    .  E8>call JxcAcces.0044F070
0069585B    .  8B>mov eax,dword ptr ss:[ebp-24]
0069585E    .  8D>lea edx,dword ptr ss:[ebp-20]
00695861    .  E8>call JxcAcces.00409720
00695866    .  8B>mov eax,dword ptr ss:[ebp-20]
00695869    .  8B>mov edx,dword ptr ss:[ebp-8]
0069586C    .  E8>call JxcAcces.00404F1C               ;  输入码与注册码比较了
00695871    .  0F>jnz JxcAcces.00695975                ;  关键跳转
00695877    .  33>xor eax,eax
00695879    .  55 push ebp
0069587A    .  68>push JxcAcces.00695961
0069587F    .  64>push dword ptr fs:[eax]
00695882    .  64>mov dword ptr fs:[eax],esp
00695885    .  B2>mov dl,1
00695887    .  A1>mov eax,dword ptr ds:[473094]
0069588C    .  E8>call JxcAcces.00473200
00695891    .  8B>mov ebx,eax
00695893    .  BA>mov edx,80000002
00695898    .  8B>mov eax,ebx
0069589A    .  E8>call JxcAcces.004732DC
0069589F    .  B1>mov cl,1
006958A1    .  8B>mov edx,dword ptr ds:[6A7D20]        ;  JxcAcces.006956C4
006958A7    .  8B>mov eax,ebx
006958A9    .  E8>call JxcAcces.00473420
006958AE    .  8D>lea edx,dword ptr ss:[ebp-28]
006958B1    .  8B>mov eax,dword ptr ss:[ebp-4]
006958B4    .  8B>mov eax,dword ptr ds:[eax+304]
006958BA    .  E8>call JxcAcces.0044F070
006958BF    .  8B>mov ecx,dword ptr ss:[ebp-28]
006958C2    .  BA>mov edx,JxcAcces.00695A30            ;  ASCII "UserName"
006958C7    .  8B>mov eax,ebx
006958C9    .  E8>call JxcAcces.004735BC
006958CE    .  8D>lea edx,dword ptr ss:[ebp-30]
006958D1    .  8B>mov eax,dword ptr ss:[ebp-4]
006958D4    .  8B>mov eax,dword ptr ds:[eax+2F4]
006958DA    .  E8>call JxcAcces.0044F070
006958DF    .  8B>mov eax,dword ptr ss:[ebp-30]
006958E2    .  E8>call JxcAcces.00404FD0
006958E7    .  50 push eax
006958E8    .  E8>call <jmp.&PunUnitLib.SavePass>
006958ED    .  8B>mov edx,eax
006958EF    .  8D>lea eax,dword ptr ss:[ebp-2C]
006958F2    .  E8>call JxcAcces.00404D10
006958F7    .  8B>mov ecx,dword ptr ss:[ebp-2C]
006958FA    .  BA>mov edx,JxcAcces.00695A44            ;  ASCII "SignCode"
006958FF    .  8B>mov eax,ebx
00695901    .  E8>call JxcAcces.004735BC
00695906    .  8B>mov eax,dword ptr ss:[ebp-8]
00695909    .  E8>call JxcAcces.00404FD0
0069590E    .  50 push eax
0069590F    .  E8>call <jmp.&PunUnitLib.SavePass>
00695914    .  8B>mov edx,eax
00695916    .  8D>lea eax,dword ptr ss:[ebp-34]
00695919    .  E8>call JxcAcces.00404D10
0069591E    .  8B>mov ecx,dword ptr ss:[ebp-34]
00695921    .  BA>mov edx,JxcAcces.00695A58            ;  ASCII "RegCode"
00695926    .  8B>mov eax,ebx
00695928    .  E8>call JxcAcces.004735BC
0069592D    .  8B>mov eax,ebx
0069592F    .  E8>call JxcAcces.00403C2C
00695934    .  6A>push 0
00695936    .  68>push JxcAcces.00695A60
0069593B    .  E8>call <jmp.&PunUnitLib.ShowMess>      ;  成功信息!!!!!
00695940    .  A1>mov eax,dword ptr ds:[6A8708]
00695945    .  C7>mov dword ptr ds:[eax],2
0069594B    .  A1>mov eax,dword ptr ds:[6A84AC]
00695950    .  8B>mov eax,dword ptr ds:[eax]
00695952    .  E8>call JxcAcces.00470C6C
00695957    .  33>xor eax,eax
00695959    .  5A pop edx
0069595A    .  59 pop ecx
0069595B    .  59 pop ecx
0069595C    .  64>mov dword ptr fs:[eax],edx
0069595F    .  EB>jmp short JxcAcces.00695981
00695961    .^ E9>jmp JxcAcces.0040410C
00695966    .  8B>mov eax,dword ptr ss:[ebp-4]
00695969    .  E8>call JxcAcces.0046D3BC
0069596E    .  E8>call JxcAcces.00404538
00695973    .  EB>jmp short JxcAcces.00695981
00695975    >  6A>push 3
00695977    .  68>push JxcAcces.00695A84
0069597C    .  E8>call <jmp.&PunUnitLib.ShowMess>      ;  注册失败!!!!!
00695981    >  33>xor eax,eax
…………………………………………………………………………………………………………………………
进入006957F9    .  E8>call <jmp.&PunUnitLib.ShowMess>
…………………………………………………………………………………………………………………………
008D9040   |.  64>mov dword ptr fs:[eax],esp
008D9043   |.  8D>lea eax,dword ptr ss:[ebp-14]
008D9046   |.  E8>call PunUnitL.008645B0
008D904B   |.  8D>lea eax,dword ptr ss:[ebp-10]
008D904E   |.  8B>mov edx,dword ptr ss:[ebp+8]         ;  取出机器吗
008D9051   |.  E8>call PunUnitL.008647A0               ;  比较机器吗是否为0
008D9056   |.  8B>mov eax,dword ptr ss:[ebp-10]
008D9059   |.  E8>call PunUnitL.00864868               ;  机器码的位数
008D905E   |.  8B>mov esi,eax
008D9060   |.  85>test esi,esi
008D9062   |.  7E>jle short PunUnitL.008D908A          ;  注册码位数次循环
008D9064   |.  BB>mov ebx,1
008D9069   |>  8D>/lea ecx,dword ptr ss:[ebp-18]
008D906C   |.  8B>|mov eax,dword ptr ss:[ebp-10]       ;  取出机器吗
008D906F   |.  0F>|movzx eax,byte ptr ds:[eax+ebx-1]   ;  依次取机器码的每一位ASCII
008D9074   |.  33>|xor edx,edx
008D9076   |.  E8>|call PunUnitL.00869674              ;  把ASCII转化为字符量
008D907B   |.  8B>|mov edx,dword ptr ss:[ebp-18]       ;  得到转化的结果,是字符了
008D907E   |.  8D>|lea eax,dword ptr ss:[ebp-4]
008D9081   |.  E8>|call PunUnitL.00864870              ;  一次一次字符组合起来,注册码一共8位,处理后成为16位字符
008D9086   |.  43 |inc ebx
008D9087   |.  4E |dec esi
008D9088   |.^ 75>\jnz short PunUnitL.008D9069         ;  这个循环把8位输入码的ASCII收集组合起来
008D908A   |>  8B>mov eax,dword ptr ss:[ebp-4]         ;  得到上面组合后的地址
008D908D   |.  E8>call PunUnitL.00864868               ;  得到组合后的位数
008D9092   |.  8B>mov esi,eax
008D9094   |.  85>test esi,esi
008D9096   |.  7E>jle short PunUnitL.008D90C4
008D9098   |.  BB>mov ebx,1
008D909D   |>  8B>/mov eax,dword ptr ss:[ebp-4]        ;  得到组合后全部字符
008D90A0   |.  E8>|call PunUnitL.00864868              ;  得到位数
008D90A5   |.  2B>|sub eax,ebx                         ;  每次减去1
008D90A7   |.  8B>|mov edx,dword ptr ss:[ebp-4]        ;  再次得到组合后的字符
008D90AA   |.  8A>|mov dl,byte ptr ds:[edx+eax]        ;  依次从最后一位得到组合后的每以为字符
008D90AD   |.  8D>|lea eax,dword ptr ss:[ebp-1C]
008D90B0   |.  E8>|call PunUnitL.00864790
008D90B5   |.  8B>|mov edx,dword ptr ss:[ebp-1C]       ;  得到结果地址
008D90B8   |.  8D>|lea eax,dword ptr ss:[ebp-8]
008D90BB   |.  E8>|call PunUnitL.00864870              ;  收集组合!!
008D90C0   |.  43 |inc ebx
008D90C1   |.  4E |dec esi
008D90C2   |.^ 75>\jnz short PunUnitL.008D909D         ;  这一段把上面组合后的字符反过来储存在EBP-8中
008D90C4   |>  8D>lea eax,dword ptr ss:[ebp-4]
008D90C7   |.  50 push eax
008D90C8   |.  B9>mov ecx,4
008D90CD   |.  BA>mov edx,1
008D90D2   |.  8B>mov eax,dword ptr ss:[ebp-8]         ;  得到刚反过来的字符窜
008D90D5   |.  E8>call PunUnitL.00864AC0               ;  得到前4位放在EBP-4
008D90DA   |.  8D>lea eax,dword ptr ss:[ebp-8]
008D90DD   |.  50 push eax
008D90DE   |.  B9>mov ecx,4
008D90E3   |.  BA>mov edx,5
008D90E8   |.  8B>mov eax,dword ptr ss:[ebp-8]         ;  得到刚反过来的字符窜
008D90EB   |.  E8>call PunUnitL.00864AC0               ;  又取了5-8位
008D90F0   |.  8B>mov eax,dword ptr ss:[ebp-4]
008D90F3   |.  E8>call PunUnitL.00864868               ;  位数
008D90F8   |.  83>cmp eax,4
008D90FB   |.  7D>jge short PunUnitL.008D912C
008D90FD   |.  8B>mov eax,dword ptr ss:[ebp-4]
008D9100   |.  E8>call PunUnitL.00864868
008D9105   |.  8B>mov ebx,eax
008D9107   |.  83>cmp ebx,3
008D910A   |.  7F>jg short PunUnitL.008D912C
008D910C   |>  8D>/lea ecx,dword ptr ss:[ebp-20]
008D910F   |.  8B>|mov eax,ebx
008D9111   |.  C1>|shl eax,2
008D9114   |.  33>|xor edx,edx
008D9116   |.  E8>|call PunUnitL.00869674
008D911B   |.  8B>|mov edx,dword ptr ss:[ebp-20]
008D911E   |.  8D>|lea eax,dword ptr ss:[ebp-4]
008D9121   |.  E8>|call PunUnitL.00864870
008D9126   |.  43 |inc ebx
008D9127   |.  83>|cmp ebx,4
008D912A   |.^ 75>\jnz short PunUnitL.008D910C
008D912C   |>  8B>mov eax,dword ptr ss:[ebp-8]
008D912F   |.  E8>call PunUnitL.00864868               ;  得到位数
008D9134   |.  83>cmp eax,4
008D9137   |.  7D>jge short PunUnitL.008D9168
008D9139   |.  8B>mov eax,dword ptr ss:[ebp-8]
008D913C   |.  E8>call PunUnitL.00864868
008D9141   |.  8B>mov ebx,eax
008D9143   |.  83>cmp ebx,3
008D9146   |.  7F>jg short PunUnitL.008D9168
008D9148   |>  8D>/lea ecx,dword ptr ss:[ebp-24]
008D914B   |.  8B>|mov eax,ebx
008D914D   |.  C1>|shl eax,2
008D9150   |.  33>|xor edx,edx
008D9152   |.  E8>|call PunUnitL.00869674
008D9157   |.  8B>|mov edx,dword ptr ss:[ebp-24]
008D915A   |.  8D>|lea eax,dword ptr ss:[ebp-8]
008D915D   |.  E8>|call PunUnitL.00864870
008D9162   |.  43 |inc ebx
008D9163   |.  83>|cmp ebx,4
008D9166   |.^ 75>\jnz short PunUnitL.008D9148
008D9168   |>  8D>lea eax,dword ptr ss:[ebp-28]
008D916B   |.  8B>mov edx,dword ptr ss:[ebp+C]         ;  得到固定C26P-Q618
008D916E   |.  E8>call PunUnitL.008647A0               ;  没什么
008D9173   |.  8B>mov eax,dword ptr ss:[ebp-28]
008D9176   |.  8D>lea edx,dword ptr ss:[ebp-C]
008D9179   |.  E8>call PunUnitL.0086955C
008D917E   |.  8D>lea eax,dword ptr ss:[ebp-2C]
008D9181   |.  50 push eax
008D9182   |.  B9>mov ecx,4
008D9187   |.  BA>mov edx,1
008D918C   |.  8B>mov eax,dword ptr ss:[ebp-C]
008D918F   |.  E8>call PunUnitL.00864AC0               ;  得到固定值的前4   C26P
008D9194   |.  FF>push dword ptr ss:[ebp-2C]
008D9197   |.  68>push PunUnitL.008D920C
008D919C   |.  FF>push dword ptr ss:[ebp-4]            ;  机器吗的计算出来的前4   4475
008D919F   |.  8D>lea eax,dword ptr ss:[ebp-30]
008D91A2   |.  50 push eax
008D91A3   |.  B9>mov ecx,5
008D91A8   |.  BA>mov edx,5
008D91AD   |.  8B>mov eax,dword ptr ss:[ebp-C]         ;  取固定字符串
008D91B0   |.  E8>call PunUnitL.00864AC0
008D91B5   |.  FF>push dword ptr ss:[ebp-30]           ;  固定字符的后5位 -Q618
008D91B8   |.  68>push PunUnitL.008D920C
008D91BD   |.  FF>push dword ptr ss:[ebp-8]            ;  取机器吗计算出来的5-8位
008D91C0   |.  8D>lea eax,dword ptr ss:[ebp-14]
008D91C3   |.  BA>mov edx,6
008D91C8   |.  E8>call PunUnitL.00864928               ;  组合前4位是固定字符穿第2组是机器吗计算出来的前4位第3组是固定字符后4位第4组是机器吗计算出来的5-8位
008D91CD   |.  8B>mov eax,dword ptr ss:[ebp-14]
008D91D0   |.  E8>call PunUnitL.00864A60
008D91D5   |.  8B>mov ebx,eax
008D91D7   |.  33>xor eax,eax
008D91D9   |.  5A pop edx
008D91DA   |.  59 pop ecx
008D91DB   |.  59 pop ecx
008D91DC   |.  64>mov dword ptr fs:[eax],edx
008D91DF   |.  68>push PunUnitL.008D91F9
008D91E4   |>  8D>lea eax,dword ptr ss:[ebp-30]
008D91E7   |.  BA>mov edx,0C
008D91EC   |.  E8>call PunUnitL.008645D4
008D91F1   \.  C3 retn

………………………………………………………………………………………………………………………………
进入008D91C8   |.  E8>call PunUnitL.00864928
………………………………………………………………………………………………………………………………
0086492B    .  52 push edx
0086492C    .  50 push eax
0086492D    .  89>mov ebx,edx
0086492F    .  31>xor edi,edi
00864931    .  8B>mov ecx,dword ptr ss:[esp+edx*4+14]  ;  固定值的前4位
00864935    .  85>test ecx,ecx
00864937    .  74>je short PunUnitL.0086493F
00864939    .  39>cmp dword ptr ds:[eax],ecx
0086493B    .  75>jnz short PunUnitL.0086493F
0086493D    .  89>mov edi,eax
0086493F    >  31>xor eax,eax
00864941    >  8B>mov ecx,dword ptr ss:[esp+edx*4+14]
00864945    .  85>test ecx,ecx
00864947    .  74>je short PunUnitL.00864952
00864949    .  03>add eax,dword ptr ds:[ecx-4]
0086494C    .  39>cmp edi,ecx
0086494E    .  75>jnz short PunUnitL.00864952
00864950    .  31>xor edi,edi
00864952    >  4A dec edx
00864953    .^ 75>jnz short PunUnitL.00864941          ;  这里得到要组合后的总位数
00864955    .  85>test edi,edi
00864957    .  74>je short PunUnitL.0086496D
00864959    .  89>mov edx,eax
0086495B    .  89>mov eax,edi
0086495D    .  8B>mov esi,dword ptr ds:[edi]
0086495F    .  8B>mov esi,dword ptr ds:[esi-4]
00864962    .  E8>call PunUnitL.00864BEC
00864967    .  57 push edi
00864968    .  03>add esi,dword ptr ds:[edi]
0086496A    .  4B dec ebx
0086496B    .  EB>jmp short PunUnitL.00864975
0086496D    >  E8>call PunUnitL.00864674
00864972    .  50 push eax                             ;  得到没有反过来的机器吗计算出来的枝
00864973    .  89>mov esi,eax
00864975    >  8B>mov eax,dword ptr ss:[esp+ebx*4+18]  ;  依次取得前面压入的4个字符串和一些“-”
00864979    .  89>mov edx,esi
0086497B    .  85>test eax,eax
0086497D    .  74>je short PunUnitL.00864989
0086497F    .  8B>mov ecx,dword ptr ds:[eax-4]
00864982    .  01>add esi,ecx
00864984    .  E8>call PunUnitL.00862918               ;  组合前4位是固定字符穿第2组是机器吗计算出来的前4位第3组是固定字符后4位第4组是机器吗计算出来的5-8位储存在ESP里面!!
00864989    >  4B dec ebx
0086498A    .^ 75>jnz short PunUnitL.00864975
0086498C    .  5A pop edx
0086498D    .  58 pop eax
0086498E    .  85>test edi,edi
00864990    .  75>jnz short PunUnitL.0086499E
………………………………………………………………………………………………………………………………
将8位机器码的每一位字符转化为2位16进制ASCII一共有16位,然后把16位数据,转化为字符形式
,再将16位字符反过来存储。,
注册码的形式一共有4组并用-连接,其中第1是固定的必为C26P,第3组也是固定的必为Q618,
最后注册码的形式为:
C26P-机器码计算出来的1-4位-Q618-机器码计算出来的5-8位
与用户名无关!!

算法比较简单,注册机不做了。