行业解决方案
查看所有行业解决方案
IDA 用于解决软件行业的关键问题。
发布时间:2026-07-29 05: 13: 00
使用IDA进行代码审计时,危险函数只是定位问题的入口,能否形成实际风险,还要继续检查参数来源、长度限制、过滤逻辑和最终调用条件。处理“IDA代码审计如何筛选危险函数IDA代码审计时怎么追踪跨函数数据流”时,可以先从导入项和调用位置建立检查清单,再沿参数、返回值、全局变量和结构体字段还原完整的数据传递路径。
一、IDA代码审计如何筛选危险函数
筛选危险函数时,不宜一次搜索大量名称后逐个查看。更有效的方式是先按风险类型分类,再检查每个调用点是否接收了外部可控数据。
1、从导入项建立危险函数清单
①使用IDA打开目标程序,等待自动分析完成。
②点击【视图】→【打开子视图】→【导入项】。
③在导入项中搜索需要检查的函数名称。
④双击目标函数进入导入地址。
⑤按X键打开【交叉引用】窗口,查看所有调用位置。
⑥双击一个调用位置,再按F5打开调用者的【伪代码】窗口。
可以优先检查以下几类函数:
(1)字符串复制与格式化函数,如strcpy、strcat、sprintf和vsprintf。
(2)内存操作函数,如memcpy、memmove和memset。
(3)命令或进程执行函数,如system、popen、WinExec和CreateProcess。
(4)文件、网络和动态加载函数,如fopen、recv、LoadLibrary和GetProcAddress。
交叉引用可以显示函数的代码调用和数据引用,是从危险函数进入实际调用者的主要入口。
2、确认危险调用是否存在边界检查
①进入危险函数的一个调用位置。
②先查看目标缓冲区的定义位置,确认缓冲区大小。
③查看源数据来自固定字符串、函数参数、文件内容还是网络数据。
④检查长度参数是否直接来自外部输入。
⑤向上查找是否存在长度比较、截断或返回值判断。
⑥继续检查边界判断与危险调用之间是否存在其他赋值。
例如分析memcpy(dst,src,len)时,需要分别确认dst的容量、src的来源和len的计算方式。即使使用了memcpy,只要长度始终小于目标缓冲区容量,也不能直接判定为问题。
3、识别封装函数和间接调用
危险函数可能被包装在内部函数中,也可能通过函数指针调用,直接搜索名称容易漏掉。
①在危险函数的交叉引用中进入一个包装函数。
②检查包装函数是否原样传递缓冲区和长度参数。
③按N键给包装函数改成便于识别的名称。
④返回包装函数名称处按X,继续查看上层调用者。
⑤遇到函数指针调用时,将光标放在调用表达式上。
⑥通过右键菜单中的【设置调用类型】补充函数原型。
⑦按F5刷新伪代码,重新检查调用参数。
补充函数类型后,IDA可以更准确地显示间接调用的参数和返回值,减少因原型缺失造成的错误判断。
二、IDA代码审计时怎么追踪跨函数数据流
跨函数数据流追踪的核心,是确认数据从哪里进入、经过哪些函数和变量、是否经过校验,最终又流向哪个敏感操作。可以分别采用从危险调用向上追踪和从输入位置向下追踪两种方式。
1、从危险函数向上追踪数据来源
①进入已经确认的危险调用位置。
②记录每个参数在当前函数中的变量名称。
③向上查找这些变量最后一次赋值的位置。
④变量来自当前函数参数时,记录它对应第几个参数。
⑤将光标放在当前函数名称上,按X查看调用者。
⑥进入调用者,找到传入相同参数位置的表达式。
⑦重复追踪,直到定位到文件读取、网络接收、命令行参数、环境变量或用户输入位置。
参数类型显示错误时,可以将光标放在函数声明上按Y打开【设置类型】,补全返回类型和参数类型。函数原型修正后,接收返回值的局部变量也可能同步恢复。
2、从输入位置向下验证完整路径
①找到recv、read、fread或参数解析函数的调用位置。
②记录外部数据保存到哪个局部变量或全局变量。
③在变量名称或全局地址上按X查看引用位置。
④进入每个读取位置,检查数据是否被复制、拼接或转换。
⑤数据作为函数参数继续传递时,进入被调用函数。
⑥数据通过返回值传递时,返回调用者检查接收变量。
⑦最终到达危险函数后,核对中间是否存在有效的长度检查或内容过滤。
追踪过程中可以按N将变量改为input_data、input_len、checked_len等名称。名称保持一致后,跨越多层函数时更容易区分原始输入、校验后的长度和最终写入位置。
三、如何确认数据流是否构成实际风险
完成调用链追踪后,还要验证路径条件是否能够成立。某条数据流在代码中存在,不代表运行时一定能走到危险调用。
1、整理并验证完整审计链路
①记录输入函数、数据变量、传递函数和危险函数的地址。
②在关键判断位置添加注释,标记长度限制和失败分支。
③检查每一层函数是否修改了数据内容或长度。
④确认危险调用所在分支需要满足哪些条件。
⑤检查目标缓冲区是在栈、堆还是全局区域中分配。
⑥在授权测试环境中设置断点,观察参数值和实际执行路径。
⑦静态结果与运行结果一致后,再整理问题位置、触发条件和影响范围。
重点检查校验是否使用了正确变量。例如代码虽然比较了缓冲区长度,但危险调用使用的是另一个未经限制的长度值,这类检查无法真正阻断数据流。
总结
处理“IDA代码审计如何筛选危险函数IDA代码审计时怎么追踪跨函数数据流”时,可以先从【导入项】和交叉引用定位危险调用,再核对目标缓冲区、数据来源和长度限制。跨函数追踪时,应同时检查参数、返回值、全局变量和结构体字段,并通过重命名、类型修正和注释保存分析关系。完成静态追踪后,还要验证分支条件和运行时参数,避免把无法触发的调用链误判为实际问题。希望本文对大家开展IDA代码审计和整理跨函数数据流有所帮助。
展开阅读全文
︾