拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

IDA 5.0老版本实战:逆向分析、脚本自动化与避坑指南

IDA 5.0老版本实战:逆向分析、脚本自动化与避坑指南 简介IDA 5.0是经典的交互式反汇编工具面向软件逆向分析、漏洞研究和CTF学习者能够把二进制程序转换为清晰的汇编代码借助交叉引用与流程图辅助理解程序逻辑、定位关键函数。该资源包共114个文件压缩后约55.71MB主要包含exe主程序、pat模式文件、idt函数类型库、sig签名库以及bat批处理启动脚本同时配有txt说明、readme指南和idc脚本覆盖工具运行所需的完整扩展体系。目前已有318人学习下载适合希望搭建本地静态分析环境并快速上手IDA基础操作的用户也适用于对二进制程序进行初步漏洞研判的练习场景。包内整合了程序本体、常用配置脚本、中文化界面文件与CRC16校验示例代码既可用于日常逆向练习也能作为学习函数签名识别、结构解析和批量自动化分析的参考素材整体目录清晰便于按需取用。1. 反汇编工具IDA 5.0为什么这个2009年的老版本还在分析室里活着在隔离环境里分析一个老病毒样本手头只有一台Windows XP虚拟机新版本IDA装插件装到心态崩溃最后翻出一个十几年前的反汇编工具IDA 5.0安装包十分钟就把样本的导入表、入口点和关键跳转理清楚了。这不是情怀是这批老工具在特定场景下确实还能打。IDA 5.0是IDA Pro从商业工具走向交互式分析的关键版本界面还是经典的MDI多窗口风格数据库格式还是单个.idb文件不依赖任何在线服务。这篇文章会讲清楚它在今天还能干什么、环境怎么搭、脚本怎么写、哪些坑会翻车适合还在维护老系统、分析历史样本、或者在离线环境里做逆向的从业者。2. 搭建IDA 5.0可用环境虚拟机、Python 2.6与三个启动参数2.1 为什么5.0需要特定环境Win10的兼容性问题与虚拟机方案IDA 5.0是Windows XP时代的产物纯Win32 GUI没做过高DPI适配也没考虑过Win10的窗口消息变化。直接在现代系统上双击idaw.exe常见症状是程序无反应、菜单栏画不出来、或者一打开文件就闪退。这些问题表现得很玄学但本质是同一个老代码的窗口消息循环和新系统的壳不兼容。我一般不会在物理机上折腾兼容模式直接进虚拟机。Windows XP SP3或Windows 7 x86都行5.0在32位系统里最稳。虚拟机的好处是快照后悔药——分析到一半把样本数据库搞坏了回滚快照重来就行。共享文件夹把样本目录映射进去注意路径要纯英文。echo off set IDADIRC:\tools\ida50 set PATH%IDADIR%;C:\Python26;%PATH% set SHARED\\vmware-host\Shared Folders\samples cd /d %SHARED% start %IDADIR%\idaw.exe -A -Lload.log sample.bin这段批处理做的事情很简单把IDA安装目录和Python 2.6目录加进当前进程的PATH切换工作目录到共享文件夹然后以-A参数启动图形界面。-A是autonomous mode意思是自动确认加载过程中的所有对话框不弹窗等待人工点击。-Lload.log把启动和加载日志写到文件分析失败时可以直接翻日志比盯着屏幕猜原因快得多。注意这里的start 是为了让idaw.exe在一个独立窗口里跑CMD窗口本身可以关掉。工作目录cd /d必须先切否则IDA会把数据库文件放在C盘默认路径样本在哪反而找不到。2.2 装好Python 2.xIDAPython的初始化和默认路径IDA 5.0自带的IDAPython插件是基于Python 2.x的版本太新或太旧都起不来。常见做法是装Python 2.6到默认路径C:\Python26然后把C:\Python26和C:\Python26\DLLs加进系统PATH。很多人在这里翻车是因为装了Python 3.x然后信心满满地去开IDAPython窗口结果报错ImportError: No module named idc。5.0的年代还没有Python 3的概念IDAPython插件在初始化时会查找Python 2解释器找不到就直接禁用整个插件。装好Python 2.6之后在IDA里打开Python窗口测试import idc print idc.GetFunctionName(0x401000)如果这条输出是某个函数名IDAPython就通了。如果报错检查两处第一系统PATH里是否真的能执行python -V第二IDA安装目录下的ida.cfg里IDAPython相关配置有没有指定Python主目录。不同发行包的写法不一样但5.0的插件基本只会找这两个地方。2.3 用启动参数控制分析行为-A、-B、-S、-L的实际用法图形版idaw.exe适合人机交互但批量任务不能靠人一个个点。5.0自带文本版idat.exe没有GUI纯命令行跑批处理。用idat.exe -B可以直接完成“加载文件→自动分析→保存数据库→退出”的全流程输出的.idb文件和图形版打开过的数据库格式完全一样。for %%f in (D:\samples\*.bin) do ( idat.exe -A -B -L%%~nf.log -Spost.idc %%f )这段话的意思是遍历D:\samples下所有.bin文件对每个文件执行一次批处理分析。-A自动确认所有提示-B批处理模式分析完自动保存并退出-L指定日志文件名这里用%%~nf取当前文件名的主名保证每个样本的日志不互相覆盖-Spost.idc指定一个IDC脚本在数据库完成初始自动分析后执行。-S脚本的执行时机值得单独强调它是在自动分析完成之后、数据库保存之前运行的。这意味着脚本改动会写进最终生成的.idb里所以post.idc可以承担重命名、加注释、导出报表这些后处理工作不用分析完再打开数据库手动操作。3. 用IDA 5.0跑通第一个二进制分析从投喂文件到产出.idb3.1 投喂文件处理器类型与数据库格式选择启动图标双击之后第一步是File Open把样本投进去。IDA弹加载对话框时最关键的选项是处理器类型。5.0对x86、ARM、MIPS的默认识别已经做得不错但偶尔会把32位PE识别成16位代码反汇编出来的指令全是mov ax, bx这种根本没法看。遇到这种情况在加载对话框里手动指定处理器为metapc同时把Address size确认成32位。5.0的数据库格式不是6.x以后的.i64只有.idb一种但它是一个单文件拷给同事、存进归档、放沙箱都方便。这也是为什么我至今保留5.0的一个理由老样本的idb数据库体积小分析完打包很容易。加载时还有一个选项叫Load resources默认勾选。对PE文件来说资源段里经常有成堆的对话模板和图标分析时用不上反而拖慢自动分析。我习惯在加载对话框里把Resources这类无关段设为不加载只保留代码段和数据段后续分析会清爽很多。3.2 自动分析完成后的第一轮检查函数窗口、段窗口与交叉引用分析完成光标停在入口点。5.0的界面第一次看会有点拥挤——函数窗口、段窗口、消息窗口、反汇编窗口全部嵌在同一个MDI框架里和现代IDA的停靠布局完全两回事。新手很容易在窗口堆里迷路但老手反而觉得顺手所有信息平铺在眼前不用来回切标签。第一轮检查按这个顺序先看函数窗口里有没有一堆sub_401000之类的自动命名函数如果有说明代码段识别正常再打开段窗口看.PE头、代码段、数据段、资源段划分是否合理然后在入口点地址上按X看交叉引用确认入口点有没有被其他位置引用——没有引用的入口点通常意味着加壳或者花指令。5.0的快捷键和现代版基本一致G跳转地址N重命名;添加注释U取消定义C强制转代码D强制转数据。字符串窗口在5.0里叫Strings打开后先扫一遍有没有可疑的URL、路径、注册表项这些往往是快速判断样本行为的最短路。3.3 把手工流程变成批处理一个产出.idb的最小命令单文件手工分析没问题但一次拿到几十个样本时手工点开一个个文件再等分析人就被绑死在机器前了。这个场景最适合用idat.exe -B跑批处理配合一个简单的Shell循环。#!/bin/bash for f in /mnt/samples/*.exe; do wine /tools/ida50/idat.exe -A -B -L$(basename $f).log $f done这段脚本跑在Linux主机上用wine执行Windows版IDA。-B会为每个样本生成与文件名同名的.idb数据库文件日志单独命名不会混到一起。跑完之后分析员只需要打开idb看结果不需要再经历一遍自动分析的等待时间。参数上有个细节-B模式下如果样本是DLL或驱动5.0偶尔会因为没有入口点而直接跳过分析此时加一个-T参数指定文件类型不会起决定性作用更可靠的是在加载后手动用idaw.exe重新加载一次数据库。批处理适合快速粗筛精细分析还是得回到图形界面。4. IDC脚本与IDAPython提取函数列表和交叉引用的可复现代码4.1 用IDC枚举函数和段脚本怎么写、哪里填地址IDA 5.0的脚本主力是IDC语法和C很像运行在IDA内置的解释器里。所有IDC脚本的入口都是main()函数通过File Script Command可以加载执行也可以在-S启动参数里指定。最基本的任务是把当前数据库里所有函数名和起始地址导出到Output窗口#include idc.idc static main() { auto seg, ea; for (seg FirstSeg(); seg ! BADADDR; seg NextSeg(seg)) { for (ea SegStart(seg); ea SegEnd(seg); ea NextFunction(ea)) { if (ea ! BADADDR GetFunctionName(ea) ! ) { Message([*] %08x %s\n, ea, GetFunctionName(ea)); } } } }逻辑很直白外层循环用FirstSeg()和NextSeg()遍历所有段内层循环从每个段的起始地址开始用NextFunction(ea)不断取下一个函数入口。NextFunction的入参是一个地址返回值是比这个地址大的下一个函数起点找不到就返回BADADDR。GetFunctionName用来确认当前地址确实是一个有名函数——5.0里未定义区域调用它可能返回空字符串必须做这个防御性判断。Message函数把字符串送到Output窗口%08x格式化地址为8位十六进制。如果想顺便把函数长度也打出来可以后续用FunctionEnd(ea)减去ea。这个脚本是后续所有自动化工作的基础看不懂就先把它跑通。4.2 用IDAPython 1.x接口查交叉引用与6.0以后的差异IDAPython在5.0里已经是官方插件但它的API是1.x时代的接口和现代版本有显著差异。最大的坑在交叉引用6.0以后有idautils.XrefsTo直接返回迭代器而5.0里只能用idc.XrefsTo拿一个链表头然后手动顺着next指针往下推。import idc def dump_xrefs(ea): print(xrefs to 0x%x % ea) ref idc.XrefsTo(ea, 1) while ref is not None: print( from 0x%x (type%d) % (ref.frm, ref.type)) ref ref.nextidc.XrefsTo(ea, 1)的第二个参数表示包含哪种引用0只查代码引用1查代码加数据引用。返回的ref对象带frm和type两个常用字段分别表示引用来源地址和引用类型。现代版本的IDAPython里同一个函数名会直接返回列表可以直接for x in idc.XrefsTo(ea):但5.0不行用for循环会报Xref object is not iterable。所以写5.0脚本时如果看到网上教程用idautils.XrefsTo先确认目标机器的IDA版本。5.0里没有idautils模块只有idc和idaapi两个核心模块能用就尽量只用idc。4.3 输出与导出把分析结果写成文本报表脚本最大的价值不是打印到窗口而是把分析结果落地成文件。5.0的IDC提供了和C标准库几乎一样的文件操作函数fopen、fprintf、fclose用法也基本一致。auto fp, ea; fp fopen(D:\\report.txt, wt); if (fp 0) { Message(open file failed\n); return; } for (ea NextFunction(0); ea ! BADADDR; ea NextFunction(ea)) { fprintf(fp, %08x %s\n, ea, GetFunctionName(ea)); } fclose(fp);代码里的D:\\report.txt用了双反斜杠这是IDC字符串转义的硬性要求写成单反斜杠会被解析成转义字符导致路径错误。NextFunction(0)从地址0开始找第一个函数NextFunction(BADADDR)会直接返回BADADDR所以循环退出条件自然成立。这个脚本输出的是一份纯文本的“地址-函数名”对照表后续可以交给其他工具做进一步处理比如统计函数数量、筛选特定前缀的自动命名函数。导出前先确认当前数据库已经完成自动分析否则函数列表是空的。5. IDA 5.0常见问题避坑闪退、乱码、签名加载失败的六个真实场景5.1 闪退、菜单消失兼容性设置与虚拟机里的固定流程现象在Windows 10 64位上双击idaw.exe进程起来一下又消失或者主窗口出现但菜单栏全是空白。原因5.0的GUI是标准的Win32 MDI框架Win10对旧版菜单绘制API的兼容性做得并不彻底再加上高分屏DPI缩放菜单渲染经常直接崩。解决优先用Windows XP或Windows 7虚拟机。如果必须在Win10物理机跑右键idaw.exe属性里把兼容模式改成Windows XP SP3并把DPI缩放设为“系统”。但我自己的习惯是根本不折腾虚拟机里固定放一个5.0的干净安装数据库坏了就回滚快照比在宿主机上重装快得多。5.2 IDAPython起不来ida.cfg里的Python路径到底指什么现象菜单里能看到IDAPython入口但点开Python窗口执行任何脚本都报No module named idc或者直接提示failed to initialize python。原因5.0的IDAPython插件只是封装真正的Python解释器得自己装。插件初始化时会去系统PATH里找Python 2找不到就初始化失败找到了Python 3也会初始化失败因为解释器ABI不匹配。解决装Python 2.6到C:\Python26确保环境变量PATH里有C:\Python26。然后检查ida.cfg里IDAPython段落有些发行包需要手动指定Python键指向python.exe。装完Python 2后一定先执行python -V确认命令行能调到2.x版本再回IDA里重试。5.3 FLIRT签名加载失败签名文件与st.zip的关系现象分析一个常见的MSVC编译的PE文件函数窗口里全是sub_401000这种地址名没有一个库函数名手动加载签名时对话框是灰的。原因5.0的FLIRT签名文件存放在安装目录的sigs文件夹下常见库的签名打包在一个st.zip里。缺少这个压缩包或者st.zip没有被解压签名加载功能自然不可用。解决先确认sigs目录存在且里面有st.zip如果有压缩包就先解压。然后在IDA里通过File Load File FLIRT Signature File按目标程序的编译特征选择对应的.sig文件比如msvcrt.sig对应MSVC运行时vc32rtf.sig对应不同版本的Visual C运行时。加载错了签名会把不相关的函数误标成库函数所以每次只选一个最贴近的不要一把全加进去。5.4 分析慢到像死机先把自动分析选项关一半现象把一个较大的驱动文件拖进IDA进度条一直停在中间CPU占用100%等十分钟还没加载完。原因5.0的自动分析默认开启了一堆选项包括数组识别、指针数组自动生成、类型推断等。遇到资源段很大的文件分析器会反复在数据堆里找指针引用计算量直接爆掉。解决在加载对话框弹出时选择“不进行自动分析”或者进入Options Analysis Options把Create as array、Rename Dummy Functions这类选项关掉。让文件先完成加载再针对入口点附近区域按C手动触发局部分析。这个做法最适合加壳样本——壳的入口点代码才几百字节手动分析比全量分析快得多而且不会被壳的垃圾数据带到沟里。5.5 中文路径、中文用户名一个容易忽略的插件级故障现象把样本放在D:\病毒样本\目录下IDA加载到一半报错或者在中文用户名环境下IDAPython怎么都加载不成功。原因5.0对非ASCII路径支持不完整尤其是脚本运行和临时文件创建时底层调用的是老式ANSI API中文路径会返回无效句柄。这是老工具的系统级限制不是配置问题。解决所有样本、数据库、日志文件一律放纯英文路径下。Windows用户名如果是中文检查当前用户目录下的IDA配置目录是否为乱码路径最简单的办法是新建一个英文名管理员账户专门跑IDA或者干脆在虚拟机中文系统里直接建英文用户名。遇到这类问题先别查配置先看路径。5.6 数据被当成代码手动转换与函数重建的顺序现象函数窗口里没有预期那么多函数反汇编窗口里看到的是一堆无意义的指令字节按F5也没有反编译结果。原因自动分析把数据段或填充字节误判成代码导致函数边界错乱。5.0的自动分析在遇到花指令时也容易断链函数列表就缺了一块。解决先按U取消当前位置的定义再按C强制转换成代码让IDA从当前位置重新反汇编如果是一段明确的数据按D切换成数据定义。函数边界错误时用Edit Functions Create Function手动框选函数范围。顺序很重要必须先U再C直接C往往会把指令叠加在已有定义上结果更乱。6. 一个收尾技巧用FLIRT签名把库函数名批量找回来6.1 让FLIRT签名自动识别库函数批处理模式下自动分析不会帮你加载FLIRT签名所以库函数名全是sub_xxxx。解决办法是把签名加载动作写进-S指定的IDC脚本在自动分析完成后自动执行。#include idc.idc static main() { auto fp; // 自动加载MSVC运行时签名按需改成对应.sig文件名 if (LoadLibrarySignature(msvcrt.sig) 0) { fp fopen(D:\\sig_error.log, at); fprintf(fp, load signature failed\n); fclose(fp); } }LoadLibrarySignature是IDC里专门用来加载FLIRT签名的函数参数是签名文件名。加载成功返回非零值失败返回0此时把错误写进日志而不是直接结束脚本。这个脚本放进批处理流程后每个样本的数据库里都会带上库函数名后续人工分析时能省掉大量命名工作。6.2 验证你的分析口径一次重跑的检查清单跑完批处理之后不要直接开新样本先花五分钟验证上一批结果是否可靠。检查入口点是否指向可执行代码函数窗口里的函数数量是否在合理范围字符串窗口里有没有出现之前见过但这次没识别出来的关键串再看几个关键地址的交叉引用是否为预期跳转关系。我自己每次跑完都会把Output窗口里的分析摘要另存一份下次再分析同类型样本时拿出来对比。养成这个习惯之后样本异常、签名加载失败、分析选项被改这类问题在第一时间就能看出来不至于分析了一半才发现上一批结果全被污染了。希望帮到你。本文还有配套的精品资源点击获取
返回列表