行业解决方案
查看所有行业解决方案
IDA 用于解决软件行业的关键问题。
IDA Pro在反汇编ARM代码时,应当怎样去分辨它的模式,还有在分析ARM的跳转表时,又该采用怎样的方法,这是处理固件、so库和嵌入式程序时经常遇见的问题。ARM代码里常常会同时存在ARM和Thumb两种模式,较新的程序则可能是AArch64架构。如果模式判断出现错误,IDA所显示的指令就会变得异常,函数的边界、交叉引用以及F5生成的伪代码,也都会跟着出现问题。跳转表的情况与此类似,一旦IDA没有正确识别,switch语句的分支就会断开,分析人员就很容易遗漏关键逻辑。
IDA Pro调试so文件的时候,会让人觉得很难附加,还有一旦so文件的符号缺了,该用什么办法去把信息补上,这是在做原生库分析时很容易碰到的问题。so文件一般不是自己独立去跑的程序,它得由某一个App、一个可执行文件或者一个进程动态地加载进来,所以在调试的时候,不能只把so文件往IDA里一拖,就等着它马上能停在断点上。IDA这个工具本身是支持调试的,也支持远程调试,对于Android原生库的调试也覆盖了ARM32、AArch64、x86和x64这些架构,但是到底能不能稳定地附加上去,还要看进程正处在什么状态、权限够不够、架构是不是匹配,以及符号信息是不是完整。
很多人第一次分析so文件,最容易走偏的地方不是不会开伪代码,而是一上来就急着找主逻辑,结果把导出函数、入口点、初始化链和业务函数全混在一起。Hex-Rays官方文档其实把这条线分得很清楚,IDA有函数窗口、导出窗口、入口点列表和交叉引用视图,这些窗口本来就是配合着用的。so文件不是普通独立可执行文件,先把入口层、导出层和函数层分开,后面的分析会顺很多。
在IDA里处理arm64文件,先要分清两件事。第一件事是“文件能不能正确按AArch64解码”,第二件事是“函数调用约定有没有被识别对”。Hex-Rays官方文档对第一层说得很直接,加载新文件时先接受合适的loader和processor type,通常就是最稳的起点;而在arm处理器选项里又特别提醒,想正确解码AArch64指令,代码所在segment必须被设成64-bit。第二层则更依赖类型系统和ABI规则,Hex-Rays官方说明里明确写到,反编译器会尝试推断函数类型和calling convention,但在少数情况下会失败,这时就需要手工改函数类型。Arm官方AAPCS64也给出了标准规则,也就是x0到x7用于整型和指针参数与返回值,x8用作间接返回位置寄存器,v0到v7用于浮点和SIMD参数与返回值。
很多人提到IDA Pro反编译工具,第一反应还是“把汇编变成伪代码”,但从Hex-Rays官方资料来看,它的价值不只在这一点。IDA Pro本身是反汇编器、反编译器和调试器的组合工具,而反编译模块是在反汇编结果之上生成接近源代码结构的C风格伪代码,方便分析逻辑、变量关系和控制流程。官方还强调,反编译输出追求可读性、结构化和语义接近原始源码,所以它更适合做二进制理解,而不只是看一眼大概意思。
做内存态分析时,很多人前面卡在导入,后面又卡在地址。快照文件明明已经拿到了,放进IDA以后却不是段没落对,就是函数全飘,继续往下看交叉引用也越来越怪。这个问题通常不是单独一处没点对,而是导入方式和地址校准顺序一起出了偏差。Hex-Rays官方文档里把这件事拆得很清楚,一类是调试中的【Take memory snapshot】,直接把进程内存拷进数据库;另一类是把外部二进制或dump作为二进制内容再装进现有数据库或新建数据库里分析。两条路入口不同,后面的基址处理方法也不一样。
做逆向时,函数边界一旦识别歪了,后面很多判断都会跟着跑偏。轻一点的情况,是伪代码里突然冒出跳不回来的分支,或者函数尾巴被截掉一段。重一点的情况,是本来属于别的函数的代码被吞进来,结果图视图、交叉引用、反编译输出全都开始别扭。Hex-Rays官方对这件事讲得很直白,函数边界、函数尾块、无返回函数分析和重新分析机制,本来就是连在一起看的,边界错了,后面很多分析结果都会被带偏。
用Hex-Rays看伪代码时,很多人不是不会点功能,而是顺序没走对。改了类型以后没刷新,看到的还是旧结果;先急着改变量名,结果类型还没理顺,越改越乱。官方文档其实把这套流程写得很明白,伪代码窗口支持手动重编译,局部变量也可以直接重命名、改类型、做变量映射,只是这些动作要按顺序配合着用,效果才会稳定。
很多易语言样本进IDA后,最先卡住的往往不是代码段,而是资源段看不全、中文字符串一片乱码,结果连入口线索都不好找。更稳的做法是先把资源和字符串这两类“静态线索”处理干净,再去补函数和调用链,这样后面的分析效率会高很多。IDA本身支持按需加载更多PE段、按文件偏移跳转、以及对单个字符串或全局字符串单独指定编码,这几项正好对应这类问题。
用IDA看伪代码时,真正影响阅读效率的,通常不是F5能不能出结果,而是名字、类型和表达式有没有被持续整理。Hex-Rays官方文档把这套路径写得很明确,伪代码窗口本身就支持Rename、Set type、Hide/unhide、Split/unsplit expression这些交互动作,说明反编译结果不是只能被动接受,而是可以一边看一边改。