【文章标题】: 【原创】新手破解keyfile及功能限制全过程
【文章作者】: 呆呆的幻行者
【作者邮箱】: [email]369989309@163.com[/email]
【作者QQ号】: 381561450
【软件名称】: 数控机床联网专家--DSDNC
【软件大小】: 3.80M
【下载地址】:
www.dssoft.com.cn
【加壳方式】: UPX
【编写语言】: Microsoft Visual C++ 6.0
【使用工具】: OllyICE,PEID,UPXShell
【操作平台】: XP SP3
【作者声明】: 我是新手,这是我破解的第一个软件。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
帮朋友破解这个软件,软件介绍如下:
注册限制:
1.打开提示注册,输入错误注册码后,直接关闭
2.注册成功后,生成key.ini文件,每次启动检测key.ini,如果即将过期,过期,无效,无法使用,这四种情况则弹出messagebox,然后自动退出。
功能限制:
1.注册成功后,打开软件,在设置界面里有一个combox下拉框,里边只有com1到com10这10个选项,朋友要求增加到com100
==========================================================================================
第一步:脱壳
先用PEID(看雪网站工具区可以下载到)查壳,可以看到是UPX的壳,
再用UPXShell(看雪网站工具区可以下载到)脱壳。
脱完壳后,可以看到是Microsoft Visual C++ 6.0编写的软件。EP Section显示.text,EntryPoint和File Offset显示相同,均为00006C12
深度扫描一下,信息没有变化。说明脱壳成功。
第二步:动态调试
使用OllyICE(看雪网站工具区可以下载到)载入程序,
直接点击右键,使用插件,查看所有参考字符串。
看到如图四条提示。随便双击一个。
看到没有,就是这里,
如果注册码过期就自动退出。这里就要动动脑筋了。注册码即将过期,过期,无效,无法使用,这四种情况自动退出。还有输入无效注册码没有提示,直接退出,我们只需要找到第五个无故退出的地方就OK了。
双击
00403B6F |. FF15 30804000 call dword ptr [<&KERNEL32.ExitProcess>] ; \ExitProcess
复制
call dword ptr [408030]
Ctrl+F查找
call dword ptr [408030]
一共找到10个地方,除去刚才四个。还有四个。
先看最后两个。
00404000 . E8 25270000 call <jmp.&MFC42.#1168_AfxGetModuleState>
00404005 . 8B48 04 mov ecx, dword ptr [eax+4]
00404008 . E8 09290000 call <jmp.&MFC42.#2652_CCmdTarget::EndWaitCu>
0040400D . 8D4C24 30 lea ecx, dword ptr [esp+30]
00404011 . C64424 48 02 mov byte ptr [esp+48], 2
00404016 . FF15 FC834000 call dword ptr [<&ncuicore.CMultiLanguageToo>; ncuicore.CMultiLanguageTool::~CMultiLanguageTool
0040401C . 8D4C24 20 lea ecx, dword ptr [esp+20]
00404020 . C64424 48 01 mov byte ptr [esp+48], 1
00404025 . E8 E6280000 call <jmp.&MFC42.#665_CFile::~CFile>
0040402A . 8D4C24 0C lea ecx, dword ptr [esp+C]
0040402E . C64424 48 00 mov byte ptr [esp+48], 0
00404033 . E8 6E260000 call <jmp.&MFC42.#800_CString::~CString>
00404038 . 8D4C24 14 lea ecx, dword ptr [esp+14]
0040403C . C74424 48 FFF>mov dword ptr [esp+48], -1
00404044 . E8 5D260000 call <jmp.&MFC42.#800_CString::~CString>
00404049 . 8B4C24 40 mov ecx, dword ptr [esp+40]
0040404D . 5F pop edi
0040404E . 5E pop esi
0040404F . B8 01000000 mov eax, 1
00404054 . 64:890D 00000>mov dword ptr fs:[0], ecx
0040405B . 5D pop ebp
0040405C . 83C4 40 add esp, 40
0040405F . C3 retn
00404060 > 6A 00 push 0 ; /ExitCode = 0
00404062 . FF15 30804000 call dword ptr [<&KERNEL32.ExitProcess>] ; \ExitProcess
类似这样子。在退出之前没有判断语句,应该不是。
再看另外四个
00402BC2 . 6A 04 push 4 ; /ExitCode = 4
00402BC4 . FF15 30804000 call dword ptr [<&KERNEL32.ExitProcess>] ; \ExitProcess
第一个,ExitCode = 4 应该不是。
第三个和第四个
00403852 |. FF15 04804000 call dword ptr [<&ADVAPI32.RegOpenKeyA>] ; \RegOpenKeyA
00403858 |. 85C0 test eax, eax
0040385A |. 74 16 je short 00403872
0040385C |. 6A 00 push 0
0040385E |. 6A 00 push 0
00403860 |. 68 BCC04000 push 0040C0BC ; system error!
00403865 |. E8 8E300000 call <jmp.&MFC42.#1200_AfxMessageBox>
0040386A |. 6A 00 push 0 ; /ExitCode = 0
0040386C |. FF15 30804000 call dword ptr [<&KERNEL32.ExitProcess>] ; \ExitProcess
有判断,有退出。但是退出之前的注释是“system error!” 这两个应该是系统出错退出。
排除法就只剩下第二个了,
00403767 |. 3BF7 cmp esi, edi
00403769 74 07 je short 00403772
0040376B |. 57 push edi ; /ExitCode
0040376C |. FF15 30804000 call dword ptr [<&KERNEL32.ExitProcess>] ; \ExitProcess
00403772 |> 8D4C24 30 lea ecx, dword ptr [esp+30]
这个退出之前有判断,肯定是他了,如果我没有猜错的话,这个判断就是判断注册码是否有效,如果有效则转跳到00403772
这就好办了,无脑爆破之,双击
je short 00403772
修改为
jmp short 00403772
,
点击右键,复制到可执行文件,保存文件。
执行,随便输入一个注册码,软件没有自动关闭,我们成功了~!!
但是立即弹出了一个提示框,提示注册码无效。
第三步:解决key.ini无效及过期的问题。
无需多说,直接查找参考字符串,找到四个字符串。双击第一个。
je short 00403B75
修改为
jmp short 00403B75
其他三个同理。
再打开软件,软件运行正常。
点击设置,发现在设置界面里有一个combox下拉框,里边只有com1到com10这10个选项,朋友要求增加到com100
第四步:修改功能限制
既然有数量限制。说明这个combox里的东西肯定是动态增加的。如果要动态增加肯定要格式化字符串,
还记得之前我们用peid看到这个软件是用Microsoft Visual C++ 6.0 编写的吧
格式化字符串肯定是com%d
到参考字符串里找到com%d,双击之
300032E9 8D4C24 18 lea ecx, dword ptr [esp+18]
300032ED 68 1C010230 push 3002011C ; ASCII "COM%d"
300032F2 51 push ecx
300032F3 E8 00E10000 call <jmp.&MFC42.#2818_CString::Format>
300032F8 8B5424 20 mov edx, dword ptr [esp+20]
300032FC 8B86 B4010000 mov eax, dword ptr [esi+1B4]
30003302 83C4 0C add esp, 0C
30003305 52 push edx
30003306 53 push ebx
30003307 68 43010000 push 143
3000330C 50 push eax
3000330D FFD7 call edi
3000330F 45 inc ebp
30003310 83FD 0A cmp ebp, 0A
30003313 ^ 7E D3 jle short 300032E8
看到没,很典型的一个循环体,每次都和0A进行比较,如果小于0A就转跳回去,继续添加。把循环次数0A改成64.
重新运行软件,可以看到100个com口。
打完收工。~
顺便问一句,如何成为正式会员?
--------------------------------------------------------------------------------
【经验总结】
感谢我的朋友hyp,关于解除功能限制的地方是他找到的。万分感谢。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2012年05月10日 19:22:46
[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。