• 标 题:转贴一个,linux 解密,www.zoudan.com (8千字)
  • 作 者:菜鸟[BCG]
  • 时 间:2001-4-14 19:20:05
  • 链 接:http://bbs.pediy.com

AccelerateX5.0DEMO版之破解心得
    网管中心的bbs服务器是基于RedHat5.1的Linux系统。作为临时bbs管理员,一天坐
在那里上比比哀思真的是很无聊。于是想用Xwindows来上万维网。但着台服务器偏偏是
讨厌的Sis 6236显卡,Xwindows根本就用不起,于是在沉淀的ftp上下了一个AccelerateX5.
0DEMO版。安装倒是非常的顺利,但讨厌的DEMO版非要在99年1月4号以前用。我把服务器的日
期调到1月4号之前则可以用,且效果很好!但作为bbs服务器,日期之重要,日期一变非但发
表文章不正常,每日排行榜也不能正常工作。那如何解决这个问题呢?把它搞定!!这么多
程序都是我可以轻松搞定的,区区一个AX算得了什么!在重起了N次gdb,重设了N次break
*0x804bxxx之后终于找到了关键的地方!千万不要以为断点是很好找的,特别是在Linux下。
找断点的功力需要在实践中长期练就,想当年的LOCK 89,90,91,95 NT,BitLOK,KeyMake
,LockMaster......都是在反跟踪措施非常严密的情况下步步跟踪到核心的。现在的程序有
个暴好的优点,那就是统统没有反跟踪代码!可以说是去除了破解软件的最大的困难,难度
从而降低了95%!那在Linux破解还有什么难度呢?难度是大大的,那就是:在Linux这种不太
成熟的操作系统下,连调试软件也是极其的难用!哪像Win95/DOS下大名鼎鼎的Soft-ice,
Turbo Debugger......像察看内存,修改内存这样的基本功能都没有!TMD!还有就是gdb下的
反汇编太伤脑筋了,看惯了Soft-ice和Debug下的汇编,看gdb下的真是像天书!还好,我功力
深厚,办法多:-)
    来吧,切入正题,试试身手!
    先启动Linux(废话),登录(又是废话),取得一定权限(如果你是root,那就方便多了,
俗话说得好“我是root我怕谁” xxx语)!
    先看看你的AX50DEMO和我的一不一样!跟着作吧:-)
[~/]#cd /usr/X11R6/lib/X11/AccelerateX/bin
[/usr/X11R6/lib/X11/AccelerateX/bin]#gdb Xaccel-glibc    ;用gdb调入AX50DEMO主程序
GNU gdb 4.17
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux"...
(no debugging symbols found)...
(gdb)disass _start        反汇编函数 _start(Linux下的程序基本上都是以_start
                            或_init开始的)

