版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
从零开始学IDA逆向(上篇)目录1简介...........................................................................................................................11.1为什么使用IDA...............................................................................................11.2IDA安装...........................................................................................................21.3使用IDA加载程序..........................................................................................32数值系统以及IDA搜索功能.................................................................................132.1数值系统.........................................................................................................132.2十六进制数.....................................................................................................142.3ASCII码字符.................................................................................................162.4IDA中的搜索功能.........................................................................................203CPU寄存器以及数据传输指令.............................................................................273.1IDA加载器.....................................................................................................273.2寄存器.............................................................................................................273.3MOV指令.........................................................................................................314数据传输以及栈操作指令.....................................................................................414.1XCHG指令.......................................................................................................414.2Keypatch插件..............................................................................................454.3栈操作指令.....................................................................................................475LEA指令.................................................................................................................535.1LEA指令........................................................................................................535.2函数参数及局部变量.....................................................................................535.3LEA的其他用法.............................................................................................556整数运算与逻辑运算指令.....................................................................................576.1整数运算指令.................................................................................................576.2逻辑运算指令.................................................................................................617流程控制指令.........................................................................................................667.1无条件跳转指令JMP.....................................................................................667.2有条件跳转指令.............................................................................................727.3CALL和RET指令..........................................................................................738静态逆向分析入门.................................................................................................758.1程序加载详解.................................................................................................758.2查找关键字符串.............................................................................................788.3查找关键函数.................................................................................................808.4标记指令位置.................................................................................................848.5修改指令.........................................................................................................859函数栈逆向分析.....................................................................................................899.1安装VisualC++运行时..............................................................................899.2符号文件.........................................................................................................899.3定位main函数..............................................................................................919.4函数的栈.........................................................................................................939.5Main函数参数...............................................................................................969.6局部变量.........................................................................................................989.7Atoi函数.....................................................................................................10110IDA调试器.........................................................................................................10410.1选择IDA调试器........................................................................................10410.2调试器界面功能........................................................................................10510.3条件跳转指令与标志寄存器....................................................................11210.4SETEIP.....................................................................................................12011标志寄存器.........................................................................................................12211.1CARRYFLAG..............................................................................................12211.2OVERFLOWFLAG........................................................................................12411.3SIGNEDFLAG............................................................................................12511.4ZEROFLAG................................................................................................12611.5条件跳转与标志位....................................................................................12712程序注册逆向分析.............................................................................................13212.1通过命令行参数确定main函数..............................................................13212.2Main函数栈分析......................................................................................13512.3Main函数局部变量..................................................................................14012.4循环和代码块编组....................................................................................14312.5注册算法分析............................................................................................14713IDAPython简介..............................................................................................15213.1安装ipyida..............................................................................................15213.2Ipython的使用........................................................................................15213.3Idapython的使用...................................................................................15514程序脱壳简介.....................................................................................................16014.1什么是加壳................................................................................................16014.2加载加壳文件............................................................................................16014.3文件和内存占用........................................................................................16114.4STUB和OEP...............................................................................................16514.5寻找OEP.....................................................................................................16714.6API函数.....................................................................................................17014.7保存脱壳后的数据库................................................................................17114.8通过执行断点寻找OEP.............................................................................17415转存并重建导入函数表(IAT)......................................................................17715.1使用脚本转存为可执行文件....................................................................17715.2什么是IAT.................................................................................................18015.3重建IAT.....................................................................................................18516Aspack脱壳......................................................................................................19216.1PUSHAD和POPAD......................................................................................19216.2使用idapython进行调试.......................................................................19216.3使用idapython进行DUMP.....................................................................19917远程调试.............................................................................................................20417.1环境配置....................................................................................................20417.2远程调试....................................................................................................20517.3寻找OEP.....................................................................................................20917.4转存及IAT重建........................................................................................21217.5取消随机基址............................................................................................21718编写注册机.........................................................................................................21918.1Main函数及其参数..................................................................................21918.2Securitycookie等局部变量..............................................................22218.3用户名和密码处理....................................................................................22518.4算法总结....................................................................................................23318.5使用Python编写注册机.........................................................................23419GUI程序逆向.....................................................................................................23919.1关键判断定位............................................................................................23919.2GUI控件.....................................................................................................24219.3用户名处理................................................................................................24619.4密码处理....................................................................................................25519.5算法总结与注册机....................................................................................25620漏洞与栈缓存区溢出.........................................................................................25920.1什么是软件漏洞........................................................................................25920.2无效缓存区................................................................................................25920.3包含缓存区的栈结构分析........................................................................26220.4栈缓存区溢出实例....................................................................................27021栈缓存区漏洞分析及修复.................................................................................27521.1Bug、漏洞和利用的区别..........................................................................27521.2回车符和换行符........................................................................................27721.3IDA附加进程调试.....................................................................................27921.4字符数等于缓存区大小............................................................................28521.5字符数-1漏洞及其修复...........................................................................28722文件对比工具.....................................................................................................29222.1BINDIFF.....................................................................................................29222.2TURBODIFF................................................................................................29922.3DIAPHORA...................................................................................................30223Dev-C++编译器及其函数参数传递.................................................................30923.1Main函数及CANARY变量.......................................................................30923.2显示ESP变化............................................................................................31223.3漏洞分析....................................................................................................31523.4溢出测试及脚本........................................................................................31924struct.pack函数...........................................................................................32224.1变量分析....................................................................................................32224.2缓存区分析................................................................................................32524.3struct.pack函数...................................................................................32725结构体.................................................................................................................32925.1什么是结构体............................................................................................32925.2创建C++结构体.........................................................................................33025.3结构体示例代码........................................................................................33125.4IDA中的结构体.........................................................................................33325.5根据字段创建结构体................................................................................34325.6IDA3.exe解决方案..................................................................................34625.7IDA4.exe解决方案..................................................................................34926识别结构体.........................................................................................................35626.1示例代码....................................................................................................35626.2根据参数传递判断结构体........................................................................35826.3创建结构体................................................................................................36326.4在其它函数中识别字段............................................................................36526.5编写脚本....................................................................................................37127从零开始创建结构体并识别字段.....................................................................37427.1printf函数与scanf函数.....................................................................37427.2从零开始创建结构体................................................................................38127.3识别结构体字段........................................................................................38527.4修复函数....................................................................................................40027.5实现溢出脚本并调试................................................................................40228指针和引用.........................................................................................................41028.1变量的值....................................................................................................41028.2变量地址....................................................................................................41228.3变量的指针................................................................................................41528.4使用指针操作数据....................................................................................41828.5使用指针传递参数....................................................................................42228.6变量引用....................................................................................................42729程序漏洞实战.....................................................................................................43130程序漏洞实战分析.............................................................................................43230.1文件比对....................................................................................................43230.2创建结构体和字段....................................................................................43930.3malloc和calloc函数...........................................................................44430.4malloc参数漏洞分析..............................................................................44830.5stream_Read参数漏洞分析...................................................................45331制作验证程序.....................................................................................................45831.1缓存区局部读写........................................................................................45831.2寻找缓存区后的独立变量........................................................................46431.3stream_Read函数...................................................................................46831.4制作POC.....................................................................................................475从零开始学IDA逆向 1简介简介本教程主要想法是使用IDA对我们之前的逆向工程教程内容进行更新,让读者学习如何在最新的Windows操作系统上开始使用IDA。在这一系列教程当中,作者使用的是64位Windows10,并且安装了2016年10月29日之前的全部更新和补丁。1.1 为什么使用IDAOllydbg仅仅是运行于Windows用户模式下的一种32位调试器,而IDA是运行于32/64位下,可用作反编译和调试的一个完整的逆向工具。使用IDA尽管是个更加复杂的学习过程,但它提供了Ollydbg无法实现的静态逆向分析手段,并且使用户能够在Windows、Linux或Macosx本地环境以及以下环境中远程操作。图1-1IDAPRO自带的调试器图1-2列出IDA支持的部分处理器架构供读者参考。可以看出,学习使用IDA能够拓展我们的业务范围。尽管在这个系列教程中,主要关注的是Windows32/64位下的用户模式的应用程序,有时也关注内核模式程序。但掌握这些内容的读者在其他方面也会容易上手。在这个IDA系列教程中,作者会由浅入深地讲解“Ollydbg介绍”系列涉及的大部分内容,包括:静态及动态逆向分析、脱壳和谐、漏洞开发等。作者会对一些重要细节从头开始讲解。1从零开始学IDA逆向 1简介图1-2IDAPRO支持的处理器架构1.2 IDA安装首先我们需要安装IDA。IDA是一款物有所值的商业软件,建议有能力的读者购买使用。作者无法提供安装程序,读者可以在Goolge搜索“IDAPRO6.8HEXRAYS”获取已泄露版本。2从零开始学IDA逆向 1简介图1-3IDAPRO6.8压缩包内容图1-3为下载的zip包中内容,安装文件为:idapronw_hexarmw_hexx64w_hexx86w_150413_cb5d8b3937caf856aaae750455d2b4ae.exe。程序安装密码在文件install_pass.txt当中。安装文件会同时安装Python2.7.6,推荐使用IDA附带的Python避免产生问题。如果读者自行安装的话需要与IDA使用的Python版本一致。图1-4Python2.7.6命令行1.3 使用IDA加载程序安装完毕后,我们在IDA中加载本章教程附带的Crueheadcrackme程序。由于这是一个32位可执行程序,我们使用IDA32位加载程序。3从零开始学IDA逆向 1简介图1-5启动IDA32位快捷方式如果读者直接运行程序,可以在系统任务管理器中查看到它是一个32位进程。图1-6运行crackme程序,并查看任务管理器如果不通过执行文件来确定它是32位还是64位程序,可以使用16进制编辑器,例如https://mh-nexus.de/en/downloads.php?Product=hxd。下载并安装HxD英文版。通过16进制编辑器打开文件,确定它是32位还是64位程序的方法如下:4从零开始学IDA逆向 1简介图1-7系统截图程序可执行文件PE头使用hxd打开系统自带的截图程序可执行文件,这是一个64位可执行程序,可以看到PE这个词后面的内容:“PE..d†”。如果打开32位的Crueheadcrackm_e程序,PE这个词后面的内容是“PE..L”。图1-8Crueheadcrackme程序可执行文件PE头打开IDA32位应用,当IDAQUICKSTART窗口出现时,选择New来打开一个新的文件,查找并选择这个crackme程序。5从零开始学IDA逆向 1简介图1-9IDA加载新文件窗口目前为止,不需要修改设置内容,IDA检测出这是一个可执行PE文件,点击OK下一步。如果同意显示邻近视图(PROXIMITYVIEW),IDA将会显示程序各部分的调用关系。图1-10邻近视图(PROXIMITYVIEW)按空格键可以在图形视图和非图形的指令列表间切换显示模式。6从零开始学IDA逆向 1简介图1-11显示图形视图中的指令地址在OPTIONS-DEBUGGINGOPTIONS-LINEPREFIXES勾选可以显示图形视图中指令的地址。加载可执行程序后最先打开的是反汇编视图,加载器并不会执行程序,只是对程序进行逆向分析,并且生成一个数据库文件(IDB)。如果需要调试程序,则需要选择IDA提供的调试器,并在调试模式下运行,这部分内容将在以后的章节中涉及。7从零开始学IDA逆向 1简介图1-12反汇编视图IDA中有很多显示视图。例如,打开菜单上的VIEW-OPENSUBVIEW,可以选择需要显示的视图。图1-13函数起点识别IDA中有一些令人疑惑或者不适的问题,那就是视图某些部分出现的指向同一地址的引用,例如在一些函数起点处,地址重复了多次。技巧就是将最后一次重复作为开始。图1-13中通过这种方式找到汇编指令的起点,在这个例子当中,401000地址对应的汇编指令是“PUSH0”。8从零开始学IDA逆向 1简介在IDA中可以分别对加载器和调试器界面进行设置。比如说加载器常用的视图和窗口设置完成后,打开菜单上的WINDOWS-SAVEDESKTOP,设置为默认(Default),可以保留当前设置。在调试时同样可以进行界面设置,并且使用不同于加载器的设定。图1-14保存桌面设置在IDA包含列表的选项卡中,如FUNCTIONS,STRINGS,NAMES等,可以通过“CTRL+F”进行搜索,并且根据输入的字符进行过滤。打开菜单栏VIEW-OPENSUBVIEW-STRINGS,可以搜索到所有包含“try”的字符串。图1-15字符串搜索同样,打开菜单栏VIEW-OPENSUBVIEW-DISASSEMBLY,可以打开第二个反汇编选项卡显示与第一个不同的内容。9从零开始学IDA逆向 1简介图1-16打开第二个反汇编选项卡打开菜单栏VIEW-OPENSUBVIEW-HEXDUMP可以显示十六进制视图。图1-17十六进制选项卡打开菜单栏VIEW-OPENSUBVIEW-IMPORTS可以查看程序引用的外部函数。10从零开始学IDA逆向 1简介图1-18引用外部函数选项卡在VIEW菜单中,可以打开GRAPHOVERVIEW选项卡,作为当前函数图形视图的总览。图1-19鹰眼视图选项卡其他选项卡例如STRUCTURES、EXPORTS、NAMES、SEGMENTS等会在后续章节使用过程中进行介绍。图1-20程序分段的显示11从零开始学IDA逆向 1简介选项卡顶部IDA用不同的颜色区分可执行程序组成部分。下方对不同颜色代表的部分进行说明。例如,灰色代表.datasection(数据),如果点击颜色条灰色部分,下方的图形视图也会跳转到该部分中点击地址的位置。粉色部分是ExternalSymbol(外部符号)或者idatasection。蓝色部分表示codesection(代码)中识别出的函数。以上为IDA功能的快速预览,在后续的章节中将逐步深入探讨。12从零开始学IDA逆向 2数值系统以及IDA搜索功能数值系统以及IDA搜索功能本章教程是一份面对零基础大众的课程,少部分读者可以跳过已经掌握的内容。2.1 数值系统常用的数值系统有:binary(二进制)、decimal(十进制)和hexadecimal(十六进制)。Binary(二进制)仅以0和1字符表示数字。Decimal(十进制)使用0~9共10个字符表示数字。Hexadecimal(十六进制)使用0~9加上A~F共16个字符表示数字。在IDA界面底部有一个交互栏可以执行Python命令,能够帮助读者快速进行进制转换。图2-1Python交互栏在Python交互中输入0x45,由于开头的0x将会被解释为十六进制数。直接按回车可将0x45转换为十进制数,输出结果为69。图2-2十六进制转换为十进制如果需要将十进制转换为十六进制数,可以使用hex()函数。图2-3十进制转换为十六进制Bin()函数将其他进制的数字转换为二进制数。输出结果是1000101。开头的0b代表这是一个二进制数,13从零开始学IDA逆向 2数值系统以及IDA搜索功能图2-4十进制和十六进制转换为二进制数同样也可以将二进制数转换为十进制和十六进制数。图2-5二进制数转换为十进制和十六进制所有直接输入的数字在按回车后会转换为十进制数输出,通过Python函数hex()和bin()可以转换为十六进制或者二进制数输出。为了方便起见,通过菜单VIEW-CALCULATOR,可以打开IDA内置的转换器。该转换器能够同时显示数字转换为各种进制的结果。也会显示数字对应的ASCI字符。例如0x45对应的字符是‘E’。图2-6IDA内置转换器2.2 十六进制数几乎所有逆向工作都要涉及十六进制数,那么问题是如何用32位十六进制表示一个负数。在一个32位二进制数中,第一个比特(bit)上的0用来表示正数,1来表示负数。从图2-7可以看到-0x45的32位十六进制表示为0xffffffbb,而且二进制的第一个比特为1。14从零开始学IDA逆向 2数值系统以及IDA搜索功能图2-7-0x45不同进制表示方式用这种方式,最小能表示的正数显然为0,那么最大的正数是多少呢。从图2-8可以看出考虑正负号的话0x7fffffff是能表示的最大正数。如果再加1的话,因为后面的位数都是1,所以最高位也会变成1。图2-832位十六进制最大正数在计算器中将0x7fffffff再加上1,最高位变成1,其他位变成了0。图2-90x7fffffff+1表示方式IDA转换器在输入的时候默认都是正数,除非我们在数字前面加上“-”号。最大负数-1对应十六进制0xffffffff,最小负数0x80000000。如果不考虑正15从零开始学IDA逆向 2数值系统以及IDA搜索功能负,所有的数从0到0xffffffff都是正值。考虑正负,0x0到0x7fffffff是所有的正数,0xffffffff到0x80000000是所有的负数。图2-10-0x1表示方式位十六进制正数:000000000=0(十进制)000000001=1(十进制)………………7FFFFFFF(最大正值)=2147483647(十进制)位十六进制负数:FFFFFFFF=-1(十进制)FFFFFFFE=-2(十进制)………………80000000(最小负值) =-2147483648(十进制)图2-11有正负和无正负十六进制对应的十进制数2.3 ASCII码字符16从零开始学IDA逆向 2数值系统以及IDA搜索功能还有一点读者需要了解的是操作系统在屏幕上输出数据的方法。每一个输出字符都有一个对应的十六进制值,不同数值分别解析为相应字母、数字和符号。图2-12列入的ASCII表中,第一列为字符,第二列为对应的十六进制数,第三列为对应的十进制数。例如,0x20或者32(十进制)代表空格字符。表中列出了所有的数字和英文字母等字符及其编码。17从零开始学IDA逆向 2数值系统以及IDA搜索功能18从零开始学IDA逆向 2数值系统以及IDA搜索功能图2-12ASCII表IDA转换器能够显示数值对应的字符。如图2-7,0x45对应的字符是“E”。还有一种转换方式是使用Python中的chr()函数。19从零开始学IDA逆向 2数值系统以及IDA搜索功能图2-13使用Python的chr()函数将数值转换为字符在IDA的HEXDUMPWindows(十六进制视图)中也有一列显示相应的字符。在图2-14中也能看到在右方字符列里对应45(十六进制)的字符“E”。图2-14十六进制视图右侧显示字符2.4 IDA中的搜索功能读者可以看到IDA菜单栏上的搜索(SEARCH)子菜单。而且反汇编视图或者其他视图里也提供了很多搜索功能。如果读者切换到反汇编视图而没有显示搜索子菜单时,读者需要点击任一指令,改变鼠标焦点使这个菜单显示出来。图2-15中一些搜索选项是作者使用的IDA加载项提供的,可能与读者的不一致。下一条可执行指令(NEXTCODE):这个功能用于搜索下一条可执行指令(CODE)。如果中间有一部分不是可执行指令,这部分将会被跳过。Searchcompleted.Foundat004011A1.20从零开始学IDA逆向 2数值系统以及IDA搜索功能Searchcompleted.Foundat004011A3.Searchcompleted.Foundat004011A5.Searchcompleted.Foundat004011AA.Searchcompleted.Foundat004011AC.Searchcompleted.Foundat004011AF.Searchcompleted.Foundat004011B6.图2-15IDA搜索子菜单下一处数据(NEXTCODE):这个功能用于搜索下一处数据。在图2-16中,IDA检索到00401600地址上的双字节(DWORD)不属于可执行指令。如果继续搜索,IDA会跳转到下方的数据区块,读者可以看到地址00402004右侧的交叉引用表示其他指令对这里的数据进行了操作。21从零开始学IDA逆向 2数值系统以及IDA搜索功能图2-16数据搜索继续搜索IDA会跳过这些没有被使用的“0”字节,跳转到被分析程序使用的数据地址。Searchcompleted.Foundat00402004.Searchcompleted.Foundat00402048.图2-17数据搜索续继续搜索IDA会跳过所有非数据项直到搜索到下一处数据。下一处已探查项(NEXTEXPLORED):搜索下一处可执行指令或者数据。下一处未探查项(NEXTUNEXPLORED):搜索下一处非执行指令且非数据。图2-18搜索未探查项22从零开始学IDA逆向 2数值系统以及IDA搜索功能通过下一处未探查项搜索到0x402000地址上的“0”字节。继续搜索时会跳过0x402004上的数据,因为它属于已探查项。Searchcompleted.Foundat00402000.Searchcompleted.Foundat00402000.Searchcompleted.Foundat00402001.Searchcompleted.Foundat00402001.Searchcompleted.Foundat00402002.Searchcompleted.Foundat00402003.Searchcompleted.Foundat00402008搜索硬编码值(SEARCHINMEDIATE):该功能用于搜素可执行指令以及数据项中的常量。图2-19搜索硬编码值图2-19中如果我们勾选FINDALLOCURRENCES,IDA会搜索所有的匹配项。如果不勾选该项,IDA会逐个进行搜索,这时读者需要使用下一处硬编码值(NE_XTINMEDIATEVALUE)功能来继续搜索。图2-20硬编码值搜索结果搜素文本(TEXT):搜索输入的文本,支持正则表达式。如果读者选择了单个搜索,还需要使用下一处文本(NEXTTEXT)来继续搜索。23从零开始学IDA逆向 2数值系统以及IDA搜索功能图2-21搜索文本图2-22文本搜索结果搜索字节序列(SEQUENCEOFBYTES):搜索输入的字节序列。图2-23搜索字节序列24从零开始学IDA逆向 2数值系统以及IDA搜索功能图2-24字节序列搜索结果如果我们点击第一处,IDA反汇编视图会跳转到我们搜索结果地址。图2-25第一处“9090”搜索非完整函数(NOTFUNCTION):搜索下一处不完整的函数。Searchcompleted.Foundat004013D7.图2-26搜索非完整函数004013D7地址上单独的RET指令无法识别为函数。有时候,因为一些非法指令导致有些函数无法被IDA识别出来。以上是IDA中最重要的搜索功能。当然,使用Python脚本写几行代码能够提供更好的搜索结果。每次的搜索结果会在记录窗口中显示,直到读者关掉这个窗口。25从零开始学IDA逆向 2数值系统以及IDA搜索功能本教程逐步深入使得读者有一个更好的理解。26从零开始学IDA逆向 3CPU寄存器以及数据传输指令CPU寄存器以及数据传输指令3.1 IDA加载器读者可能已经了解到,当IDA加载器打开一个可执行文件后进行的是一种静态分析,包括程序的组成特点等内容。目前教程介绍的内容对于加载器和调试器都是通用的。作者会在今后两者有区别的地方提示读者。显然,程序被IDA加载后并没有执行,而是通过静态分析并且创建了数据库。这与使用调试器动态调试有显著区别。在加载器中,没有寄存器、栈和模块等内存窗口,这些内容只有在运行和调试程序时才会出现。使用IDA加载CrueheadCrackme(CRACKME.EXE)这个程序后,读者不会再在Windows任务管理器的进程列表里找到它的进程,除非读者使用IDA调试器它才会被运行。这对于恶意软件分析等方面非常有利。因为在调试过程中读者不会碰到所有需要研究的函数,而在加载器中,读者可以分析程序包含的所有函数,就算读者不知道它是如何被调用的。当然,涉及到函数分析的时候,尽管不像调试的时候会有窗口显示了寄存器的值,以及使用寄存器的指令,读者仍然需要掌握理解寄存器及相关指令的知识,以便了解程序执行的内容。3.2 寄存器处理器执行程序的时候需要一些额外的辅助,寄存器是其中之一。比如说ADD(加法)指令,两个内存中的数就无法直接相加,处理器必须将其中一个数传输到寄存器中,再加上另一个内存地址中的数。这只是一个例子,部分寄存器常有特定的用途。位通用寄存器有:EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI和EIP。在教程的后续章节中,有一部分对应64位系统的内容。EAX(accumulator,累加器):EAX常用于四则运法以及一些格式化指令。EBX(Baseindex,基址寄存器):EBX常用于存储起始内存地址。ECX(counter,计数器):ECX用于多种指令的计数器。同时也存储内存数据的地址偏移。使用计数器的指令包括字符串指令、偏移指令、移位指令以及循27从零开始学IDA逆向 3CPU寄存器以及数据传输指令环。28从零开始学IDA逆向 3CPU寄存器以及数据传输指令图3-1通用寄存器EDX(data):EDX通常用于存储乘积的部分位数以及除法的余数,同时也能存储起始内存地址。EBP(basepointer):EBP指向一个内存地址,主要作为一个函数中的参数以及变量的基址。EDI(destinationindex):EDI常用于字符串指令,指向目标字符串。ESI(sourceindex):ESI常用于字符串指令,指向初始字符串。EIP:存储即将执行的下一条指令的地址。ESP:存储栈顶地址。还有16位和8位寄存器,作为32位和16位寄存器的一部分。AX就是最后16位,AH是AX的前面8位,AL是AX的后八位。图3-2EAX、AX、AH和AL寄存器对于EBX有BX、BH和BL子寄存器,对于ECX有CX、CH和CL子寄存器,对于EDX有DX、DH和DL子寄存器。其他通用寄存器的9~16位没有命名也无法直接获取内容。其他还有一些寄存器。一个重要的辅助寄存器EFLAGS,根据它的值会在某些时刻改变程序的执行过程,这在后面教程中有所涉及。另外段寄存器直接指向了可执行程序不同的部分,比如CS=CODE,DS=DATA。还有值得注意的一点是常用数据类型的大小。IDA能够处理更多类型的数据,读者会在后续章节中进一步了解。最基本的是BYTE占用1个字节(8bit)内存,WORD占用2个字节(16bit)内存,DWORD占用4个字节(32bit)内存、QWORD占用8个字节(64bit)内存。29从零开始学IDA逆向 3CPU寄存器以及数据传输指令图3-3寄存器与子寄存器图3-4EFLAGS寄存器与段寄存器图3-5基础数据类型及内存占用30从零开始学IDA逆向 3CPU寄存器以及数据传输指令3.3 MOV指令IDA的指令集并不是世界上最简单的。大部分人习惯了ollydbg的反汇编既简单又容易理解,但是ollydbg提供的信息较少。数据传输指令MOV:将其始操作单元(src)的内容复制到目标单元(dest)。这里面有一些不同的方式,例如我们可以把一个寄存器中的值复制到另一个寄存器:MOVEAX,EDI。图3-6传递寄存器中的值大部分情况下,我们可以在寄存器间直接传输,但是EIP寄存器无法被直接赋值或者读取。例如MOVEIP,EAX这个指令就是非法的。另外一种方式就是我们把一个常量传输到寄存器中,例如:MOVEAX,1。图3-7将常量传递给寄存器将内存的地址而非取值传递给寄存器也是可以的。(这条指令不属于CRACKM_E.exe这个程序,而是在本章教程的附件veviewer.exe这个程序当中)。在图3-8中,被传递的值是一个内存地址,“OFFSET”这个词说明传递的是内存地址而不是内存的值。31从零
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026院感知识考试题及答案
- 妇幼志愿服务资源配置优化策略
- 头颈部鳞癌免疫治疗指南
- 提高卫生间排水立管一次安装合格率
- 大数据分析AKI恢复期降压方案的优化
- 多边卫生合作中IHR的实施挑战与应对策略
- 多组学整合标志物的验证策略
- 2025年中职电梯安装与维修保养(电梯检修技能)试题及答案
- 2025年高职环境设计(环境教学设计)试题及答案
- 2025年大学(环境科学)环境污染监测试题及答案
- 安徽省九师联盟2025-2026学年高三(1月)第五次质量检测英语(含答案)
- (2025年)四川省自贡市纪委监委公开遴选公务员笔试试题及答案解析
- 2026届江苏省常州市高一上数学期末联考模拟试题含解析
- 2026年及未来5年市场数据中国水质监测系统市场全面调研及行业投资潜力预测报告
- 2026安徽省农村信用社联合社面向社会招聘农商银行高级管理人员参考考试试题及答案解析
- 强夯地基施工质量控制方案
- 艺考机构协议书
- 2025年12月27日四川省公安厅遴选面试真题及解析
- 2025-2030中国海洋工程装备制造业市场供需关系研究及投资策略规划分析报告
- 《生态环境重大事故隐患判定标准》解析
- 2025年度吉林省公安机关考试录用特殊职位公务员(人民警察)备考笔试试题及答案解析
评论
0/150
提交评论