注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

风雨夜归人

专业收集资料,个人爱好!

 
 
 

日志

 
 

IDA简易教程  

2009-09-10 06:43:10|  分类: 破解 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 

 

第一节:C语言的小程序

为了演示IDA的功能先写一段小程序。(代码在附录)程序在此 源代码

程序执行结果:

CUSTOMERS:

CUSTOMER 0001: Peter (m)

CUSTOMER 0002: John (m)

CUSTOMER 0003: Mary (f)

PRODUCTS:

PRODUCT 0001: BOOK: IDA QuickStart Guide

PRODUCT 0002: SOFTWARE: IDA Pro: PC; WINDOWS DOS; DISASSEMBLY

PRODUCT 0003: SOFTWARE: PhotoRescue: PC MAC; WINDOWS OS-X; RECOVERY

PRODUCT 0004: SOFTWARE: aCrypt: PC; WINDOWS; CRYPTOGRAPHY

                                                               TOP

----------------------------------------------------------------------

第二节:基本类型的识别

用IDA分析我们前面的程序,我们会发现下图的类型

IDA简易教程 - 白云飘飘 - Louis333风雨夜归人

只要按"D"我们就可以任意转换这些不确定的类型.可以变成byte,word,dword(db,dw,dd)。

当然你也可以设置更多的数据转换类型:

选择“Options”菜单的“Setup data types”命令就可以设置了

IDA简易教程 - 白云飘飘 - Louis333风雨夜归人

值得注意的是:你在数据转换的时候,它是依据数据自身的结构来转换的。我们按“D”的时候,

如果下一个字节已经被你转换过,你的本次转换,IDA将会提示让你确认。

IDA简易教程 - 白云飘飘 - Louis333风雨夜归人

注:如果你想改变这种默认设置可以在“Options”菜单“Convert already defined bytes”命令里设置

IDA简易教程 - 白云飘飘 - Louis333风雨夜归人

撤销你的所有转换按“U”键。

                                                            TOP

-------------------------------------------------------------------------------------

第三节:操作数格式

数据类型自定义转换后,被操作过的数据(就是你按过“D”的)的进制IDA也是可以自定义转变的,

通过在“Operands”工具栏的“Number”命令我们可以随意转换数字的进制

IDA简易教程 - 白云飘飘 - Louis333风雨夜归人

最下面的“Toggle leading point”就是填补数据前的空位为0(就是说如果当前数据未占满数据格式的所有位高位用0来填补)

IDA简易教程 - 白云飘飘 - Louis333风雨夜归人

IDA还可以转换数据的标志位(就是正负)具体操作如下图:

IDA简易教程 - 白云飘飘 - Louis333风雨夜归人

 

最后呢~~如果这些转换你还不满意(够BT)当然你还可以自定义数据进制如图:

IDA简易教程 - 白云飘飘 - Louis333风雨夜归人

                                                                TOP

-----------------------------------------------------------------------------------------

第四节:字符和字符串的操作

 

作者又说话了:很多程序都是包含字符串的,一些被操作过的数据(就是你按过“D”的)可以转化为

字符,使用的命令就在“Operands”工具栏上

IDA简易教程 - 白云飘飘 - Louis333风雨夜归人

 

由于编程语言的不同造成字符串也有不同的格式,当然IDA就支持所有的格式了。

IDA在转化后会在地址添加一个名字。因为我们的程序是c的所以就找到c的字符串。具体操作如图:

IDA简易教程 - 白云飘飘 - Louis333风雨夜归人

如果不是C写的程序怎么办呢?我们可以在“Options”菜单“ASCII string style”命令中设置。

允许你修改其它类型为默认设置,使用默认设置的快捷键是“A”,或者自定义一种类型可以使用不常用的

终止字符。

IDA简易教程 - 白云飘飘 - Louis333风雨夜归人

                                                                    TOP

--------------------------------------------------------------------------

第五节:数组

在c中,ASCII字符串被认为是字符数组,IDA是如何处理数组的呢?

