软件破解入门七问
1. 破解是啥?
软件我们都知道,但是破解具体是个什么含义呢?套用百度百科的定义:
破解软件指的是 研究软件的激活机制后,通过修改内存或者程序文件、或者写注册机(keygen)程序并随机产生有效的序列号注册码,来达到免费使用该软件、或者突破其功能限制的目的的过程。
2. 所有软件都可以被破解吗?
网上流传着那么一句话:
当今世界上的软件总共只有两种:一种是已经被破解的,一种是还不知道自己已经被破解的。
也就是说,没有哪款软件是不能破解的,破解任何一款软件都知只是时间问题。一款软件是否值得破解才是问题。
3. 破解软件究竟破解的是什么?
具体来说,破解的内容就是正版程序在使用流程中的验证机制,这道验证机制是为了确保使用软件功能的用户是已购买产品的正版用户。相对于大家常说的“盗版”,破解版更像是一种低配的替代品,正版专业软件收费普遍偏贵,个人用户基本负担不起,这时各种免费破解版软件就在网上大行其道。目前国内使用正版软件的机构大多是大型的企业,因为这些公司花钱买的不只是程序本身,更多的是售后服务与相应的技术支持。
一个付费软件一般都是这样的——在你的程序上做了一些小的限制,让你无法使用付费版的某些功能;亦或是给你一个使用时间的限定,在这个”规定的”时间内,超过这个时间你就不得不花钱去把这个软件“请”回来。 那么,cracker又是怎么给这些程序加上”无期徒刑”的呢? 我们知道,这些软件之所以能够限定你程序的功能,靠的是一个授权验证。这个验证可以多种多样,可以是电脑的注册表,也可以是系统时间,还可以是版本号,再或者是网络的一个http请求……总之,如果你不符合这个条件了,程序就会根据作者的设定,把相应的功能锁死。 但是呢,问题也正是出在了这里。程序的功能是完全的,只是因为一些原因被关闭了而已。而cracker要做的,就是强行启动这些被关闭的功能。 强行启动这些被关闭的功能,cracker可谓是绞尽脑汁,用尽手法。我们最常见的破解手法就是硬性修改程序的机器码,cracker拿到一个程序之后,通过ollydbg这样的软件来将验证的逻辑修改掉,达到突破授权验证的目的。
4. 软件开发者对软件破解的态度?
阻止软件被破解的方法有很多,但不能完全杜绝。不法黑客无孔不入,出售破解版本软件从中牟利,还可能会在软件里添加病毒代码,做成木马进行传播。软件是开发者知识的结晶,他们会想方设法阻止不法黑客的破解行为,例如加保护壳、设置暗桩代码等,但这些办法大多是治标不治本,只能给破解的过程增加难度和干扰。
破解版软件只能制造越来越深的市场鸿沟,破坏软件市场的游戏规则。俗话说便宜没好货,标榜打折或者免费的东西大家都想要,这是人之常情,但是当这种“福利”逐渐伤害到软件市场的时候,最终谁都不会因此受益。破解版软件能在短时间内积累大量用户,但是也有很多毛病,例如运行不稳定经常出错,带病毒或夹杂流氓程序,盗取用户信息,强行后台下载其他付费软件等,严重的话还会导致数据库崩溃,造成数据全部丢失。
面对付费软件,用户除了关注价格,更要关注价值。对于软件使用者来说,破解版的售价比官方正版低很多,加之拥有正版软件的功能,是非常具有诱惑性的,但是用户却往往容易忽略软件后期的维护以及可能带来的危害。破解版软件被不法黑客进行了许多非法修改,破坏了注册功能,无法提供后期的维护和问题处理,在软件运行中容易出现不稳定的情况。正版软件会定期进行升级处理,但是破解版不能第一时间享受到最新版本,还要时常面临bug或兼容性等问题。如果不慎被破解版软件携带的病毒感染了电脑,小则重装系统,往大了说损财丢失各种账号资料,劳神费力不讨好。现在为了更安全的体验而掏腰包入正版的用户越来越多,厂商也开始更加重视防范破解版的出现。
5. 软件发行商对软件破解的态度?
大多数软件发行商都是以下态度:
- 个人破解或个人使用破解版可以,属于睁一只眼闭一只眼
- 从软件公司角度,追责个人用户使用破解软件维权成本太高,多半得不偿失
- 另外一些用户可能在使用破解版过程中养成了用户依赖,从而间接影响了企业用户的购买选项
- 扩大市场份额。最好的例子莫过于微软了。
- 企业要是敢用破解版,那么就律师函伺候
- 对于企业用户的违法使用行为,软件公司有巨大动机维权,因为没准一笔巨额赔偿到账就能提前完成当年销售目标了,或者迫使对方强行购买正版软件
- 有点钓鱼执法的感觉~
6.软件破解常用工具
-
IDA PRO
- 是目前最棒的一个静态反编译收费软件
- ida购买地址:https://www.hex-rays.com/products/ida/order.shtml
-
ollydbg
- 当前最好用的一款用于动态分析的免费工具
- 下载地址: http://www.ollydbg.de/
7. 防止软件被破解的办法
- 提升加密技术,注册的加密算法越复杂越好,这样就不会被破解者轻易写出注册机,延缓破解出现的时间;
- 防止被爆破,就要在程序运行的过程中,经常检测主程序的精确大小,或主程序中某个位置是否是固定字符,如果不对就退出程序。当然主程序要用ASPack等软件压缩,检测的也是压缩后的程序大小;
- 不要用明文比较的方法比较注册码,对注册码进行加密变换,越复杂越好,最后对加密后的注册码进行比较,相同则是合法用户;
- 加花加壳:加花是指加入花指令–与程序功能没有关系的代码以混淆破解者,加壳涉及代码的解码,也会加大cracker代码阅读的难度,同时多数加壳程序无法直接保存也给破解造成一定不便。但是加花可以”去花”,加壳可以“脱壳”,也可以“带壳破解”;
- 反调试/暗桩:例如检测到程序的MD5与原程序不符就自动退出程序或者关机,甚至格盘;对常见调试器,例如ollydbg进行检测,禁止在虚拟机内运行等;
- 运用法律维权,通过法律武器禁止破解软件使用和流通,让破解软件方无利可图。
- 版权:例如专利,让cracker不敢去传播。
没有最坚固的盾牌,也没有最锋利的长矛,只有与时俱进的矛,和与时俱进的盾。破解和反破解,一直是一个相互较量的过程,破解者往往专攻一点就可能成功。一个软件想要不被破解,需要在开发阶段尽可能去解决这些安全问题,有效防止和减少软件漏洞,毕竟没有完美的软件,只有需要不断完善的软件,这是个持久战。
简单小实验
实验要求
下面是一段C++代码,使用编译器编译生成可执行文件test1.exe,可执行文件的作用是验证输入的密码是否正确(内嵌正确密码)。现在要求破解程序使得我们可以绕过验证,即在不知道密码的情况下得到和输入正确密码一样的结果!
#include <stdio.h>
#include <string>
#define PASSWORD "1234567"
int verify_password (char *password)
{
int authenticated;
authenticated=strcmp(password,PASSWORD);
return authenticated;
}
int main()
{
int valid_flag=0;
char password[1024];
while(1)
{
printf("please input password: ");
scanf("%s",password);
valid_flag = verify_password(password);
if(valid_flag)
{
printf("incorrect password!\n\n");
}
else
{
printf("Congratulation! You have passed the verification!\n");
break;
}
}
return 0;
}
##
方案一
在程序的if-else语句中位置,找到je语句,把je语句改成jnz语句,使得逻辑反转。
-
使用ollydbg打开可执行文件
-
在程序调用输入函数处设置断点
-
使用F7单步步入进入函数
-
找到scanf函数并设置断点(方便后续调试)
-
找到if判断语句的汇编代码,把JE改成JNZ
-
此时右键-复制到可执行文件即可导出更改后的可执行文件,命名为test1-0.exe
-
双击运行test1-0.exe,除了原本正确答案,其他任意输入都会显示正确
方案二
修改if判断语句(valid_flag=0),使得判断条件valid_flag始终为假,这样我们输入任何字符串都将显示输入正确。
-
使用ollydbg打开test1.exe文件
-
找到并进入strcmp函数
-
在函数返回阶段找到EAX的赋值
-
更改为XOR EAX EAX使得寄存器EAX最终返回值为0
-
右键导出为新的可执行文件test1-1.exe
-
双击运行,输入任何结果都显示正确
方案三
更改跳转语句JE语句之前的判断语句CMP语句
因为CMP语句比较的是EAX和0,要使结果恒等,最简单的办法就是改为 CMP EAX EAX
-
使用ollydbg打开test1.exe文件
-
找到跳转语句前的cmp语句,更改为cmp eax eax
-
右键导出为新的可执行文件test1-2.exe
-
双击运行,任何输入结果都显示正确
现在算是入门了吧!算是了