| 关键词: 断点 函数 机器码 程序 寄存器 FUNCTION ADDR info 观察点 gdb |
作者:I007 (阿健)来源:BBS 水木清华站/邪恶八进制 其实自已也只破解过一个Linux的程序: MTV Player 1.0.6.6, 所以这只是个人的一点经验,欢迎大家交流, 我的email是: [email protected] 那就言归正传罗: linux的破解(i386)相对于其它unix下的破解自然要容易一些,因为大家对于8086系列的结构以及汇编多少都有些了解。不过对于第一次做linux下的破解,还是让人感到富有挑战而又令人兴奋的.要动手破解,除了破解本身的乐趣外,动力多半还是来自被破解对象--应用程序的诱惑, 我就是被mtv player的功能给吸引了,又不满它每次只放一小会就静音了, 于是乎我抄起了家伙---gdb 老实说,原来没怎么用过gdb, 经常是通过xwpe间接的用,于是当时就抱了抱佛脚。gdb主要是针对源程序的调试除错的,对汇编级的支持的并不好(最不好的就是没有类似debug中的a命令,没法汇编),对于破解,gdb常用的命令有:info target 显示当前目标的一些信息,包括一些分段的信息info functions 可以列出所有定义的函数名和数据类型,相当有用,有的程序检查系列号和License会在一个名称明确的函数里info functions REGEXP 可以列出匹配正规表达表的函数info registers 列出所有寄存器(除浮点)的值, 这个跟踪时自然常用到info all-registers 列出所有寄存器(包括浮点)的值info registers REGNAME... 列出所指出的所有寄存器的值info break 列出所有的断点和观察点break *ADDR 在地址ADDR处设置断点break FUNCTION 在函数FUNCTION处设置断点clear FUNCTION 删除在函数FUNCTION入口处的断点delete BNUMS 删除BNUMS指定序点的断点或观察点backtrace(bt) 显示堆栈中的信息,也很有用,可以在调试中搞清楚当前的调用关系x/NFU ADDR 这个也是常用,N:重复数, F:显示格式,s字串,i机器码,缺省是x十六进制数, U:单元大小,b字节,h半字(两字节),w字(四字节,缺省)ADDR为地址,如 x/3uh 0x54320set $REGNAME=VALUE 设定寄存器REGNAME的值为VALUE,还可以是set $sp += 4这样的让sp加4set {TYPE}ADDR=VALUE 将地址ADDR的TYPE类型的值设为VALUE,例如:set {int}0x83040=4nexti(ni) 执行一行机器码,如果是函数调用,则执行到函数返回stepi(si) 执行一行机器码,如果是函数调用,则进入函数disassemble FUNCTION 反汇编FUNCTION函数disassemble ADDR1 ADDR2 反汇编ADDR1和ADDR2间的机器码disassemble ADDR 反汇编ADDR所在的函数run(r) 开始执行程序到第一个断点或程序结束continue(c) 继续程序的执行到下一断点或程序结束continue(c) IGNORE-COUNT 继续程序的执行并忽略掉IGNORE-COUNT个断点,在第IGNORE-COUNT+1个断点停下或程序结束 正式开工了: 运行mtv,首先出现的是对话框,要求"Enter Key"或是"Try it!",选"Enter Key",填写了资料后,提示注册信息不正确, 显然这其中做了Key的合法性检查,于时选中这里做突破口: $ gdb mtvGNU gdb 4.17Copyright 1998 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and you arewelcome to change it and/o |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|