【文章标题】: **进销存管理软件 V3.85 企业版最新版算法分析
【文章作者】: CCDeath
【作者邮箱】: CCDeath@163.com
【软件名称】: **进销存管理软件 V3.85 企业版
【软件大小】: 4195 KB
【下载地址】: http://cnc.skycn.com/soft/14336.html
【保护方式】: 45天限制+注册码+启动NAG
【编写语言】: Borland Delphi 6.0 - 7.0
【使用工具】: OD+PEid
【操作平台】: 盗版中的最低版本XP
【作者声明】: 如果有人觉得好用,请支持共享..希望多多批评和建议...CCDeath再此感激不尽
--------------------------------------------------------------------------------
【详细过程】
第二篇破文,高手飘过.....我尽量把每个步骤写的清晰点...分析将近十个经典模式...下次,基础性东西会少提了...
好了。先热热身:
一.热身的部分我都在代码后面贴着,我自己温习旧知识
来,我们来干掉她:
二.破解过程:无壳
伪装码:=====用户名:CCDeath====
=====注册码:123456789==
查找字符串,断在这里
005E7688 . 55 push ebp ; 经典断点模式,可以先找到这断下来,分析到下面
有疑问的地方,把这个位置断点取消,断在那个有疑问的地方
005E7689 . 8BEC mov ebp, esp ; 先push ebp值,接着ebp保存esp的值,通过ebp来读
去参数和变量
005E768B . B9 06000000 mov ecx, 6
005E7690 > 6A 00 push 0 ; ecx为计数器,一个循环,分配堆栈空间,可以直接
跳过,在005E7690处,按F4
005E7692 . 6A 00 push 0
005E7694 . 49 dec ecx
005E7695 .^ 75 F9 jnz short 005E7690
005E7697 . 51 push ecx ; 在堆栈要用到这些寄存器,但是又不想改变原来值,
没办法只有压,记得要弹出
005E7698 . 53 push ebx
005E7699 . 56 push esi
005E769A . 57 push edi
005E769B . 8945 FC mov dword ptr [ebp-4], eax
005E769E . 33C0 xor eax, eax
005E76A0 . 55 push ebp
005E76A1 . 68 06795E00 push 005E7906
005E76A6 . 64:FF30 push dword ptr fs:[eax]
005E76A9 . 64:8920 mov dword ptr fs:[eax], esp ; 8086/80186没有fs段寄存器,太老了..
005E76AC . 8D55 F0 lea edx, dword ptr [ebp-10]
005E76AF . 8B45 FC mov eax, dword ptr [ebp-4]
005E76B2 . 8B80 04030000 mov eax, dword ptr [eax+304]
005E76B8 . E8 DB72E6FF call 0044E998
005E76BD . 8B45 F0 mov eax, dword ptr [ebp-10] ; 取得用户名,又是经典模式,取出什么,
接着判断她是否为空或者长度在哪个范围,接着进行复杂运算。
005E76C0 . 8D55 F4 lea edx, dword ptr [ebp-C]
005E76C3 . E8 B41FE2FF call 0040967C
005E76C8 . 837D F4 00 cmp dword ptr [ebp-C], 0 ; 还真的是,不跳,就Death
005E76CC . 75 22 jnz short 005E76F0
005E76CE . 6A 00 push 0
005E76D0 . 68 14795E00 push 005E7914 ; 请填写用户名称!
005E76D5 . E8 36FFFEFF call <jmp.&PunUnitLib.ShowMess>
005E76DA . 8B45 FC mov eax, dword ptr [ebp-4]
005E76DD . 8B80 04030000 mov eax, dword ptr [eax+304]
005E76E3 . 8B10 mov edx, dword ptr [eax]
005E76E5 . FF92 C0000000 call dword ptr [edx+C0]
005E76EB . E9 B1010000 jmp 005E78A1
005E76F0 > 8D55 E8 lea edx, dword ptr [ebp-18]
005E76F3 . 8B45 FC mov eax, dword ptr [ebp-4]
005E76F6 . 8B80 FC020000 mov eax, dword ptr [eax+2FC]
005E76FC . E8 9772E6FF call 0044E998
005E7701 . 8B45 E8 mov eax, dword ptr [ebp-18] ; 跟上面经典模式一样,顺便提一下,比如
我现在在这里,突然发现前面一句有很重要信息没看到,直接在上一句右键“此处为新的EIP”,控制EIP,CPU得跟我们走
005E7704 . 8D55 EC lea edx, dword ptr [ebp-14]
005E7707 . E8 701FE2FF call 0040967C
005E770C . 837D EC 00 cmp dword ptr [ebp-14], 0
005E7710 . 75 22 jnz short 005E7734
005E7712 . 6A 00 push 0
005E7714 . 68 28795E00 push 005E7928 ; 授权号不能为空,请填写授权号!
005E7719 . E8 F2FEFEFF call <jmp.&PunUnitLib.ShowMess>
005E771E . 8B45 FC mov eax, dword ptr [ebp-4]
005E7721 . 8B80 FC020000 mov eax, dword ptr [eax+2FC]
005E7727 . 8B10 mov edx, dword ptr [eax]
005E7729 . FF92 C0000000 call dword ptr [edx+C0]
005E772F . E9 6D010000 jmp 005E78A1
005E7734 > A1 38077000 mov eax, dword ptr [700738]
005E7739 . 8B00 mov eax, dword ptr [eax] ; 取得固定字符串"C26P-Q618"
005E773B . E8 FCD7E1FF call 00404F3C
005E7740 . 50 push eax ; 保存这个字符串
005E7741 . 8D55 E4 lea edx, dword ptr [ebp-1C] ; 看到下面5E7752了吗?
也有dword ptr[ebp-1C] 又是个经典模式,中间的CALL,肯定干了什么坏事,一般是取得数据
005E7744 . 8B45 FC mov eax, dword ptr [ebp-4]
005E7747 . 8B80 F4020000 mov eax, dword ptr [eax+2F4]
005E774D . E8 4672E6FF call 0044E998
005E7752 . 8B45 E4 mov eax, dword ptr [ebp-1C] ; 取得机器码
005E7755 . E8 E2D7E1FF call 00404F3C
005E775A . 50 push eax
005E775B . E8 E0FEFEFF call <jmp.&PunUnitLib.GetRegPass> ; 关键CALL
005E7760 . 8BD0 mov edx, eax ; 出来一串了,我们有理由相信她是真的
005E7762 . 8D45 F8 lea eax, dword ptr [ebp-8]
005E7765 . E8 12D5E1FF call 00404C7C
005E776A . 8D55 DC lea edx, dword ptr [ebp-24]
005E776D . 8B45 FC mov eax, dword ptr [ebp-4]
005E7770 . 8B80 FC020000 mov eax, dword ptr [eax+2FC]
005E7776 . E8 1D72E6FF call 0044E998
005E777B . 8B45 DC mov eax, dword ptr [ebp-24]
005E777E . 8D55 E0 lea edx, dword ptr [ebp-20]
005E7781 . E8 F61EE2FF call 0040967C
005E7786 . 8B45 E0 mov eax, dword ptr [ebp-20]
005E7789 . 8B55 F8 mov edx, dword ptr [ebp-8]
005E778C . E8 F7D6E1FF call 00404E88 ; 又是经典模式,爆破也可了...
三.来分析关键CALL------------------------------------------------------------------------------------------
003E9024 > 55 push ebp
003E9025 8BEC mov ebp, esp
003E9027 B9 06000000 mov ecx, 6
..............................
003E9043 8D45 EC lea eax, dword ptr [ebp-14]
003E9046 E8 65B5F8FF call 003745B0
003E904B 8D45 F0 lea eax, dword ptr [ebp-10]
003E904E 8B55 08 mov edx, dword ptr [ebp+8] ; 取出机器码
003E9051 E8 4AB7F8FF call 003747A0
003E9056 8B45 F0 mov eax, dword ptr [ebp-10]
003E9059 E8 0AB8F8FF call 00374868
003E905E 8BF0 mov esi, eax
003E9060 85F6 test esi, esi ; 判断机器码是否为空
003E9062 7E 26 jle short 003E908A
003E9064 BB 01000000 mov ebx, 1
003E9069 8D4D E8 lea ecx, dword ptr [ebp-18] ; 这个把机器码转换为十六进制
003E906C 8B45 F0 mov eax, dword ptr [ebp-10]
003E906F 0FB64418 FF movzx eax, byte ptr [eax+ebx-1] ; 从头往尾一直逐取
003E9074 33D2 xor edx, edx
003E9076 E8 F905F9FF call 00379674
003E907B 8B55 E8 mov edx, dword ptr [ebp-18]
003E907E 8D45 FC lea eax, dword ptr [ebp-4]
003E9081 E8 EAB7F8FF call 00374870
003E9086 43 inc ebx
003E9087 4E dec esi
003E9088 ^ 75 DF jnz short 003E9069
003E908A 8B45 FC mov eax, dword ptr [ebp-4] ; 得到转换后的机器码
003E908D E8 D6B7F8FF call 00374868
003E9092 8BF0 mov esi, eax
003E9094 85F6 test esi, esi ; 转换后的机器码是否为空
003E9096 7E 2C jle short 003E90C4
003E9098 BB 01000000 mov ebx, 1
003E909D 8B45 FC mov eax, dword ptr [ebp-4] ; 这个循环很明显是在倒序
003E90A0 E8 C3B7F8FF call 00374868
003E90A5 2BC3 sub eax, ebx
003E90A7 8B55 FC mov edx, dword ptr [ebp-4]
003E90AA 8A1402 mov dl, byte ptr [edx+eax] ; 从尾往头一个一个的取出
003E90AD 8D45 E4 lea eax, dword ptr [ebp-1C]
003E90B0 E8 DBB6F8FF call 00374790
003E90B5 8B55 E4 mov edx, dword ptr [ebp-1C]
003E90B8 8D45 F8 lea eax, dword ptr [ebp-8]
003E90BB E8 B0B7F8FF call 00374870
003E90C0 43 inc ebx
003E90C1 4E dec esi
003E90C2 ^ 75 D9 jnz short 003E909D
003E90C4 8D45 FC lea eax, dword ptr [ebp-4]
003E90C7 50 push eax
003E90C8 B9 04000000 mov ecx, 4
003E90CD BA 01000000 mov edx, 1
003E90D2 8B45 F8 mov eax, dword ptr [ebp-8] ; 倒序后的机器码
003E90D5 E8 E6B9F8FF call 00374AC0
003E90DA 8D45 F8 lea eax, dword ptr [ebp-8]
003E90DD 50 push eax
003E90DE B9 04000000 mov ecx, 4
003E90E3 BA 05000000 mov edx, 5
003E90E8 8B45 F8 mov eax, dword ptr [ebp-8]
003E90EB E8 D0B9F8FF call 00374AC0
003E90F0 8B45 FC mov eax, dword ptr [ebp-4] ; 取出机器码前四位N1="3415"
003E90F3 E8 70B7F8FF call 00374868
003E90F8 83F8 04 cmp eax, 4 ; 是不是四位,OK,跳
003E90FB 7D 2F jge short 003E912C
003E90FD 8B45 FC mov eax, dword ptr [ebp-4]
003E9100 E8 63B7F8FF call 00374868
003E9105 8BD8 mov ebx, eax
003E9107 83FB 03 cmp ebx, 3
003E910A 7F 20 jg short 003E912C
003E910C 8D4D E0 lea ecx, dword ptr [ebp-20]
003E910F 8BC3 mov eax, ebx
003E9111 C1E0 02 shl eax, 2
003E9114 33D2 xor edx, edx
003E9116 E8 5905F9FF call 00379674
003E911B 8B55 E0 mov edx, dword ptr [ebp-20]
003E911E 8D45 FC lea eax, dword ptr [ebp-4]
003E9121 E8 4AB7F8FF call 00374870
003E9126 43 inc ebx
003E9127 83FB 04 cmp ebx, 4
003E912A ^ 75 E0 jnz short 003E910C
003E912C 8B45 F8 mov eax, dword ptr [ebp-8] ; 从第五位取出四位N2="7553"
003E912F E8 34B7F8FF call 00374868
003E9134 83F8 04 cmp eax, 4 ;是不是四位,Nice,跳
003E9137 7D 2F jge short 003E9168
003E9139 8B45 F8 mov eax, dword ptr [ebp-8]
003E913C E8 27B7F8FF call 00374868
003E9141 8BD8 mov ebx, eax
003E9143 83FB 03 cmp ebx, 3
003E9146 7F 20 jg short 003E9168
003E9148 8D4D DC lea ecx, dword ptr [ebp-24]
003E914B 8BC3 mov eax, ebx
003E914D C1E0 02 shl eax, 2
003E9150 33D2 xor edx, edx
003E9152 E8 1D05F9FF call 00379674
003E9157 8B55 DC mov edx, dword ptr [ebp-24]
003E915A 8D45 F8 lea eax, dword ptr [ebp-8]
003E915D E8 0EB7F8FF call 00374870
003E9162 43 inc ebx
003E9163 83FB 04 cmp ebx, 4
003E9166 ^ 75 E0 jnz short 003E9148
003E9168 8D45 D8 lea eax, dword ptr [ebp-28] ;
003E916B 8B55 0C mov edx, dword ptr [ebp+C] ; 取出固定字符串,经典模式,肯定要组装字符串了,我们接着看她怎么装
003E916E E8 2DB6F8FF call 003747A0
003E9173 8B45 D8 mov eax, dword ptr [ebp-28]
003E9176 8D55 F4 lea edx, dword ptr [ebp-C]
003E9179 E8 DE03F9FF call 0037955C
003E917E 8D45 D4 lea eax, dword ptr [ebp-2C]
003E9181 50 push eax
003E9182 B9 04000000 mov ecx, 4
003E9187 BA 01000000 mov edx, 1
003E918C 8B45 F4 mov eax, dword ptr [ebp-C]
003E918F E8 2CB9F8FF call 00374AC0
003E9194 FF75 D4 push dword ptr [ebp-2C] ; 取出固定字符串前四位为N3="C26P"
003E9197 68 0C923E00 push 003E920C
003E919C FF75 FC push dword ptr [ebp-4]
003E919F 8D45 D0 lea eax, dword ptr [ebp-30]
003E91A2 50 push eax
003E91A3 B9 05000000 mov ecx, 5
003E91A8 BA 05000000 mov edx, 5
003E91AD 8B45 F4 mov eax, dword ptr [ebp-C]
003E91B0 E8 0BB9F8FF call 00374AC0
003E91B5 FF75 D0 push dword ptr [ebp-30] ; 取出固定字符串后五位为N4="-Q618"
003E91B8 68 0C923E00 push 003E920C
003E91BD FF75 F8 push dword ptr [ebp-8]
003E91C0 8D45 EC lea eax, dword ptr [ebp-14]
003E91C3 BA 06000000 mov edx, 6
003E91C8 E8 5BB7F8FF call 00374928 ;¥¥¥¥关键CALL2¥¥¥¥
003E91CD 8B45 EC mov eax, dword ptr [ebp-14] ;生成真的注册码
四分析一下关键¥¥¥¥CALL2¥¥¥¥-------------------------------------------------------------------------
00374931 8B4C94 14 mov ecx, dword ptr [esp+edx*4+14]
00374935 85C9 test ecx, ecx
00374937 74 06 je short 0037493F
00374939 3908 cmp dword ptr [eax], ecx
0037493B 75 02 jnz short 0037493F
0037493D 89C7 mov edi, eax
0037493F 31C0 xor eax, eax
00374941 8B4C94 14 mov ecx, dword ptr [esp+edx*4+14]
00374945 85C9 test ecx, ecx ; 下面循环要计算注册码的预留总长度
00374947 74 09 je short 00374952
00374949 0341 FC add eax, dword ptr [ecx-4] ; 4+1+4+5+1+4=19(13H)其中1为'-'占位 5为'-Q618'
0037494C 39CF cmp edi, ecx
0037494E 75 02 jnz short 00374952
00374950 31FF xor edi, edi
00374952 4A dec edx
00374953 ^ 75 EC jnz short 00374941
00374955 85FF test edi, edi
00374957 74 14 je short 0037496D ; 计算是否完成了
00374959 89C2 mov edx, eax
0037495B 89F8 mov eax, edi
0037495D 8B37 mov esi, dword ptr [edi]
0037495F 8B76 FC mov esi, dword ptr [esi-4]
00374962 E8 85020000 call 00374BEC
00374967 57 push edi
00374968 0337 add esi, dword ptr [edi]
0037496A 4B dec ebx
0037496B EB 08 jmp short 00374975
0037496D E8 02FDFFFF call 00374674
00374972 50 push eax ; 取出未倒序的机器码
00374973 89C6 mov esi, eax ; 接下来开始组装真的注册
00374975 8B449C 18 mov eax, dword ptr [esp+ebx*4+18]
00374979 89F2 mov edx, esi ; 不断填充未倒序的机器码
0037497B 85C0 test eax, eax
0037497D 74 0A je short 00374989
0037497F 8B48 FC mov ecx, dword ptr [eax-4]
00374982 01CE add esi, ecx ; 当前指针指向机器码下一个字符
00374984 E8 8FDFFFFF call 00372918 ; 用'-'来填充先前指针指向
00374989 4B dec ebx
0037498A ^ 75 E9 jnz short 00374975
0037498C 5A pop edx ; //真的注册码组装完毕
--------------------------------------------------------------------------------
【经验总结】
一.取得机器码8位,接着把机器码转化为16进制字符(共16个),接着把这16个字符倒序。取出此时机器码前四位为N1,接
着从第五位取出四个字符为N2.
固定字符出场了,取出其前四位为N3,取出其后五位为N4.
开始组合为: N3+'-'+N1+N4+'-'+N2 OK
这个软件是2007.9月22号更新,昨晚看到了。
希望多多批评和建议...CCDeath再此感激不尽
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2007年09月25日 10:40:13
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课