@shellex说: 有个idea,马克一下,明早起来试试,大家晚安。

如何让试用版程序永不过期

[声明:本文仅供学术研究使用,涉及所有源码按照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是干这个事儿的。但是是为了解决千年虫问题,呵呵。

  1. On February 9, 2009 at 7:08 pm

    牛!长见识了,原来可以这么Crack!

    Notify
  2. On February 9, 2009 at 8:37 pm

    @TualatriX,
    可能是Linux版本软件的验证不够严密。
    Windows上一般可不会这么容易被crack。

    Notify
  3. On February 9, 2009 at 8:52 pm

    linux比较方便改kernel。windows下要拦截中断得进ring0,2k之后就很难玩这个了。windows下我偏向于用ollydbg动态调试改跳转,感觉上百分之八十以上的软件都能通过改跳转或在内存搜注册码搞定。

    Notify
  4. On February 9, 2009 at 9:09 pm

    @HicroKee,
    Windows下的话,Ring 3下还是可以玩玩API Hook的。修改API jmp地址或者修改IAT表。
    嗯,你说的没错,Windows下一般通过逆向搞定。

    Notify
  5. On February 9, 2009 at 9:14 pm

    windows就是被api hook 搞坏了,好好的提供api出来不就很好了?

    Notify
  6. On February 9, 2009 at 9:30 pm

    @HicroKee,
    大部分都供出了的。但是大家不知足阿,所以就挖掘挖掘挖掘…
    关键是哈,微软某些关键API没供出来,而且哈,某些机制对开发者也不友好,所以偶们只好发挥下聪明才智…hack一下

    Notify
  7. On February 10, 2009 at 4:53 pm
    dustman :

    win下先分析注册表 不行就分析反汇编 爽

    Notify
  8. On February 10, 2009 at 9:57 pm

    @dustman,
    RegMon,FileMon,ollydbg,IDA,都是Cracker必备软件了。

    Notify
  9. On February 11, 2009 at 8:37 am
    dustman :

    @shellex, 什么时候有空教我下破解嘛

    Notify
  10. On February 11, 2009 at 12:04 pm
    shellex :

    @dustman,
    我不是Cracker阿

    Notify
  11. On February 14, 2009 at 2:31 pm
    山猫 :

    @shellex, 可是 Linux 下用不着费心拦截啊,
    简单 LD_PRELOAD 就可以了

    Notify
  12. On February 14, 2009 at 2:52 pm

    @山猫,
    但是LD_PRELOAD不一定对所有程序都有效咩..

    Notify

Leave a Reply