很多仅仅只是提供了注册码的破解软件,因为有可能会连接服务器验证序列号合法性,所以有时会发生已经破解使用了一段时间的软件突然弹出提示让注册的情况。这里简单介绍一下如何屏蔽软件联网验证。
想要阻止软件连接特定服务器,就自然需要用到防火墙 首先,防火墙分为网络防火墙和应用程序防火墙,mac自带了三套防火墙ALF,PF,IPFW,还有包括第三方的Little Snitch,Hands Off!等。
应用程序防火墙:最简单最傻瓜的防火墙,根据不同的应用程序控制联网规则。 ALF:就是系统设置里面的防火墙,这个防火墙只能限制由外部向本机发起的连接,所以在这没有作用。 Little Snitch,Hands Off:商业应用程序防火墙,安装启动后一旦有程序要联网时,会给你提示,让你选择策略,这是最傻瓜的方法,如果不想往下研究一些“麻烦”的方法的话,看到这里就可以结束了。
如果你并不想要再安装一个额外的防护墙程序,那就继续往下看:
网络防火墙:根据IP地址,端口,传输协议,物理地址等信息来限制网络访问。 PF( Packet Filter):BSD家族的默认防火墙,mac从10.7开始引入,功能十分强大,可以做网络限制,NAT,QoS等。一会就用PF来屏蔽联网验证。 IPFW:老防火墙,将会废弃。 --------------------------------------- 下面就介绍步骤: 1 - 打开PortsMonitor(可选,macgg就有下载),监控当前系统所有应用程序的网络连接:
如果你想在反-反盗版的过程中不想使用盗版软件的话,也可以用我下面这个脚本:
#!/bin/bash
if [[ $1 =~ (tcp|udp) ]] || [ -z "$1" ];then
:
else
echo Wrong option!
exit 1
fi
trap 'tput clear;exit 0' 2
col=$(tput cols)
while true; do
tput clear
lsof -nPi4$1 |awk 'NR>1{split($9,ip,"->")
split(ip[1],ip1,":")
split(ip[2],ip2,":")
printf("%-10s%5s %-15s%1s%5s %1s %-15s%1s%5s %s\n",$1,$2,ip1[1],(NR>1?":":""),ip1[2],ip[2]!=""?">":"",ip2[1],length(ip2)>1?":":"",ip2[2],$10)
}'
tput cup 0 $col
sleep 2
done
在终端下运行,同样可以列出当前所有软件建立的网络连接连接(每2秒刷新一次,按ctrl-c退出) 将上面的程序保存成文件,假设起名为ports,添加执行权,运行 ./ports tcp
这里不需要看监听(LISTEN)状态的条目,只需要找建立远程连接的就可以了,例如图中一堆firefox的连接
2 - 运行你要屏蔽的软件,打开软件后观察它连接到了那些IP地址,软件在什么也不干的情况下依然还要进行连接的网络地址一般八成时验证服务器或更新服务器,你 甚至可以先不用破解附带的注册码,而是在注册窗口随便添注册码,然后观察连接(不过,这里并不保证软件一定会按你的期望去连接) 。将所有连接的IP地址记录下来。
3 - 利用免费的PF前端软件PFLists(下载),把这些IP地址添加进去(就按图中的设置)点Apply应用就可以了。
4 - 重复2和3步,因为一般软件都会有备用服务器,你屏蔽了一个IP,软件可能会用备用IP再验证。直到监控软件的连接状态只有SYN_SENT(发起握手, 但是因为屏蔽了地址,包在出本机时就DROP了,所以不会有回应,最终会TIMEOUT关闭),而不是ESTABLISHED(和远程服务器建立了连接) 即可。 例如下面这个,就是被屏蔽的状态:
5 - 最终,就是正常注册和使用了。
当然,其实方法并不止一种,如果软件连接服务器前需要经过域名解析的话,那也可以用系统自带tcpdump工具,抓DNS包获取连接的域名,然后把它放到/etc/hosts里将其定向到127.0.0.1也是可以的(连防火墙都不用了)。
最后这里其实也不仅仅局限于mac,任何操作系统都可以利用类似的方法防止软件验证,甚至去广告。
补充: 以上方法在首先检查软件建立的链接的时候是并没有屏蔽的,这样难以避免会更新一些东西, 更好地办法是,修改pflist的默认配置文件,位置在 /Applications/PFLists.app/Contents/Resources/pflists.conf 打开文件后,大概在这个位置添加这样的一行,
pass out quick proto udp from any to 8.8.8.8 port 53 keep state allow-opts
如图中我在第56行那里添加了一行,8.8.8.8是DNS地址,如果你用的不是google的DNS,则根据实际情况修改。 这行比blacklist优先级高,所以不会被屏蔽。 修改完毕后,在准备检查软件的联网地址前,在pflist的_blacklist添加0.0.0.0/0,
这样会屏蔽系统的一切网络链接,——但除了DNS解析域名, 因为检测软件的外连地址,至少也要让它知道要去连哪,否则就什么也看不到了。 接下来,开始正常检测/屏蔽步骤,此时在检测过程中,如果软件要联网验证的话,都会出于SYN_SENT等待状态 (向服务器发出请求,等待服务器回应,但是这些包还没出去就被防火墙扔掉了,所以会一直处于等待状态,直到超时。),而不是ESTABLISHED(已经建立了链接,开始传输数据)。 这样,你既知道了软件会连向哪些IP地址,又防止它真正的链接上了服务器。 最后把你要屏蔽的IP添加进_blacklist,再把0.0.0.0/0删掉即可。 最最后,值得一说的是,不少软件链接服务器不止使用一个IP,有时候需要反复试几次,把IP找全了。 不过等SYN_SENT超时是个比较“漫长”的过程,想更快速的把IP找全的方法是有,不过需要进一步修改Pflist的默认配置文件。
继续补充: 防火墙阻止网络链接有两种工作方式,一种是直接把包丢掉,会导致软件发起连接后,出于等待状态,直到超时后,关闭链接。 另一种是,由防火墙代替欲链接的服务器,给软件发送一个服务器不可达的信息,软件收到这个信息后,立刻关闭链接。 我们便可以利用两个机制来快速获取所有软件要连接的所有IP,即在黑名单中的IP让防火墙返回不可达,这样让软件快速的去尝试链接下一个IP,而对于其他一切外连,我们单纯把包丢掉,这样可以让我们更方便的发现软件在等待连接哪些IP。 方法: 还是修改PFLists的默认配置文件:/Applications/PFLists.app/Contents/Resources/pflists.conf 修改blacklist区域,将原来的
############### BLACKLIST ###############
#
block in log quick from <_blacklist> to any
block out log quick from any to <_blacklist>
#
block in log quick from <_blacklist> to any
block out log quick from any to <_blacklist>
改为
############### BLACKLIST ###############
#
block return in log quick from <_blacklist> to any
block return out log quick from any to <_blacklist
从而让我们指定的黑名单内的IP直接返回不可达,让软件快速跳过,继续连下一个IP(如果有的话)。 然后在其下方,添加:
block out quick from <allblock> to any
可以看到,这次不是在_blacklist里加入0.0.0.0/0,而是在allblock这个自定义的组里添加, 这样实现了黑名单直接返回不可达,allblock则是把包丢掉。 等检测软件联网IP完后,把0.0.0.0/0删掉即可。