最近突然对软件破解起了兴趣,主要是想在软件加密上能够有所提升。刚好舅舅最近追紧我要一个软件的破解版本,我苦苦的在网上找到唯一的一个破解,还是有三十次的限制。(现在人,居然也可以以破解软件为生了:)看来我研究这个还是有前途的:))
在万般无赖下,决定自己来进行破解。这个决定其实对于最近的我来说,真可是一个大的挑战--我已经很长时间没有激情做新东西了。因此虽然满怀喜欢,却又有点怀疑能否完成。
破解的对象是一个财务软件,名字叫XXXXX(我故意隐藏了产品的名称)。其软件是一个C/S结构的网络版软件。软件需要加密锁的支持。如果加密锁通过了,则显示正版,否则是试用版。从演示看,软件只有在启动的时候检测加密锁(这告诉我们,加密点应该多点)。
有一个额外的条件在于,网上找来的破解是程序中一个动态链接库(XXXXX.dll)的破解。这给我一个提示:我只要破解这个XXXXX.dll就可以了。网上的破解版由于加过壳,而我现在对于加壳的软件如何破解更是不了解,因此目标转向了原有的XXXXX.dll。使用W32DAsm打开,发现各个输出函数的定义及实现都可以发现,应此证明此Dll没有被加密。
调试二进制程序,一般分静态分析和动态调试。静态分析一般都使用W32Dasm来进行。通过W32Dasm可以很方便地定位到其输出函数的起始位置。通过粗读这些代码,发现几个情况:
FindNetRockey
FindRockey
CheckNetRockey
CheckRockey
HaspLogin
HaspLogout
根据我的知识(我们公司也是用这些加密锁),这些程序都是读取加密锁的函数。可是静态分析之后,发现自己的能力有限,不能完全理解代码。不过这个过程中,复习了一下Win32汇编代码的知识,包括堆栈平衡和通过EAX返回值的方式。
经过同事推荐,我采用了OllyDbg来进行动态调试(这是一个很正确的决定)。
一开始,我想直接调试XXXXX.dll,我用OllyDbg直接打开XXXXX.dll文件,发现OllyDbg会自动使用LoadDll.exe来装载此Dll。使用这个程序可以在没有宿主程序的情况下,进行动态调试,猜测函数的参数及返回值。不过我后来并没有直接使用这个方法。
由于对OllyDbg动态调试不是很了解,我想,除了破解XXXXX.dll,我如果破解了XXXXXClient.exe程序应该也可以的。不过XXXXXClient.exe是使用VB编写的,汇编码中有大量的VB的影子。
我第一要做的就是,定位到读取加密锁的函数入口。一开始,我采用单步跟踪,发现太慢,而且也失去了耐心。后来想起,既然是Dll,那么必然会调用LoadLibrary及GetProcAdress。那么只要知道这个函数地址,说不定可以能快一点找到。
如何得到GetProcAdress的地址?我采用了Dependency,用Dependency打开Ac990Client.dll,选择Walk按钮,可以在输出Log中发现,在什么时候调用了XXXXX.dll
我得到了函数地址A,在OllyDbg中,定位到A,确实定位到了LoadLibrary函数的调用处,另外,我发现在OllyDbg中,可以跟踪进入其调用的Dll中。那么如果我直接进入XXXXX.dll中设置断点,是否可以进去呢?事实证明我的猜想是对的,这为我更快地得到结果奠定了基础。应该说前面走了很多弯路。
通过一番地跟踪,几乎是在最后失望的情况下,我发现函数HaspLogin被调用的时候,函数本身只有两个出口。其中一个返回前,做了Xor EAX, EAX(设置EAX为0),而另一个设置EAX为1。通过调试发现,在没有加密锁的情况下,走了第一条路线,那么如果是第二呢?我动态地设置了EAX为1,结果发现XXXXXClient.exe显示正版的字样!Great!
那么下面就是如何修改程序了,很遗憾,我没有发现OllyDbg怎么修改编辑。想起同时推荐的HiView这个程序,在刚才发现的位置前,修改了几个跳转的地址(这段代码前必然有jne A0000753等字样,只要跳转到xor EAX,EAX处就可以了),另外我还将一处本来特耗时间的call改成了几个nop的组合。保存,测试!好了,总于成功了。
这是我第一次破解程序。本身没什么特别的大,只是让我熟悉了很多相关软件的使用,并较为完整地理解了破解的过程。以后还要继续破解!
分享到:
相关推荐
H3C MIB转py小记.txt
在“android开发小记”这个主题中,我们可以深入探讨Android应用程序开发的相关知识,特别是通过查看提供的压缩文件中的代码示例。这些文件名如lesson_8_code.zip至lesson_20_codel.zip,以及不同的Mp3Player版本,...
环境: Linux s12084 2.6.9-67.ELsmp #1 SMP Wed ...小记一下。以备以后参考。 boost 库做得真好。在windows 平台, linux 平台下编译都很顺利。hp aCC 也宣称对 boost 1.35 完全支持 。 全部编译是很痛苦的过程
### C++11 新特性详解 #### 一、Auto 关键字的新用途 - **旧用途**:在C++11之前,`auto`关键字主要用于指定变量的存储期。 - **新用途**:C++11引入了类型推断的概念,`auto`变成了一个类型占位符,用于告诉...
随笔小记.doc
GeoStudio学习小记
【CPU-Z软件详解:识别真假处理器的利器】 CPU-Z是一款由Frank Delattre编写的免费且小巧的系统信息检测工具,特别适用于鉴别CPU的真实身份,防止购买到假冒伪劣产品。这款软件支持从古老的486到最新的P4 Athlon 64...
这篇文章是关于一种名为“咬人草”的植物的描述和作者对其独特特性的体验与思考。咬人草在新疆地区生长,是一种看似普通的草本植物,却有着不寻常的防御机制——它的叶瓣上有尖锐的小刺,一旦触碰,就会像被毒蜂蜇...
Java Web开发是软件行业中一个广泛讨论的话题,涵盖了诸如Servlet、JSP、JDBC、MVC框架、企业级组件以及各种工具和技术。这份"java小记.rar"压缩包很可能包含了作者多年从事Java Web开发的经验总结,可能包括代码...
刘重威将军小记.docx
"每日小记"就是这样一款应用,它结合了记账和日记的功能,为用户提供了一个全面的生活记录平台。 首先,我们要了解记账的重要性。在个人财务管理中,记账是一个基础但至关重要的步骤。通过"每日小记",用户可以轻松...
随笔小记的文档,自己记录的一些文档,仅供参考
STM8S+STVD+COSMIC折腾小记STM8S+STVD+COSMIC折腾小记.专为新手准备_rezip
当代班主任工作小记.doc
小学语文圣诞节作文圣诞小记
《C++实现的家庭小记账本》 在我们的日常生活中,管理个人财务是必不可少的一环。为了方便家庭财务管理,有人开发了一款基于C++编程语言的“家庭小记账本”程序,它以其小巧、易用的特点,为用户提供了便捷的记账...
STM8S+STVD+COSMIC折腾小记STM8S+STVD+COSMIC折腾小记.专为新手准备1_rezip
以下是对标题"数据字典-小记及用户部分1"中所提及的数据元素进行的详细说明: 1. 用户数据元素: - **账号**:用户ID,类型为int,长度11,用于唯一标识每个用户。 - **密码**:字符串类型,长度20,存储用户登录...
总的来说,【御风小记账本】是一款基于Delphi技术的个人财务管理软件,它充分利用了Delphi的开发优势,为用户提供了一个便捷、高效的记账平台。对于想要学习Delphi开发或者个人财务管理的用户来说,这款小程序无疑是...
Sublime Text3 安装到使用个人小记