Dump of assembler code for function _start:
0x804b520 <_start>:    xorl %ebp,%ebp
0x804b522 <_start+2>:    testl %edx,%edx
0x804b524 <_start+4>:    je 0x804b52d <_start+13>
0x804b526 <_start+6>:    pushl %edx
0x804b527 <_start+7>:    call 0x804b214 <atexit>
0x804b52c <_start+12>:    popl %eax
0x804b52d <_start+13>:    call 0x804ae24 <__libc_init_first>
0x804b532 <_start+18>:    popl %esi
0x804b533 <_start+19>:    leal 0x4(%esp,%esi,4),%eax
0x804b537 <_start+23>:    movl %eax,0x80d33d8
0x804b53c <_start+28>:    movl %esp,%edx
0x804b53e <_start+30>:    andl $0xfffffff8,%esp
0x804b541 <_start+33>:    pushl %eax
0x804b542 <_start+34>:    pushl %eax
0x804b543 <_start+35>:    pushl %edx
0x804b544 <_start+36>:    pushl %esi
0x804b545 <_start+37>:    call 0x804a750 <_init>
0x804b54a <_start+42>:    pushl $0x80c3bb0
0x804b54f <_start+47>:    call 0x804b214 <atexit>
0x804b554 <_start+52>:    popl %eax
0x804b555 <_start+53>:    call 0x804c96c <_start+5196>
0x804b55a <_start+58>:    pushl %eax
0x804b55b <_start+59>:    call 0x804b324 <exit>
0x804b560 <_start+64>:    hlt
0x804b561 <_start+65>:    nop
0x804b562 <_start+66>:    nop
0x804b563 <_start+67>:    nop
0x804b564 <_start+68>:    pushl %ebp
0x804b565 <_start+69>:    movl %esp,%ebp
0x804b567 <_start+71>:    cmpl $0x0,0x80cdd8c
0x804b56e <_start+78>:    jne 0x804b5a3 <_start+131>
0x804b570 <_start+80>:    jmp 0x804b585 <_start+101>
0x804b572 <_start+82>:    movl %esi,%esi
0x804b574 <_start+84>:    addl $0x4,0x80cdd88
0x804b57b <_start+91>:    movl 0x80cdd88,%eax
0x804b580 <_start+96>:    movl 0xfffffffc(%eax),%eax
0x804b583 <_start+99>:    call *%eax
0x804b585 <_start+101>:    movl 0x80cdd88,%eax
0x804b58a <_start+106>:    cmpl $0x0,(%eax)
0x804b58d <_start+109>:    jne 0x804b574 <_start+84>
0x804b58f <_start+111>:    pushl $0x80d2bd4
0x804b594 <_start+116>:    call 0x80c397c <cbrt+3660>
0x804b599 <_start+121>:    movl $0x1,0x80cdd8c
0x804b5a3 <_start+131>:    leave
0x804b5a4 <_start+132>:    ret
0x804b5a5 <_start+133>:    leal 0x0(%esi),%esi
0x804b5a8 <_start+136>:    pushl %ebp
0x804b5a9 <_start+137>:    movl %esp,%ebp
0x804b5ab <_start+139>:    leave
0x804b5ac <_start+140>:    ret
0x804b5ad <_start+141>:    leal 0x0(%esi),%esi
        .......
        .......
        .......
0x804b776 <_start+598>:    movl $0x63,0xffffef5c(%ebp)
0x804b780 <_start+608>:    movl $0x3,0xffffef58(%ebp)
0x804b78a <_start+618>:    movl $0x1,0xffffef54(%ebp)
0x804b794 <_start+628>:    movl $0x0,0xffffef50(%ebp)
0x804b79e <_start+638>:    movl $0x0,0xffffef4c(%ebp)
0x804b7a8 <_start+648>:    movl $0x1,0xffffef48(%ebp)
0x804b7b2 <_start+658>:    movl $0xffffffff,0xffffef68(%ebp)
0x804b7bc <_start+668>:    pushl %eax
0x804b7bd <_start+669>:    call 0x804ade4 <mktime>    ;获得时间
0x804b7c2 <_start+674>:    addl $0x4,%esp
0x804b7c5 <_start+677>:    cmpl $0xffffffff,%eax        ;调用成功否?eax为返回值
0x804b7c8 <_start+680>:    je 0x804b7d2 <_start+690>
0x804b7ca <_start+682>:    cmpl %eax,0xffffeaec(%ebp)
0x804b7d0 <_start+688>:    jle 0x804b7dc <_start+700>    ;小于则转到_start+700
0x804b7d2 <_start+690>:    pushl $0xffffffff        ;失败标志'-1'入栈
0x804b7d4 <_start+692>:    call 0x804c948 <_start+5160>    ;失败处理并退出   
0x804b7d9 <_start+697>:    addl $0x4,%esp
0x804b7dc <_start+700>:    pushl $0x13880000        ;进入主程序
0x804b7e1 <_start+705>:    call 0x804ed80 <_start+14432>
0x804b7e6 <_start+710>:    addl $0x4,%esp
0x804b7e9 <_start+713>:    testl %eax,%eax
0x804b7eb <_start+715>:    jne 0x804b7fa <_start+730>
0x804b7ed <_start+717>:    pushl $0x80c3ce4
0x804b7f2 <_start+722>:    call 0x8092674 <ffs+221348>
0x804b7f7 <_start+727>:    addl $0x4,%esp
        .......
        .......
        .......
