某美容诊断软件保护方式分析
来源:互联网 发布:js中offset函数 编辑:程序博客网 时间:2024/04/30 11:10
软件:XXX美容诊断程序
加密方式:序列号+系统码+解锁码方式,vb6程序,无壳。
首先输入序列号,然后输入解锁码。
输入错误的序列号,弹出错误提示,于是在rtcMsgBox上下断点。很快中断了,返回到进程空间。
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:006B9871(C)
|
* Reference To: MSVBVM60.__vbaVarDup, Ord:0000h
|
:006B9B43 8B3D34134000 mov edi, dword ptr [00401334]
:006B9B49 B904000280 mov ecx, 80020004
:006B9B4E 894D
:006B9B51 B
:006B9B56 894D
:006B9B59 8D9554FFFFFF lea edx, dword ptr [ebp+FFFFFF54]
:006B9B
:006B9B62 894584 mov dword ptr [ebp
:006B9B65 894594 mov dword ptr [ebp
:006B9B
:006B9B
:006B9B
:006B9B7E 8D9564FFFFFF lea edx, dword ptr [ebp+FFFFFF64]
:006B9B84 8D4DB4 lea ecx, dword ptr [ebp
:006B9B
:006B9B
:006B9B9B FFD7 call edi
:006B9B9D 8D4584 lea eax, dword ptr [ebp
:006B9BA0 8D4D94 lea ecx, dword ptr [ebp
:006B9BA3 50 push eax
:006B9BA4 8D
:006B9BA7 51 push ecx
:006B9BA8 52 push edx
:006B9BA9 8D45B4 lea eax, dword ptr [ebp
:006B9BAC
:006B9BAE 50 push eax
* Reference To: MSVBVM60.rtcMsgBox, Ord:0253h
|
:006B9BAF FF15E0104000 Call dword ptr [004010E0]
上面的代码有2个关键的地方,一个是rtcMsgBox,还有一个是参考地址006B9871,来到参考地址处,这里应该是失败的地方。
* Reference To: MSVBVM60.rtcUpperCaseVar, Ord:0210h
|
:006B9837 FF
:006B983D 8D5584 lea edx, dword ptr [ebp
:006B9840 8D4594 lea eax, dword ptr [ebp
:006B9843 52 push edx
:006B9844 50 push eax
* Reference To: MSVBVM60.__vbaVarTstEq, Ord:0000h
|
:006B9845 FF1584114000 Call dword ptr [00401184]
:006B984B 8D4DC4 lea ecx, dword ptr [ebp
:006B984E 668BF8 mov di, ax
* Reference To: MSVBVM60.__vbaFreeObj, Ord:0000h
|
:006B9851 FF
:006B9857 8D4D94 lea ecx, dword ptr [ebp
:006B
:006B985D 51 push ecx
:006B985E 8D
:006B9861 52 push edx
:006B9862 8D4DB4 lea ecx, dword ptr [ebp
:006B9865 50 push eax
:006B9866 51 push ecx
:006B9867
:006B9869 FFD3 call ebx
:006B986B
:006B986E 6685FF test di, di
:006B9871
这里有个__vbaVarTstEq函数,比较是否相等,在006B9871处有个跳转,这个跳转一跳,就失败,所以如果把这个跳转改掉,就顺利进入主界面了。
进入主界面后,点击某些功能,依然弹出注册的对话框,虽然这个时候也能随便注册成功,但是总是不爽。而且启动的时候也有这个对话框。
整理一下思路,首先软件启动的时候弹出注册框,说明在启动的时候先校验是否注册成功,这个时候有2种可能,一种是把序列号和解锁码放在注册表里,启动的时候直接调用某个函数校验,还有一种是在注册表里做一个是否注册成功的标志。如果是第一种方式,那么很可能启动时校验和注册时校验调用的是同一个函数。跟踪注册过程,看到核心函数:00636280:
eax=
Stack ss:[0012EEC4]=
006B97E6 > /8B45 D4 mov eax,dword ptr ss:[ebp
006B97E9 . 8D55 E8 lea edx,dword ptr ss:[ebp-18]
006B97EC . 8945
006B97EF . 8D45 B4 lea eax,dword ptr ss:[ebp
006B
006B
006B97FE . 50 push eax
006B97FF . 8D
006B9802 . 51 push ecx
006B9803 . 52 push edx
006B9804 . C745 D4 00000000 mov dword ptr ss:[ebp
006B980B . C745 84 08800000 mov dword ptr ss:[ebp
006B9812 . C745 BC 10000000 mov dword ptr ss:[ebp-44],10
006B9819 . C745 B4 02000000 mov dword ptr ss:[ebp
006B9820 . C785 64FFFFFF 0840>mov dword ptr ss:[ebp
006B
006B
006B9832 . 8D4D 94 lea ecx,dword ptr ss:[ebp
006B9835 . 50 push eax
006B9836 . 51 push ecx
006B9837 FF15
006B983D . 8D55 84 lea edx,dword ptr ss:[ebp
006B9840 . 8D45 94 lea eax,dword ptr ss:[ebp
006B9843 . 52 push edx
006B9844 . 50 push eax
006B9845 . FF15 84114000 call dword ptr ds: [<&MSVBVM60.__vbaVarTstEq>] ; MSVBVM60.__vbaVarTstEq
006B984B . 8D4D C4 lea ecx,dword ptr ss:[ebp
006B984E . 66:8BF8 mov di,ax
006B9851 . FF
006B9857 . 8D4D 94 lea ecx,dword ptr ss:[ebp
006B
006B985D . 51 push ecx
006B985E . 8D
006B9861 . 52 push edx
006B9862 . 8D4D B4 lea ecx,dword ptr ss:[ebp
006B9865 . 50 push eax
006B9866 . 51 push ecx
006B9867 .
006B9869 . FFD3 call ebx
006B986B .
006B986E . 66:85FF test di,di ; di是vbaVarTstEq的返回值,为0说明不等。
006B9871 .
于是在注册过程中的一个核心函数:00636280处下断点,启动后,果然中断,分析上下文,来到这里:
00656667 . 51 push ecx
00656668 . 52 push edx
00656669 . E8 12FCFDFF call Angel.00636280
0065666E . 8D
00656671 . 8D4D 90 lea ecx,dword ptr ss:[ebp-70]
00656674 . 50 push eax
00656675 . 51 push ecx
00656676 . FF15
00656682 . 52 push edx
00656683 . 8D8D 70FFFFFF lea ecx,dword ptr ss:[ebp-90]
00656689 . 50 push eax
0065668B . FF15
00656691 . 50 push eax
00656692 . FF15 38104000 call dword ptr ds:[<&MSVBVM60.__vbaStrVarMov>; MSVBVM60.__vbaStrVarMove
00656698 . 8BD0 mov edx,eax
0065669D . FFD6 call esi
006566AF . 8D8D 70FFFFFF lea ecx,dword ptr ss:[ebp-90]
006566B5 . 8D55 90 lea edx,dword ptr ss:[ebp-70]
006566B8 . 51 push ecx
006566B9 . 8D45 80 lea eax,dword ptr ss:[ebp-80]
006566BC . 52 push edx
006566BD . 8D4D A0 lea ecx,dword ptr ss:[ebp-60]
006566CA .
006566CC . FF15 48104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeVarLi>; MSVBVM60.__vbaFreeVarList
006566D2 . 8B4D E0 mov ecx,dword ptr ss:[ebp-20]
006566D5 .
006566D8 . 68 D
006566DD . 51 push ecx
006566DE . FFD3 call ebx
006566E0 . 8BD0 mov edx,eax
006566E2 . 8D4D D8 lea ecx,dword ptr ss:[ebp-28]
006566E5 . FFD6 call esi
006566E7 . 50 push eax
006566E8 . 68 E
006566ED . FFD3 call ebx
006566EF . 8BD0 mov edx,eax
006566FA . 52 push edx
006566FB . FFD3 call ebx
006566FD . 8BD0 mov edx,eax ; UNICODE "QIN-PSIM-BAS-648444312-C8D
这里可以看到,把用户输入的序列号和系统码拼接起来了。
006566FF . 8D4D D0 lea ecx,dword ptr ss:[ebp-30]
00656702 . FFD6 call esi
00656704 . 50 push eax
00656705 .
0065670E . 8D4D EC lea ecx,dword ptr ss:[ebp-14]
00656711 . FFD6 call esi
00656713 . 8D45 D0 lea eax,dword ptr ss:[ebp-30]
00656716 . 8D4D D4 lea ecx,dword ptr ss:[ebp
00656719 . 50 push eax
0065671D . 51 push ecx
0065671E . 52 push edx
00656721 . FF15 DC124000 call dword ptr ds:[<&MSVBVM60.__vbaFreeStrLi>; MSVBVM60.__vbaFreeStrList
00656727 .
0065672D . 8D4D C0 lea ecx,dword ptr ss:[ebp-40]
00656730 . 8985 68FFFFFF mov dword ptr ss:[ebp-98],eax ; UNICODE "-668135518"
00656736 . 8D95 60FFFFFF lea edx,dword ptr ss:[ebp-A0]
0065673D . 8D45 B0 lea eax,dword ptr ss:[ebp-50]
00656740 . BB 02000000 mov ebx,2
00656745 . 52 push edx
00656746 . 50 push eax
00656747 . C
0065674E . 895D C0 mov dword ptr ss:[ebp-40],ebx
00656751 . C785 60FFFFFF 0840>mov dword ptr ss:[ebp-A0],4008
0065675B . E8 20FBFDFF call Angel.00636280 调用核心函数,返回后出现明文的解码
00656760 . 8D4D B0 lea ecx,dword ptr ss:[ebp-50]
00656763 . 8D
00656766 . 51 push ecx
00656767 . 52 push edx
00656768 . FF15
0065676E . 8D
00656771 . 50 push eax
00656772 . FF15 38104000 call dword ptr ds:[<&MSVBVM60.__vbaStrVarMov>; MSVBVM60.__vbaStrVarMove
00656778 . 8BD0 mov edx,eax
0065677D . FFD6 call esi
00656782 . 8D55 B0 lea edx,dword ptr ss:[ebp-50]
00656785 . 51 push ecx
00656786 . 8D
00656789 . 52 push edx
0065678B .
0065678D . FF15 48104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeVarLi>; MSVBVM60.__vbaFreeVarList
00656793 . 8B4D E4 mov ecx,dword ptr ss:[ebp
00656796 . 8B55 E0 mov edx,dword ptr ss:[ebp-20] ; "E32706D6BDC
00656799 .
0065679D . 52 push edx
0065679E . FF15 78114000 call dword ptr ds:[<&MSVBVM60.__vbaStrCmp>] ; MSVBVM60.__vbaStrCmp 比较字符串。
006567B2 . 75 10 jnz short Angel
总结:软件采用序列号,系统号和解锁码的形式进行保护,入口是rtcMsgBox,不过分析完发现还有一个更加快捷的入口:__vbaStrCmp。系统将序列号,系统号进行组合,然后进行加密生成解锁码,和用户输入的解锁码进行比较,算法有缺陷,导致内存里直接出现解锁码,如果采用将用户输入的解锁码进行逆运算,然后比较会安全些。最终这个软件通过内存注册机或者暴力跳转都能顺利实现完美破解。如果有耐心再去跟踪00636280就可以看到具体的算法过程。
- 某美容诊断软件保护方式分析
- 软件性能分析及诊断
- 理解软件保护技术之序列号方式
- 美容
- 美容
- 实方式和保护方式切换的实例分析
- 软件破解中常见保护的攻击:序列号方式
- 中国汽车行业管理软件 美容版 是什么
- 中国汽车行业管理软件 美容版 瑞星
- linux软件安装方式分析
- 软件保护入口点安全及技术分析
- 整形美容的消费者心理分析
- MySQL性能诊断分析
- [英语阅读]“美容软件”让你看上去更美
- 越客汽车美容管理软件 汽车行业专用软件
- [软件人生]人格美容与素质和教养
- 软件代码保护
- 软件保护建议
- 我的手机三部曲
- ASP.net 验证码(C#)
- 对C# 2.0中匿名方法的怀疑分析
- 利用Visual C#实现Reversi游戏开发(1)
- 利用Visual C#实现Reversi游戏开发(2)
- 某美容诊断软件保护方式分析
- Visual C# 3.0 新特性概览(1)
- Visual C# 3.0 新特性概览(2)
- Demeanor for .NET Enterprise Edition v4.0
- Visual C#编程入门之C#的程序结构
- 用Visual C#打造多页面网页浏览器
- static final 要点
- 用C#和本地Windows API操纵系统菜单(1)
- 用C#和本地Windows API操纵系统菜单(2)