我们用最常用命令来定义数组中的第一个元素,设置第一个元素类型为byte,格式为char,然后点击“*”号键(或者“Edition ”工具栏的“Array”命令)来创建数组。这时弹出一个对话框,可以设置很多变量。

IDA简易教程 - 白云飘飘 - Louis333风雨夜归人

你可以定义数组一行的显示个数,还可以使用“Element width”来设置他们之间的宽度。

使用“Use dup construct ”选项可以合并连贯的相似字节,“ Display index ”选项可以像注释一样显示

数组的下标。

例如我们设置一个有64个元素的数组,一行有8个元素,每个元素之间的宽度为4,不选取“dup constructs”,选取“Display index ”,我们就可以得到下面的数组。

IDA简易教程 - 白云飘飘 - Louis333风雨夜归人

当IDA遇到未被识别的字节他会用红色的高亮显示。

当然你也可以选择一个范围来创建数组,IDA会自适应的设定。

IDA简易教程 - 白云飘飘 - Louis333风雨夜归人

                                                                            TOP

------------------------------------------------------------------------------------

第六节:枚举类型

还记得我们在C程序中定义的product_category_t 类型吗?

让我们用IDA的“Enumerations”来定义一下。

首先,我们打开“Enumerations”窗口来创建一个新的枚举类型

IDA简易教程 - 白云飘飘 - Louis333风雨夜归人

 

我们输入我们的枚举类型值

IDA简易教程 - 白云飘飘 - Louis333风雨夜归人

 

在check_product()函数,我们可以用枚举类型重新定义一些操作数。

右键点击在数值上,就会弹出一个菜单,选择“Symbolic constant”。

IDA就会自动列举枚举值,用以匹配当前的数值。

IDA简易教程 - 白云飘飘 - Louis333风雨夜归人

 

操作完成,我们就会得到下面的结果:

IDA简易教程 - 白云飘飘 - Louis333风雨夜归人

                                                                                                TOP

-----------------------------------------------------------------------------------------------------

TOP

---------------------------------------------------------------------------------------------------------

第八节:结构体

我们的程序当中包含了很多结构体。现在让我们来在IDA中描述一下结构体,

看看是怎么提高汇编代码的可读性。

第一步,我们必须打开Structures 窗口,来创建一个新的结构体类型。

IDA简易教程 - 白云飘飘 - Louis333风雨夜归人

结构体的成员是一汇编的模式定义的。让我们来定义software_t 结构中的第一个成员。

一直按“D”知道它变成“dd”意思就是这个成员的值为 dword类型。

把它的格式定义为我们以前定义好的software_info_t 枚举类型,然后我们用Rename命令输入一个适当的名字:info

IDA简易教程 - 白云飘飘 - Louis333风雨夜归人

开始定义第二个成员,这次使用ASCII命令(按“A”),在这个环节

IDA会弹出一个专用对话框用来设定字符串的大小

IDA简易教程 - 白云飘飘 - Louis333风雨夜归人

我们还可以从已经分析好的数据中来建立结构体。

举个例子:假设我们选择了一块数据正好是和我们的customer_t结构体的数据格式一样,我们就可以用IDA的“Create struct from data ”命令来创建结构体

IDA简易教程 - 白云飘飘 - Louis333风雨夜归人

 

一旦使用了这个命令,IDA就会在Structures窗口创建一个相对应的结构体

我们使用“A”键来修改name成员的长度为32bytes(和我们源代码中定义的一样),然后再给结构体一个好听的名字。

我们拿这些结构体有什么用呢?IDA提供给我们两种方法:

·Apply structure types to initialized data in the program.

·Convert operands as offsets inside structures.

我们将在下面的教程当中来介绍这两种方法

                                                                                            TOP

---------------------------------------------------------------------------------------------------------------------

TOP

-------------------------------------------------------------------------------------------------------

第十节:联合体和结构体中的结构体

IDA中可以像定义标准结构体那样来定义联合体。

让我们来试着定义product_u 这个联合体吧。

