IDA简易教程
- 格式:pdf
- 大小:841.22 KB
- 文档页数:41
idapython使用手册idapython是一种用于逆向工程的Python插件,可以与IDA Pro交互以实现自动化逆向工程任务。
以下是idapython的使用手册:一、简介idapython是IDA Pro自带的Python插件,可以帮助用户进行自动化逆向工程任务。
它提供了大量的函数和工具,使得用户可以方便地进行各种操作和分析。
二、安装和配置1. 安装IDA Pro:首先需要在官方网站下载适用于您的操作系统的IDA Pro 安装包,并按照提示进行安装。
2. 安装Python:确保您的计算机上已经安装了Python解释器。
推荐使用Python 3版本。
3. 安装idapython插件:在IDA Pro中,选择“File”->“Scripts”->“Install Python解释器”,按照提示进行安装。
三、基本操作1. 打开IDA Pro:双击可执行文件或从命令行启动IDA Pro。
2. 打开二进制文件:在IDA Pro中,选择“File”->“Open”,选择要分析的二进制文件。
3. 使用Python脚本:在IDA Pro中,选择“File”->“Scripts”->“Run script”,选择要运行的Python脚本文件。
4. 导出结果:在IDA Pro中,选择“File”->“Export”->“Output file”,将结果导出到指定文件。
四、常见问题及解决方案1. Python脚本报错:检查Python脚本是否有语法错误或导入错误,确保所有依赖库都已经正确安装。
2. IDA Pro崩溃:可能是由于内存不足或脚本错误导致,尝试关闭其他程序或重启计算机,检查脚本是否有异常。
3. 无法找到符号:可能是因为二进制文件经过了混淆或加密处理,需要使用其他工具或插件进行分析。
4. 无法导出结果:检查导出路径和文件名是否正确,确保导出文件有写入权限。
五、示例脚本以下是一个简单的示例脚本,用于在IDA Pro中搜索字符串“Hello World”:```pythonimport idautilsimport idaapiimport idc搜索字符串"Hello World"search_string = "Hello World"search_result = (0, 0, search_string)print("Found {} occurrences of '{}'".format(len(search_result), search_string))```。
idapython使用手册使用手册I. 简介idapython是一种用于逆向工程的Python插件,可以与IDA Pro交互以实现自动化逆向工程任务。
本手册旨在介绍idapython的基本功能和用法,帮助用户快速上手。
II. 安装和配置1. 安装IDA Pro:在官方网站下载适用于您的操作系统的IDA Pro安装包,并按照提示进行安装。
2. 安装Python:确保您的计算机上已经安装了Python解释器。
推荐使用Python 3版本。
3. 安装idapython插件:下载最新的idapython插件,并将其放置在IDA Pro的插件目录中。
4. 配置环境变量:将Python解释器的路径添加到系统的环境变量中,以便在IDA Pro中调用Python脚本。
III. 基本功能1. 调用API函数:idapython提供了一系列方便的函数和类,可以用于在IDA Pro中执行各种操作。
例如,您可以使用`idaapi.get_func`函数获取一个函数的信息,或使用`idc.set_name`函数设置一个地址的名称。
2. 脚本编辑器:idapython集成了一个Python脚本编辑器,可以在IDA Pro中编写、编辑和运行脚本。
您可以通过按下Ctrl+F9键调出脚本编辑器。
编写的脚本可以方便地与IDA Pro的功能进行交互。
3. 插件开发:idapython不仅可以用于执行与逆向工程相关的任务,还可以用于开发自己的插件。
通过编写Python脚本,您可以创建自定义的功能和工具,以满足特定的需求。
IV. 示例用法以下是一些idapython的常用用法示例,以帮助您理解如何使用该工具。
1. 获取函数信息```pythonimport idaapiea = here() # 获取当前光标所在的地址func = idaapi.get_func(ea) # 获取该地址所在的函数信息print("函数名称:", idc.get_name(ea))print("函数起始地址:", hex(func.startEA))print("函数结束地址:", hex(func.endEA))```2. 修改函数名称```pythonimport idcea = here() # 获取当前光标所在的地址idc.set_name(ea, "new_function_name") # 将地址的名称修改为"new_function_name"```3. 查找引用地址```pythonimport idautilsea = here() # 获取当前光标所在的地址refs = idautils.CodeRefsTo(ea, 0) # 获取引用该地址的所有地址print("引用该地址的地址有:")for ref in refs:print(hex(ref))```V. 总结idapython是一种功能强大的Python插件,为逆向工程提供了许多便利的工具和函数。
ida脱壳elf原理与步骤
IDA脱壳是指使用IDA Pro逆向工程软件对ELF文件进行脱壳操作,以便分析和理解程序的内部结构和运行机制。
ELF (Executable and Linkable Format)是一种常见的可执行文件格式,用于在Unix和类Unix系统上执行程序。
脱壳的原理主要是通过分析ELF文件的结构和运行机制,找到程序加载时解密或解压缩自身代码的算法和过程,然后使用IDA Pro等工具将程序还原为未加密或未压缩状态,以便进行进一步的逆向工程分析。
下面是IDA脱壳ELF文件的一般步骤:
1. 确定脱壳目标,首先需要确定要脱壳的ELF文件,然后使用IDA Pro打开该文件。
2. 分析程序加载过程,在IDA Pro中分析程序的加载过程,包括内存映射、代码段和数据段的加载情况,以及程序运行时的解密或解压缩过程。
3. 查找解密或解压缩代码,通过静态分析和动态调试等手段,定位程序中实际执行解密或解压缩操作的代码段。
4. 修改程序代码,在IDA Pro中修改程序的代码,使其在加载时跳过解密或解压缩过程,直接加载未加密或未压缩的代码段和数据段。
5. 重新生成ELF文件,根据修改后的程序代码,重新生成一个未加密或未压缩的ELF文件。
需要注意的是,IDA脱壳ELF文件是一项复杂的操作,需要对ELF文件格式和程序加载机制有深入的了解,同时需要熟练掌握IDA Pro等逆向工程工具的使用技巧。
此外,脱壳操作可能涉及到法律
和道德问题,应当在合法和合理的前提下进行。
IDA教程-隐藏IDA调试器译者注:①无论从易用性还是功能上,文中的方法和插件都较OD下面的插件如HideOD,OllyAdvance等还要差些。
但总比没有强,聊胜于无,可以对付一些简单的反调试。
②原文为IDA作者于2005年发表在上的三篇blog,我给合到一篇里了。
③文中的Unpacker我没有翻译为解压器,翻译为壳。
一个隐藏IDA调试器的小技巧很多IDA使用者都向我索要一个可以隐藏调试器的插件或功能。
事实上,有很多反调试的手段,而针对每一种反调试的手段都需要对应一种处理方法。
我们先从一些简单的开始,我们的目的是让IsDebuggerPresent函数始终返回0值。
当一个调试器处于运行状态时,我们可以在反汇编窗口使用”go to the specified address”命令进入IsDebuggerPresent函数。
不幸的是,当前版本的IDA(译者注:作者文章写于2005年)不能在名称列表中显示输入函数名字,因此我们需要在输入框中手动输入函数名字:请注意我是如何来构造这个地址的:在Dll名字后面有一个下划线,之后再加上函数名。
我们在这个函数的结尾放置一个断点。
这样我们就可以拦截它并修改它的返回值:我们并不希望每次这个IsDebuggerPresent函数被调用时挂起程序,然后每次手动修改这个数值,这很麻烦,我们希望它能自动完成这个操作。
方法是:我可以使用条件断点,“断点条件”通常用来确定一个断点应该被触发或抛弃,其语法为IDC表达式,如果表达式等效为0,断点就不会触发。
IDA需要执行这个表达式,以判断其结果,因此我们可以利用它的执行结果,修改寄存器或内存为任何你需要的数值。
我们编辑断点的属性如下(右击鼠标,编辑断点):我们设定条件为”EAX=0”。
注意这里不是一个比较,而是一个赋值。
当IDA执行它的时候,EAX会被附带设置为0,这正是我们需要的。
因为我们不想挂起程序,我们也清除了这个断点的属性。
用IDA反汇编动态库最近,一直在学习如何利用IDA来反汇编动态库,这里把我的学习心得写下来。
为简单起见,这里就自己所写的一个动态库里的一个简单函数进行一下反汇编,给出如何写出其C代码的详细过程,希望对新手有点帮助。
废话少说,先给出其动态连接库的C代码如下_declspec(dllexport) int add(char a, int b, int c[2]){int d = a + b + c[0] + c[1];return d;}至于为什么要设置这样的参数,待会在反汇编时进行说明。
下面给出其详细的反汇编过程,并补充相关的经验总结。
第一步、装载动态库文件” first .dll”,装载之后得到下面的截图:通过在Functions一栏中双击add函数,我们来到add()函数的地方(同上图),我们看到”text:10001010 add proc near ; CODE XREF: add(char,int,int * const) j”这样一栏显示了add函数的参数,虽然有点出入,但大体正确。
可能是因为add函数本身比较简单,所以IDA很容易就识别出了其参数,一般地,IDA是识别不出来的,网上有一个插件为”Flair.v5.20”据说可以部分地解决函数的参数识别问题,但这个软件我没有下载到,就不说这个了。
第二步、我们看到”.text:10001010”这些栏有很多标示,在下面的汇编语句中会用到。
我们看接下来的三行代码:.text:10001010 push ebp.text:10001011 mov ebp, esp.text:10001013 sub esp, 44h这三行代码模式基本上是固定的,(至少我遇到的都是这样)首先是保存ebp, 然后用ebp来保存esp的原始指向,再将esp的指向向上移动44h个字节,(当然这里44h不是固定的)为什么会有这样固定的代码呢?就代码“sub esp 44h”而言,在原esp的基础上向上移动44h 的字节空间,而esp ----- esp-44h这个44h的空间是为了存放一般变量的。
IDA系列智能全馏程在线分析仪使用安装说明书通力分析自控技术有限公司目录第一部分:使用说明一. 概述 (3)二. 主要技术指标 (3)三. 工作原理和系统结构 (4)四. 开机操作程序及要求 (8)五. 正常运行操作程序及要求 (14)第二部分:安装说明一.仪表安装 (16)二.IDA-013柴油全馏程在线分析仪工艺安装流程图 (17)三.IDA-013全馏程在线分析仪电源、工艺管线安装位置图 (18)四.IDA-013 接线箱内接线柱接线说明 (19)五、外型安装尺寸 (20)六.仪表现场提供条件 (20)1.概述在炼油生产过程中和石油产品的应用上,馏程是表征油品的质量和应用性质的重要指标,它能够反映油品轻重成分的分布情况,是炼厂分析频度最高,分析工作量最大的分析项目。
如果能够及时准确地获取到这一信息,生产操作人员就能及时了解掌握全塔各类产品的分配比例及质量情况,及时调整塔内温度、压力和回流量等参数,使各种组分在保证质量的前提下处于最佳分配状态,从而提高企业的经济效益。
IDA系列智能全馏程在线分析仪是本公司经过多年的研究和现场实践,采用了诸多最新技术手段研制出的一款能够应用于炼油生产过程在线分析油品全馏程的防爆型智能分析仪表。
它能够普遍地适用于炼厂各类装置生产的汽油、煤油、柴油等相关油品的全馏程在线分析。
能实时监视生产过程馏分质量参数的动态变化,并将检测数据实时显示、存储和输出到生产装置先进控制系统。
为炼油企业实现生产过程在线质量监测、全塔优化控制,提高企业经济效益和社会效益提供了有利手段。
为使分析仪能够在所安装现场稳定正确运行,使用者一方面要保证安装现场满足分析仪工作条件,另一方面,应严格按照本使用安装说明书中所规定的要求,进行仪表的开停机以及正常运行时的操作调校。
2.主要技术指标和工作条件2.1技术指标●型号: IDA。
●测量精度:符合GB/T6536-1997( ASTM D86)《石油产品蒸馏测定法》标准。
IDA实例教程详解作者:笨笨雄(转载)1 软件环境静态分析有很多好处,例如加壳的程序(尽管对于高手来说这并不会耗费太多时间),我们不需要寻找OEP,也不需要解除自校验,只要修复IAT,DUMP下来就可以动手分析了。
假如你需要修改程序,可以使用内存补丁技术。
动态与静态,调试器与反汇编器结合可以简化分析任务,帮助我们理解代码。
因此掌握一种反汇编器是非常必要的。
IDA可以说是这方面的首选工具,它为我们提供了丰富的功能,以帮助我们进行逆向分析。
这从IDA复杂的工作界面便可以知道。
种类繁多的工具栏在分辨率不高的情况,这些工具栏与反汇编窗口挤在小屏幕里,看起来不爽。
我一般把它关闭(查看=>工具栏=>主工具栏)以获得更好的视觉效果。
当我们需要这些功能的时候,直接使用快捷键就可以了。
下面是常用快捷键的清单:在工具栏下面的便是工作窗口。
主要的窗口分页有“IDA View-A”、“Name”、“Strings”、“Exports”和“Imports”。
对于后面3项相信大家都不会陌生了,它们分别是字符参考,输出函数参考和输入函数参考。
Name是命名窗口,在那里可以看到我们命名的函数或者变量。
这四个窗口都支持索引功能,可以通过双击来快速切换到分析窗口中的相关内容,使用起来十分方便。
简单输入几个字符即可定位目标IDA View-A是分析窗口,支持两种显示模式,除了常见的反汇编模式之后,还提供图形视图以及其他有趣的功能。
IDA的反汇编窗口一般我们在分析的时候,并不关心程序的机械码,所以IDA为我们自动隐藏了这些信息。
如果你有需要,可以通过以下步骤来设置:选项=>常规=>反汇编=>显示反汇编行部分=>机械码字节数=>修改为你允许显示的大小现在让我们以论坛脱壳版块置顶帖的那个经典为例,看看图形视图的表现。
首先我们到以下连接下载:你能通过图形视图及其缩略图快速找到壳的出口吗如图所示,标签40EA0E便是壳的出口代码的地址。
渗透测试之逆向IDA的使⽤逆向⼯程作为⼀个新兴的领域,在软件维护中有着重要的作⽤。
充分利⽤逆向⼯程技术就可以对现有系统进⾏改造,减少开发强度,提⾼软件开发效率,降低项⽬开发的经济成本,提⾼经济效益,并在⼀定程度上保证软件开发和利⽤的延续性,⽽IDA在逆向分析有着⾮常重要的作⽤。
IDA pro 7.0版本⽤到的⼯具有IDA pro 7.0 ,被反汇编的是百度云(BaiduNetdisk_5.6.1.2.exe)。
⾸先,IDA pro的长相如下:共有(File , Edit , Jump , Search , View , Debugger , Options , Windows , Help)9个模块,还有下⾯的诸多⼩菜单。
现在我们点击File,选择Open打开⼀个⽂件,这⾥我们选择百度云盘PC端安装程序,出现如下图⽰:这⾥我们直接默认OK即可。
此时,我们看到的视图是这样的:然后我们对各个部分进⾏标号,单独进⾏介绍:第⼀部分表⽰的是对不同代码块使⽤不同的颜⾊进⾏区分,我们可以直接点击相应的颜⾊块进⾏不同代码块的定位。
蓝⾊:表⽰代码段。
棕⾊:表⽰数据段。
红⾊:表⽰内核。
第⼆部分表⽰该程序的函数表,双击后可查看详细信息。
该函数对应的IDA View-A如下:第三部分对应的就是整体程序或者某个函数的图标概述形式,可以⼤体把握功能和结构的⾛向。
对整体的脱壳逆向有很⼤的帮助。
第四部分主要可以显⽰以下6部分信息:(1)IDA View-A(2)Hex View-1(3)Structures(4)Enums(5)Imports(6)Exports其中IDA View-A表⽰的就是某个函数的图标架构,可以查看程序的逻辑树形图,把程序的结构更⼈性化地显⽰出来,⽅便我们的分析。
具体表⽰形式,上⽂中有截图可参考。
在Hex View-1中可以查看16进制代码,⽅便定位代码后使⽤其他⼯具修改,具体表⽰如下图所⽰:在Stuuctures中可以查看程序的结构体:在Enums中可以查看枚举信息:在Imports中可以查看到输⼊函数,导⼊表即程序中调⽤到的外⾯的函数:在Exports中可以查看到输出函数:以上就是IDA主⾯板中的各个部分的功能介绍了。
IDAPython入门基础语法一、背景介绍IDAPython是一种基于Python语言的脚本插件,专门用于IDA Pro这款著名的逆向工程软件。
通过IDAPython,用户可以编写Python脚本来扩展IDA Pro的功能,实现自动化的逆向分析任务,简化反汇编和调试的流程。
本文将介绍IDAPython的入门基础语法,帮助初学者快速掌握这一强大的工具。
二、安装与配置1. 安装IDA Pro用户需要在自己的计算机上安装IDA Pro软件。
可以从冠方全球信息站下载安装包,并按照安装指南进行安装。
2. 安装PythonIDAPython是基于Python的,因此用户需要安装Python解释器。
建议安装Python 2.7版本,因为IDA Pro目前主要支持Python 2.7。
用户可以从Python冠方全球信息站下载安装包,并按照安装指南进行安装。
3. 配置环境变量在安装完Python之后,用户需要将Python解释器所在的路径添加到系统的环境变量中,以便IDA Pro能够正确地找到Python解释器。
三、IDAPython基础语法1. 导入IDAPython模块用户在编写IDAPython脚本时,首先需要导入IDAPython的相关模块。
可以使用以下语句导入:```pythonimport idaapiimport idcimport idautils```2. 获取当前工作的IDA数据库用户可以使用以下语句获取当前工作的IDA数据库:```pythoncurrent_database = idaapi.get_database_path()print "Current database is: s" current_database```3. 遍历函数用户可以使用以下语句遍历当前IDA数据库中的所有函数,并输出函数的位置区域和名称:```pythonfor func_ea in idautils.Functions():func_name = idc.get_func_name(func_ea)print "Function at 0xx: s" (func_ea, func_name)```4. 获取函数的指令用户可以使用以下语句获取指定函数的所有指令,并输出它们的位置区域和助记符:```pythonfunc_ea = 0xxxxfor (start_ea, end_ea) in idautils.Chunks(func_ea):for head in idautils.Heads(start_ea, end_ea):disasm = idc.GetDisasm(head)print "0xx: s" (head, disasm)```5. 修改指令用户可以使用以下语句修改指定位置区域的指令:```pythonea = 0xxxxnew_insn = "nop"idc.PatchByte(ea, ord(new_insn))```6. 添加注释用户可以使用以下语句在指定位置区域添加注释:```pythonea = 0xxxxidc.MakeComm(ea, "This is ament")```四、总结通过本文的介绍,初学者可以了解到IDAPython的基础语法,包括导入模块、获取当前工作的IDA数据库、遍历函数、获取函数的指令、修改指令和添加注释等操作。
ida常用指令全文共四篇示例,供读者参考第一篇示例:IDA(Interactive DisAssembler),是一款强大的逆向分析工具,用于分析和逆向工程二进制文件。
它提供了许多常用的指令和功能,帮助用户进行更加高效和准确的逆向分析工作。
本文将介绍一些IDA 常用指令和功能,帮助读者更好地了解和使用IDA。
1. 打开二进制文件:使用IDA打开二进制文件是最基本的操作。
可以通过“File”菜单中的“Open”选项或直接拖放文件到IDA界面中来打开二进制文件。
2. 查看反汇编代码:在IDA中,可以通过双击函数或代码块来查看反汇编代码。
还可以使用快捷键“Space”来切换反汇编窗口显示的代码。
3. 查看交叉引用:在IDA中,可以查看函数、变量或常量的交叉引用,帮助用户理解程序的逻辑和数据流动。
4. 修改反汇编代码:在IDA中,用户可以修改反汇编代码来分析和测试程序。
修改后可以保存IDA数据库或生成新的可执行文件。
5. 根据函数名搜索:在IDA中,用户可以使用“Ctrl+F”快捷键来搜索指定的函数名,便于快速定位和查找相关函数。
8. 导出函数列表:在IDA中,用户可以将程序中的函数列表导出为文本文件,便于后续分析和研究。
9. 反编译代码:在IDA中,用户还可以对程序进行反编译操作,将汇编代码转换为高级语言代码,帮助理解程序逻辑和进行深入分析。
10. 调试功能:在IDA中,用户还可以使用调试功能进行程序的动态调试和分析,帮助理解程序执行流程和调试程序错误。
第二篇示例:IDA是一款用于反汇编和静态分析的工具,是逆向工程师和安全研究人员常用的利器。
在使用IDA进行逆向分析时,熟练掌握IDA的常用指令是至关重要的。
本文将介绍一些IDA常用指令,帮助读者更好地了解和使用IDA工具。
1. 切换视图在IDA中,可以通过按下“空格”键来切换不同的视图,包括文本视图、交叉引用视图、十六进制视图等。
这些视图可以帮助用户更方便地查看和分析反汇编结果。
第一节:C语言的小程序程序执行结果:CUSTOMERS:CUSTOMER 0001: Peter (m)CUSTOMER 0002: John (m)CUSTOMER 0003: Mary (f)PRODUCTS:PRODUCT 0001: BOOK: IDA QuickStart GuidePRODUCT 0002: SOFTWARE: IDA Pro: PC; WINDOWS DOS; DISASSEMBLYPRODUCT 0003: SOFTWARE: PhotoRescue: PC MAC; WINDOWS OS-X; RECOVERY PRODUCT 0004: SOFTWARE: aCrypt: PC; WINDOWS; CRYPTOGRAPHY第二节:基本类型的识别用IDA分析我们前面的程序,我们会发现下图的类型只要按”D”我们就可以任意转换这些不确定的类型.可以变成byte,word,dword(db,dw,dd)。
当然你也可以设置更多的数据转换类型:选择“Options”菜单的“Setup data types”命令就可以设置了值得注意的是:你在数据转换的时候,它是依据数据自身的结构来转换的。
我们按“D”的时候,如果下一个字节已经被你转换过,你的本次转换,IDA将会提示让你确认。
注:如果你想改变这种默认设置可以在“Options”菜单“Convert already defined bytes”命令里设置撤销你的所有转换按“U”键。
第三节:操作数格式数据类型自定义转换后,被操作过的数据(就是你按过“D”的)的进制IDA也是可以自定义转变的,通过在“Operands”工具栏的“Number”命令我们可以随意转换数字的进制最下面的“Toggle leading point”就是填补数据前的空位为0(就是说如果当前数据未占满数据格式的所有位高位用0来填补)IDA还可以转换数据的标志位(就是正负)具体操作如下图:最后呢~~如果这些转换你还不满意(够BT)当然你还可以自定义数据进制如图:第四节:字符和字符串的操作作者又说话了:很多程序都是包含字符串的,一些被操作过的数据(就是你按过“D”的)可以转化为字符,使用的命令就在“Operands”工具栏上由于编程语言的不同造成字符串也有不同的格式,当然IDA就支持所有的格式了。
IDA在转化后会在地址添加一个名字。
因为我们的程序是c的所以就找到c的字符串。
具体操作如图:如果不是C写的程序怎么办呢?我们可以在“Options”菜单“ASCII string style”命令中设置。
允许你修改其它类型为默认设置,使用默认设置的快捷键是“A”,或者自定义一种类型可以使用不常用的终止字符。
第五节:数组在c中,ASCII字符串被认为是字符数组,IDA是如何处理数组的呢?我们用最常用命令来定义数组中的第一个元素,设置第一个元素类型为byte,格式为char,然后点击“*”号键(或者“Edition ”工具栏的“Array”命令)来创建数组。
这时弹出一个对话框,可以设置很多变量。
你可以定义数组一行的显示个数,还可以使用“Element width”来设置他们之间的宽度。
使用“Use dup construct ”选项可以合并连贯的相似字节,“ Display index ”选项可以像注释一样显示数组的下标。
例如我们设置一个有64个元素的数组,一行有8个元素,每个元素之间的宽度为4,不选取“dup constructs”,选取“Display index ”,我们就可以得到下面的数组。
当IDA遇到未被识别的字节他会用红色的高亮显示。
当然你也可以选择一个范围来创建数组,IDA会自适应的设定。
第六节:枚举类型还记得我们在C程序中定义的product_category_t类型吗?让我们用IDA的“Enumerations”来定义一下。
首先,我们打开“Enumerations”窗口来创建一个新的枚举类型我们输入我们的枚举类型值在check_product()函数,我们可以用枚举类型重新定义一些操作数。
右键点击在数值上,就会弹出一个菜单,选择“Symbolic constant”。
IDA就会自动列举枚举值,用以匹配当前的数值。
操作完成,我们就会得到下面的结果:第七节:Bit-fields(位域)BTW:Bit-fields,我的理解就是在结构体中的位标志。
太菜!希望高手指正!现在,我们来定义一下在software_info_t结构中的bitfields。
IDA的观点就是,bitefields是一种特殊的枚举类型。
我们可以选择在枚举类型创造窗口中的“Bitfield”选项。
还记得我们曾经在我们的程序中建立了两种不同类型的bitfields ,plateform和os包含了一种隐藏的模式:用来包含组合模式(用逻辑或来操作)。
因为一种产品可以同时在几种plateforms和OS的组合。
另一方面,category bitfield中每一个数字表示一种类别:一种产品每次只能属于一种类别。
在IDA中一种指定的模式,bitfield只能包含一个值。
所以在描述plateform和category bitfields时为了显示组合模式,我们必须创建一个小的bitfields,每个值的一个bit.现在我们开始创建category bitfield。
mask值为0x3 (2 bits).我们指定一个名字、一个值、还有bitfield mask。
我们还需要定义mask的名字:这个我们不用IDA自动生成的,IDA有一个内存助手可以帮助生成。
当所有的bitfields被输入,我们就会得到下面的结果:用Operands工具栏上的Enum member命令就可以定义我们程序中的Enum member数据第八节:结构体我们的程序当中包含了很多结构体。
现在让我们来在IDA中描述一下结构体,看看是怎么提高汇编代码的可读性。
第一步,我们必须打开Structures窗口,来创建一个新的结构体类型。
结构体的成员是一汇编的模式定义的。
让我们来定义software_t结构中的第一个成员。
一直按“D”知道它变成“dd”意思就是这个成员的值为dword类型。
把它的格式定义为我们以前定义好的software_info_t枚举类型,然后我们用Rename命令输入一个适当的名字:info开始定义第二个成员,这次使用ASCII命令(按“A”),在这个环节IDA会弹出一个专用对话框用来设定字符串的大小我们还可以从已经分析好的数据中来建立结构体。
举个例子:假设我们选择了一块数据正好是和我们的customer_t结构体的数据格式一样,我们就可以用IDA 的“Create struct from data ”命令来创建结构体一旦使用了这个命令,IDA就会在Structures窗口创建一个相对应的结构体我们使用“A”键来修改name成员的长度为32bytes(和我们源代码中定义的一样),然后再给结构体一个好听的名字。
我们拿这些结构体有什么用呢?IDA提供给我们两种方法:·Apply structure types to initialized data in the program.·Convert operands as offsets inside structures.我们将在下面的教程当中来介绍这两种方法第九节:结构变量和结构数组现在让我们用来customer_t结构体整理另外一个客户信息John。
把鼠标指针放在我们定义的结构体的第一个自己上面,然后使用Struct var命令。
这样我们就得到了一个新的结构体变量。
IDA会自动在结构体成员的后面加上变量名的。
通过我们的源码,我们知道有一个包含个4元素的customers数组,我们先前把Peter和John都定义为customer_t结构体了。
现在取消对Join结构变量的定义,然后在Peter结构上按“*”键创建我们的customer数组,这样IDA就弹出一个数组设置框他会自动检测出来我们要创建的数组最大数是4。
下来我们就看到创建好的数组了,剩下的就是改一下数组的名字。
第十节:联合体和结构体中的结构体IDA中可以像定义标准结构体那样来定义联合体。
让我们来试着定义product_u这个联合体吧。
book_t和software_t这两个结构体我们已经定义过了。
IDA认为联合体就是一种特别的结构体:因此我们打开Structures窗口,运行Add struct type命令,在对话框中我们选择创建Create union选项。
我们可以使用IDA常用的命令来创建联合体成员,分别添加一个book_t结构体类型的book和一个software_t结构体的software联合体成员当然结构体也可以嵌套一个结构体。
事实上,我们刚才做的例子就实现了。
记住IDA认为联合体只不过是一种特殊的结构体第十一节:可变的结构体我们还记得有一个softwares_t结构体。
结构体softs的长度是不确定的。
在汇编中,我们必须创建一个大小可变的结构体~。
这种结构体创建的时候和普通的一样,仅仅最后一个元素定义的数组元素个数为0。
既然IDA不能计算出这种结构体的大小,我们就必须通过选择结构体的区域,来定义大小。
我们可以看到所有的类型IDA用注释模式来显示成员名称第十二节:结构体偏移现在我们知道如何定义联合体和结构体了。
现在我们来将一些操作数指向他们原本指向的结构体。
在print_customer() 函数中,我们知道他只有一个指向customer_t结构体的参数。
EAX寄存器初始化这个指针的值,使他指向customer_t结构体。
因此我们推断所有的[EAX+....]都是指向customer_t结构体成员的偏移。
我们开始重新定义这些结构体变量的偏移,你右击在他们上面IDA会自动给你提供偏移的信息。
当我们把所有的偏移量都整理一下的话,汇编代码马上就变得清晰易懂了。
print_software()函数呢就是另外一个例子:EBX在初始化的时候指向了software_t及构体。
注意EBX寄存器在整个函数中都有应用(一个一个替换会累死的)。
不要紧张,IDA会使用一次操作就能替换全部。
做法如下:选择整个函数的代码,然后选在Operands工具栏上的Offset (struct) 命令。
弹出Structure offsets窗口。
然我们在列表中选择EBX寄存器。
左边树形视图显示了在IDA中定义的所有结构。
右边就显示与EBX有关系的所有操作。
如果我们选择了左边的一个结构,IDA就会自动改变被选择代码中与结构体有关的偏移量。
树视图前面不同的符号表示经过计算后的状态。