q                这是退出命令
[/usr/X11R6/lib/X11/AccelerateX/bin]#
    既然关键的地方找到了!那就该改原代码了。在dos/win95下要改代码很简单,先获得
指令的16进制代码,在调试器或16进制编辑器中查找到直接改掉即可!但在Linux下就......
还好我还没把我的M$ dos和Win95丢掉。跟着我作吧!
[/usr/X11R6/lib/X11/AccelerateX/bin]#mount /dev/fd0 -tvfat /mnt/fd ;插入软盘把软驱
    蟒上(在目录/mnt/fd)
[/usr/X11R6/lib/X11/AccelerateX/bin]#cp Xaccel-glibc /mnt/fd    ;把主文件考到软盘上
[/usr/X11R6/lib/X11/AccelerateX/bin]#umount /dev/fd0          ;卸下
        (或直接把dos/win95的分区mount上,拷贝之,如果管理员给了你这个权限)
    重起计算机或换台计算机,把软盘上的程序考到硬盘上!启动我最喜爱的,大名鼎鼎的
,最拉风的,最芭腊的Soft-ice(千万不要告诉我你不会启动Soft-ice,我cow,信不信我一刀
捅死你)!用Soft-ice的装入器(一般是Symbol Loader.exe)随便调入一个32为的程序(如calc.
exe).用a命令(汇编)把关键部分的指令(就是上面写的,但要翻译成一般的汇编格式)输入:
    xxxxxxxx:cmp [ebp+0ffffeaec],eax    ;就是cmpl %eax,0xffffeaec(%ebp)啦
    xxxxxxxx:jle XXXXXXXX            ;XXXXXXXX乱填
    xxxxxxxx:jge XXXXXXXX            ;XXXXXXXX乱填
在用code on命令把指令的16进制代码显示出来!
    xxxxxxxx:3985eceaffff    cmp [ebp+0ffffeaec],eax   
        ~~~~~~~~~~~~记下该16进制代码   
    xxxxxxxx:7exx        jle XXXXXXXX
        ~~~~~~~~~~~~记下该16进制代码   
    xxxxxxxx:7dxx        jgl XXXXXXXX
        ~~~~~~~~~~~~记下该16进制代码   
用exit命令强行退出(会获得一个非法指令错误,不理它)
    看到这里,看官们都知道了,只要把jle 0x804b7dc <_start+700>改成
                    jge 0x804b7dc <_start+700>就可以了!
    也就是把7e改成7d即可!
    有人会说原理好~简单,但步骤好~复杂!我也没更好~办法,其实破解Linux程序的一般步
骤就只有这样了,将就用吧!但是看官你需要作的很简单:
    1。把主程序Xaccel-glibc考到硬盘上
    2。用不管什么编辑器修改,查找3985eceaffff7e,改为3985eceaffff7d,存盘。
    3。把Xaccel-glibc考回去,覆盖之
   
    好了好了!写这么多字,好辛苦哟(我打字极慢,用全拼,还分不清前鼻音后鼻音,卷
舌音,翘舌音......痛苦异常,速度可想而知,!)这全是为了全xx类,为了我国的xx技术,为
了早日实现xx的现代化......
    上篇大作不知各位看了没有,没看?那肯定4月26日遭惨了!还不看?“Cih1.4病毒之
中文详解”,快去下吧:ftp://202.115.32.2/incoming/tpo/cih14.asm或到我的主页上去瞧瞧:
http://bbs.scu.edu.cn/~tpo好东西多多哟(Email:zd_dan@263.net)!
    鉴于cih病毒再次的爆发流行和4月26日的惨痛教训,我决定把cih病毒的发作模块好身
剖析一下,再把遭cih清洗的硬盘的恢复方法好好研究一下,写成文章张贴出来!
    各位看官,敬请期待我的大作吧!下次再见咯!