如何让试用版程序永不过期
[声明:本文仅供学术研究使用,涉及所有源码按照GPLv3发布,非法使用的后果由使用者自己承担,作者已经相关文章作者不负任何责任]
即使在Linux上,我们有的时候还是不得不使用一些商业收费软件。而这些软件很多只提供了有时间限制的试用版本,试用期过后还想使用的话,要么重新安装,要么去购买使用许可。
对于一个熟练的Cracker或者一个牛B的Hacker来说呢,以稍微破坏一下法律的权威的代价获得一个没有限制的版本并不算太困难。下面提供的两个方法可以在不逆向软件的前提下,在user level做到,适合我等对汇编不感冒的同学使用。
You Xu同学曾通过ptrace的方式拦截时间相关的系统调用,返回一个假的时间来使得这些试用版程序误以为自己还没有过期,从而可以达到这个永远使用该试用版本软件的目的。我先简述他的方法,然后再提供另一个方法。
现在不妨假设存在这么一个程序,以试用期的方式来限制使用。这个程序通过调用time和gettimeofday来获取时间并且加以比较:
#include
#include
#include
int main(){
time_t now;
time(&now);
struct timeval tv;
gettimeofday(&tv, NULL);
printf("Now 1 : %s", asctime(localtime(&now)));
printf("Now 2 : %s", asctime(localtime(&tv.tv_sec)));
// you can compare time here...
return 0;
}
尝试运行一下它,显示的是当前的时间和日期,就像linux下的date命令一样:
$ gcc target.c -o target
$ ./target
Now 1 : Mon Feb 9 17:29:29 2009
Now 2 : Mon Feb 9 17:29:29 2009
下面我们使用You Xu同学的程序(由于我是i386平台,所以我做了一些小改动,我的修改版本在这里,程序比较长,就不贴了)
我改动的地方主要是针对我的i386平台的寄存器做一些改动,另外就是添加了对gettimeofday系统调用的拦截。
$ gcc faketime.c -o faketime
$ ./faketime target
argc: 2
argv: ./faketime
argv: target
exec target
addr=3216373752, data=1175737392
addr=3216373756, data=0
Now 1 : Thu Apr 5 09:43:12 2007
Now 2 : Thu Apr 5 09:43:12 2007
看上去效果不错。我的靶程序成功地回到了过去。但是下面这个方法更简单一些。但是我们需要一个so文件,伪造一下time函数和gettimeofday函数。
#include
#include
#include
struct timezone {
int tz_minuteswest; /* minutes west of Greenwich */
int tz_dsttime; /* type of DST correction */
};
time_t time(time_t *t) {
*t = 1175737392;
return (time_t)1175737392;
}
int gettimeofday(struct timeval *tv, struct timezone *tz) {
tz = NULL;
tv->tv_sec = 1175737392;
tv->tv_usec = 0;
return 0;
}
编译一下:
gcc -shared fakeload.c -o fakeload.so
需要设置LD_PRELOAD环境变量,骗骗我们那个傻X的靶程序。这样的话,fakeload.so里面的函数会在运行时取代glibc里面的原始函数。
export LD_PRELOAD="./fakeload.so"
直接运行:
$ ./target
Now 1 : Thu Apr 5 09:43:12 2007
Now 2 : Thu Apr 5 09:43:12 2007
有趣的是在freshmeat上还专门有个project叫Faketime Preload Library是干这个事儿的。但是是为了解决千年虫问题,呵呵。
牛!长见识了,原来可以这么Crack!