魅力博客

魅力Linux|魅力空间|魅力博客|学习Linux|ubuntu日记|电脑教程|手机软件

OD教程未提及的重要技巧补充



OD,软件名称,反汇编工具OD=OllyDebug,一个新的动态追踪工具,将IDA与SoftICE结合起来的思想,Ring 3 级的调试器,己代替SoftICE成为当今最为流行的调试解密工具了.同时还支持插件扩展功能,是目前最强大的调试工具。基本上,调试自己的程序因为有源码,一般用vc,破解别人的程序用DllyDebug。

od 命令用途:以指定格式显示文件。

语法

  使用字符串类型显示文件,来格式化输出。

  od [ -v ] [ -A AddressBase ] [ -N Count ] [ -j Skip ] [ -t TypeString ... ] [ File ... ]

  使用标志显示文件,来格式化输出。

  od [ -a ] [ -b ] [ -c ] [ -C ] [ -d ] [ -D ] [ -e ] [ -f ] [ -F ] [ -h ] [ -H ] [ -i ] [ -I ] [ -l ] [ -L ] [ -o ] [ -O ] [ -p ] [ -P ] [ -s ] [ -v ] [ -x ] [ -X ] [ [ -S [ N ] ] [ -w [ N ] ] [ File ] [ [ + ] Offset [ . | b | B ] [ + ] Label [ . | b | B ] ]

描述

  od 命令用指定格式显示由 File 参数指定的文件。如果 File 参数没有给定, od 命令读取标准输入。 使用多个 -bcCDdFfOoSstvXx 选项可以指定多个类型。

  在第一个语法格式中,输出格式是由 -t 标志指定。如果没有指定格式类型,-t o2 是缺省值。

  在第二个语法格式中,输出格式由标志组合指定。Offset 参数指定了文件中文件输出的开始点。 缺省情况下,Offset 参数解释为八进制字节。如果附加了 . 点后缀, 参数解释为十进制的;如果参数前导以 x 或 0x 开始,处理为十六进制。如果 b 后缀添加到参数,解释为块是 512 字节;如果 B 后缀添加到参数上,解释为块是 1024 字节。

Label 参数

  Label 参数解释为首字节显示的伪地址。 如果使用了该参数,它在 () 括号中给出,遵循 Offset 参数。 相对于 Offset 参数,后缀有同样的意义。

  当 od 命令读取标准输入时, Offset 参数和 Label 参数前头必须有个 + (加号)。

环境变量

  环境变量的设置如 LANG 和 LC_ALL 影响着 od 命令的操作。 要获取更多信息,请参阅《AIX 5L V5.2 系统管理指南:操作系统与设备》中的『理解环境变量的语言环境』 。

标志

  第一种格式的标志:

  -A AddressBase 指定输入偏移底数。此 AddressBase 变量是下列的字符之一:

  d

  偏移底数写为十进制的。

  o

  偏移底数写为八进制的。

  x

  偏移底数写为十六进制的。

  n

  偏移底数没有显示。

  除非指定 -A n,输出行前将有需要写的下一字节的输入偏移量,输入偏移量在输入文件间会形成。 另外,跟随在最后一个字节的字节偏移量将在所有的输入数据处理完后显示。没有 -A 基地址选项和 [offset_string] 操作数,输入偏移量底数以八进制显示。

  =

使用方法

  -j Skip

  在开始显示输出前,跳跃过由 Skip 变量给定的字节数。 如果指定的文件超过一个,od 命令在显示输出前跳跃过分配的连接输入文件字节数。 如果混合输入不是至少跳跃字节的长度, od 命令将写出诊断消息给标准错误,并退出非零状态。 Count 选项参数

  缺省情况下,Skip 变量的值解释为十进制数字。 带有前缀 0x 或 0X, 偏移量解释为十六进制数;带有前缀 0,偏移量解释为八进制数。 如果字符 b,k,或者 m 附加到 Skip 变量包含的数,偏移量在字节上等于 Skip 变量各自乘以 512,1024,或者 1024*1024 的值。

  -N Count 格式不超过由 Count 变量指定的输入字节数。缺省情况下,Count 变量解释为十进制数。带有前缀 0x 或者 0X,认为是十六进制数。 如果以 0 开始,认为是八进制数。 显示地址的底数不是由 Count 选项参数的底数提示的。

  -t TypeString 指定输出类型。TypeString 变量是一个当写出数据时,指定使用类型的字符串。 多个类型能够连接在同一个 TypeString 变量中, 并且 -t 标志能够多次指定。 对于每个指定的类型写出了输出行, 依照给定类型指定字符的顺序。TypeString 变量能够包括下列字符:

  a

  显示字节为指定的字符。在 0 到 01777 范围内,带有至少 7 位的字节,对于那些字符,用相应的名称来写。

  c

  显示字节为字符。 由 c 类型字符串变换的字节数由 LC_CTYPE 本地类别确定。可打印的多个字节字符的写法对应于字符的第一个字节;两个字符序列 ** 的写法对应于字符中每个保留的字节,作为字符继续的指示。下列非图形字符作为 C- 语言转义序列使用:

  \ 反斜杠

  \a 提示符

  \b 退格符

  \f 换页

  \n 换行字符

  \0 空

  \r 回车符

  \t 制表符

  \v 垂直制表符

  d

  显示字节为有符号十进制。缺省情况下,od 命令变换相应的字节数为 C -语言类型 int。d 类型字符串能够跟随无符号的十进制整数,它指定了由每个输出类型实例变换的字节数。

  可选的项 C,I,L,或者 S 字符能够附加到 d 可选项,表示转换应该分别适用于 char,int,long,或者 short。

  f

  显示字节为浮点。缺省情况下,od 命令变换相应的字节数为 C - 语言类型 double。 f 类型字符串能够跟随无符号的十进制整数,它指定了由每个输出类型的实例变换的字节数。

  可选项 F,D,或者 L 字符能够附加到 f 可选项,表示转换应该分别适用于类型 float,double,或者 long double。

  o

  显示字节为八进制。 缺省情况下, od 命令变换相应的字节数为 C - 语言类型 int。 o 类型字符串能够跟随无符号的十进制整数,它指定了由每个输出类型实例变换的字节数。

  可选项 C, I,L,或者 S 字符能够附加到 o 可选项,表示转换应该分别适用于类型 char,int,long,或者 short。

  u

  显示字节为无符号的十进制。缺省情况下,od 命令变换相应的字节数为 C-语言类型 int。u 类型字符串能够跟随无符号的十进制整数,它指定了由每个输出类型的实例变换的字节数。

  可选的项 C,I,L,或者 S 字符能够附加到 u 可选项,表示转换应该分别适用于 char,int,long 或者 short。

  x

  显示字节为无符号的十六进制。缺省情况下,od 命令变换相应的字节数为 C-语言类型 int。x 类型字符串能够跟随无符号的十进制整数,它指定了由每个输出类型实例变换的字节数。

  可选的项 C,I,L,或者 S 字符能够附加到 x 可选项,表示转换应该分别适用于 char,int,long 或者 short。

  第二种格式的标志:

  -a 显示字节为字符,并且用它们的 ASCII 名称显示。如果 -p 标志也给定了,带有偶校验的字节加下划线。 -P 标志引起带有奇校验的字节加下划线。 否则忽略奇偶性校验。

  -b 显示字节为八进制值。

  -c 显示字节为 ASCII 符。下列非图形字符作为 C-语言转义序列使用:

  \ 反斜杠

  \a 提示符

  \b 退格符

  \f 换页

  \n 换行字符

  \0 空

  \r 回车符

  \t 制表符

  \v 垂直制表符

  其它表示为 3 位的八进制数。

  -C 显示扩展字符作为标准打印 ASCII 字符(使用合适的字符转义),并且以十六进制格式显示多字节字符。

  -d 显示 16 位字为无符号十进制值。

  -D 显示长字为无符号十进制值。

  -e 显示长字为双精度、浮点。(如同 -F 标志)

  -f 显示长字为浮点。

  -F 显示长字为双精度、浮点。(如同 -e 标志)

  -h 显示 16 位字为无符号十六进制。

  -H 显示长字为无符号十六进制值。

  -i 显示 16 位字为有标记十进制。

  -I (大写 i)显示长字为有标记十进制值。

  -l (小写 L)显示长字为有标记十进制值。

  -L 显示长字为有标记十进制值。

  注意: 标志 -I(大写 i),-l(小写 L), 和 -L 是相同的。

  -o 显示 16 位字为无符号八进制。

  -O 显示长字为无符号八进制值。

  -p 表示对 -a 转换进行偶校验。

  -P 表示对 -a 转换进行奇校验。

  -s 显示 16 位字为有标记十进制值。

  -S[N] 搜索以空字节结束的字符的字符串。 N 变量指定了需标识的最小长度的字符串。如果 N 变量省略了,最小长度缺省值为 3 个字符。

  -v 标志对于下列两种格式是一样的:

  -v 写所有输入数据。 缺省情况下, 等同于先前输出行的输出行没有打印,但是用只包含 * (星号)的行替换。 当指定 -v 标志时,打印所有的行。

  -w [N] 指定需解释并且在每个输出行显示的输入字节的数量。 如果 -w 标志没有指定,每一显示行读取 16 字节。 如果指定了 -w 标志没有带 N 变量,每个显示行读取 32 个字节。 最大输入值是 4096 字节。 大于 4096 字节的输入值将重新分配最大值。

  -x 显示 16 位字为十六进制值。

  -X 显示长字为无符号十六进制值。(如同 -H 标志)

  退出状态

  此命令返回下列出口值:

  0 所有输入文件被成功处理。

  >0 出现错误。

示例

  1. 以八进制显示文件,一次显示一页,请输入:

  od a.out | pg

  此命令以八进制格式显示 a.out 文件并且通过 pg 命令管道输出。

  2. 一次转换文件为数个格式,请输入:

  od -t cx a.out > a.xcd

  此命令把 a.out 文件的内容,以十六进制格式(x)和字符格式(c)写到 a.xcd 文件中。

  3. 在中间开始显示文件(使用第一语法格式),请输入:

  od -t acx -j 100 a.out

  此命令把 a.out 文件以指定的字符(a)、字符(c)和十六进制(x)格式显示,从第 100 个字节开始。

  4. 在文件中间启动(使用第二种语法格式),请输入:

  od -bcx a.out +100.

  把 a.out 文件以八进制字节(-b)、字节(-c)和十六进制(-x)格式显示,从第 100 个字节开始。偏移量后的 . (点)表示它是十进制数。没有点,输出将从第 64(八进制为 100)个字节开始。

  文件

  /usr/bin/od 包含od 命令。

OD教程未提及的重要技巧补充

在OD调试软件过程中,我们除了掌握好汇编,进行一些常见语句的分析之外,最重要的是对寄存器、内存单元及堆栈的一些变量进行动态监视,这可以帮我们很好的了解在关键CALL处序列号的计算过程,对我们分析算法大有裨益.但我看遍了看雪学院所有关于OD的教程,没有发现一个对此功能有详细解释的教程,可能大侠们都不屑于这种简单的东西吧,但很多初学者又很迷茫,堆栈在反复压入弹出,我们每走一条指定都要反复拉堆栈窗口进行查看,很不方便,现将我在研究OD过程中的一点小经验给所有初用OD的cracker爱好者.
一、如何有效有查看堆栈的值?
       右下角窗口右击,点地址->相对于EBP(当然你也可以相对于ESP,要看你的功能需求),一般我们调试的窗口取得的用户名和密码都放在ebp-4或ebp-8处,所以相对于EBP这样可以快速的找到你要的东西.你可以上下翻到找到调试窗口中的EBP-XX或ebp+XX,如果跑的太远想重回EBP,可以右击,点转到EBP,这样操作相当的方便
二、如果用监视(watches)窗口?
    这也是一个相当有用的功能,你可以在里面输入各种内存单元,堆栈单元和寄存器进行全程动态跟踪。方法是点菜单查看->监视调出监视窗口,然后在里面右击选添加监视,例如你想对eax寄存器进行监视,可以直接输入eax(有朋友说你有毛病吧,eax我在右边窗口可以看到,当然有时如果eax要和其它内存单元比较的话,把他们俩同时添加到一个地方,看着更舒服一点,如果你不介视你眼睛看成散光或脖子扭出毛病,你可以来回转动),其它寄存器也一样按名添加就可以了;你也可以输入[ebp-4]这样的表达式来监视堆栈,也可以输入00129FC0这样的表达式来监视内存区。你还可以右击点watchman然后选set watches,点ebp+x单选钮在下面框里输入4和18对ebp+4到ebp+18监视连续的堆栈区。当然最后一步一定不能忘,右击,界面选项->总在最前,把这个监视窗一定钉到左下角(当然也可以是别的位置,随自己的爱好),这样你在调试程关键CALL时,所有你关心的值可以动态的显示在这个窗口里,一目了然,怎么样,是不是爽多了。当然如果你可以随时改变或删除某个监视表达式,在这个监视窗口里右击选编辑监视和删除监视就可以了。

好了,就写到这儿吧,但愿我的努力能给所有初学破解的朋友带来方便,有关于OD使用教程的补充请看贴的朋友顶贴后期待,我也期待着看雪兄能加精鼓励一下小狐,因为我们的论坛的目的是交流技术,而技术理论的进步,将会成就一大批新人.

本文转自看雪论坛:http://bbs.pediy.com/showthread.php?p=412205

本文仅供技术学习探讨交流之用,请勿用于非法用途。



返回顶部

发表评论:

Powered By Z-BlogPHP 1.7.3


知识共享许可协议
本作品采用知识共享署名 3.0 中国大陆许可协议进行许可。
网站备案号粤ICP备15104741号-1