book_t和software_t这两个结构体我们已经定义过了。

IDA认为联合体就是一种特别的结构体:因此我们打开Structures窗口,运行Add struct type命令,在对话框中我们选择创建Create union 选项。

IDA简易教程 - 白云飘飘 - Louis333风雨夜归人

我们可以使用IDA常用的命令来创建联合体成员,分别添加一个book_t 结构体类型的book和一个software_t 结构体的software联合体成员

IDA简易教程 - 白云飘飘 - Louis333风雨夜归人

当然结构体也可以嵌套一个结构体。事实上,我们刚才做的例子就实现了。

记住IDA认为联合体只不过是一种特殊的结构体

IDA简易教程 - 白云飘飘 - Louis333风雨夜归人

                                                                                        TOP

----------------------------------------------------------------------------------------------

第十一节:可变的结构体

我们还记得有一个softwares_t 结构体。结构体softs 的长度是不确定的。

在汇编中,我们必须创建一个大小可变的结构体~。这种结构体创建的时候和普通的一样,仅仅最后一个元素定义的数组元素个数为0。

IDA简易教程 - 白云飘飘 - Louis333风雨夜归人

 

既然IDA不能计算出这种结构体的大小,我们就必须通过选择结构体的区域,来定义大小。

IDA简易教程 - 白云飘飘 - Louis333风雨夜归人

我们可以看到所有的类型IDA用注释模式来显示成员名称

IDA简易教程 - 白云飘飘 - Louis333风雨夜归人

                                                                                            TOP

----------------------------------------------------------------------------------------------------

第十二节:结构体偏移

现在我们知道如何定义联合体和结构体了。现在我们来将一些操作数指向他们原本指向的结构体。

在print_customer() 函数中,我们知道他只有一个指向customer_t结构体的参数。EAX寄存器初始化这个指针的值,使他指向customer_t 结构体。因此我们推断所有的[EAX+....]都是指向customer_t结构体成员的偏移。

IDA简易教程 - 白云飘飘 - Louis333风雨夜归人

我们开始重新定义这些结构体变量的偏移,你右击在他们上面IDA会自动给你提供偏移的信息。

IDA简易教程 - 白云飘飘 - Louis333风雨夜归人

当我们把所有的偏移量都整理一下的话,汇编代码马上就变得清晰易懂了。

IDA简易教程 - 白云飘飘 - Louis333风雨夜归人

print_software()函数呢就是另外一个例子:EBX在初始化的时候指向了software_t 及构体。注意EBX寄存器在整个函数中都有应用(一个一个替换会累死的)。不要紧张,IDA会使用一次操作就能替换全部。

做法如下:

选择整个函数的代码,然后选在Operands工具栏上的Offset (struct) 命令。

IDA简易教程 - 白云飘飘 - Louis333风雨夜归人

弹出Structure offsets窗口。然我们在列表中选择EBX寄存器。

左边树形视图显示了在IDA中定义的所有结构。

右边就显示与EBX有关系的所有操作。如果我们选择了左边的一个结构,

IDA就会自动改变被选择代码中与结构体有关的偏移量。

树视图前面不同的符号表示经过计算后的状态。对号就表示完全匹配,相反就是不完全匹配。在我们的操

作中正好完全匹配。

IDA简易教程 - 白云飘飘 - Louis333风雨夜归人

确定以后,我们就得到了下面的结果:

IDA简易教程 - 白云飘飘 - Louis333风雨夜归人

                                                                                                      TOP

--------------------------------------------------------------------------------------------------------------

TOP

--------------------------------------------------------------------------------------------------------

第十四节:地址偏移量

IDA也可以重新定义操作数。在下面的例子中,桔黄色的部分显示一个可能存在的参考~

IDA简易教程 - 白云飘飘 - Louis333风雨夜归人

使用Operands 工具栏上的Offset 按钮就可以进行转换。

IDA简易教程 - 白云飘飘 - Louis333风雨夜归人

  评论这张
 
阅读(3037)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017