刚开始学习IDA Pro的时候,如果选的样本太复杂,很容易就会陷进数量庞大的函数、库代码和异常分支里面,很长一段时间都理不清楚头绪。所以先要解决两个问题:一是IDA Pro逆向教程里练什么样本更合适,二是在学习过程中先练静态分析还是先练动态调试。比较建议的做法是从自己编译的小型程序入手,先借助静态分析把程序的结构看清,再用调试器去验证自己的判断。练习的范围最好限定在自编译程序、公开教学样本和已经获得授权的文件之内,不要直接去分析未授权的商业软件,也不要随便运行来源不明的程序。
一、IDA Pro逆向教程练什么样本更合适
入门用的样本不需要很复杂的功能,最要紧的是源码逻辑清楚,编译之后还能在IDA Pro里比较容易地找到和源代码对应的关系。官方提供的入门资料也是从加载二进制文件、等待自动分析完成、查看反汇编结果这几步开始的,而且IDA会把分析得到的信息都存入数据库文件,你在里面修改注释、重命名符号,都不会改动原始的可执行文件。
1、先练自编译控制台程序
可以自己动手写几个小程序,内容覆盖字符串判断、数字计算、菜单选择、循环、数组和简单的文件读取。先把源码保留好,再分别编译出Debug版本和Release版本,这样就能够很直观地看到变量名、编译器优化以及函数内联这些因素是怎么影响反编译结果的。
2、再练多个函数之间的调用
等到对单函数的结构看熟之后,可以再往程序里加入登录判断、配置读取、数据校验和错误提示这一类的模块。进入IDA之后,多去查看Imports、Strings、Functions和交叉引用,尝试从一段提示性的字符串追到它所调用的函数,再顺着函数之间的调用关系,把整条执行路径慢慢还原出来。IDA的Imports视图会把动态链接导入符号以及对应的库名称列出来,很适合用来判断程序到底依赖了系统的哪些功能。
3、使用公开教学样本验证调试流程
Hex-Rays官方出品的调试教程里专门提供了一个简单的Windows控制台程序,用它来演示本地调试和错误定位的整个过程。在初学阶段,可以优先使用这一类专门为教学设计的样本,因为它们的功能逻辑范围非常明确,一旦遇到问题也容易对照资料来解决。
4、暂时避开复杂样本
像大型软件、驱动、固件、加壳文件和混淆过的程序,这些东西会增加大量的干扰信息。在基础操作还没有完全熟悉的时候,不适合拿这类文件去检验自己的学习效果。更合理的顺序是先把函数、字符串、交叉引用、基本块和断点这些基本功用顺手,再逐步提高分析难度。
二、IDA Pro逆向教程里先练静态还是动态
刚入门的阶段,比较建议先做静态分析,再进行动态调试。静态分析主要负责建立对程序整体的认识,动态调试则用来验证程序实际运行时的执行路径是不是和自己预想的一致。只看伪代码容易忽略程序运行需要满足的具体条件,而只跟着代码单步执行,又容易在大量的汇编指令里迷失方向。
1、先用静态分析找到入口
把程序加载进去,等待自动分析完成之后,先去看一看字符串、导入函数、主函数和关键的分支部分。按下【F5】可以把当前函数反编译成一段接近C语言的伪代码,再按【Tab】键则能在反汇编视图和伪代码视图之间来回切换,利用这两种视图共同梳理逻辑会更清楚。
2、用流程图理解判断关系
遇到分支较多的函数时,可以把视图切换到Graph View,观察其中的基本块和它们之间的跳转关系。按照官方文档的说明,流程图中的每一个节点都代表一个基本块,连线则表示代码之间的交叉引用关系,按下空格键就可以在图形视图和普通文本视图之间反复切换,对于理清分支结构很有帮助。
3、再用动态调试去确认猜测
在静态分析里找到可疑的函数之后,再打开调试器,在输入处理、条件判断或者结果输出位置的附近设好断点,接着运行程序,观察寄存器、调用栈以及变量的变化情况。做动态调试时不一定要从入口处逐条单步,带着具体的问题有目的地设置断点,往往能更快地抓到关键变化,效率也更高。
三、IDA Pro入门练习怎样安排
每一次练习的时候,都可以给样本设定一个明确的任务,不要打开程序就漫无目的地来回翻阅函数。
1、先完成结构识别
把程序的入口、主要函数、关键字符串和导入函数都记录下来,对自己已经看明白的函数可以重新命名并添加注释,这样后面回看时也更容易回忆。
2、再完成逻辑还原
从中挑选一个判断流程,把它需要的输入条件、经过的分支路径以及最终的输出结果都写下来,然后再回到源代码里去核对自己分析的结论是不是正确,用这种前后对照的方式会学得更加扎实。
3、最后做动态验证
只设置少量几个断点,换用不同的输入数据去反复运行程序,观察它是不是按照预期进入到对应的分支里面。每次练习只集中解决一个具体的问题,练完之后把IDA的数据库文件保存下来,以后还可以继续在原来的基础上补充更细致的分析记录。
总结
关于IDA Pro逆向教程练什么样本更合适,以及先练静态还是动态的问题,通常建议从自己编译的小型控制台程序和公开的教学样本入手。学习的顺序上,可以先以静态分析为主线,把字符串、导入函数、交叉引用和流程图看清楚,再用动态调试去验证那些关键的判断分支。只要练习的样本范围框得足够清楚,每一次练习的目标又很具体,那些基础的分析操作就更容易被消化和记住。
