ARTICLE DETAIL

资讯详情

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

radare2 报错 “Cannot find R2PATH/format/dll/DLLNAME.sdb“ 的排查与 DLL 序号符号表(.sdb)生成指南

radare2 报错 “Cannot find R2PATH/format/dll/DLLNAME.sdb“ 的排查与 DLL 序号符号表(.sdb)生成指南 radare2 报错 Cannot find R2PATH/format/dll/DLLNAME.sdb 的排查与 DLL 序号符号表.sdb生成指南【免费下载链接】radare2UNIX-like reverse engineering framework and command-line toolset项目地址: https://gitcode.com/gh_mirrors/ra/radare2遇到Cannot find R2PATH/format/dll/DLLNAME.sdb提示说明 radare2 在当前环境中缺少对应 Windows DLL 的序号ordinal符号映射文件。本文以 doc/sdb_ordinal.md 为核心讲解这一报错的成因、用rabin2 -rs一键生成.sdb序号映射文件的完整流程以及如何将新生成的 DLL 序号表合入仓库的构建体系帮助你在逆向 PE 程序时获得完整、可读的导入符号名称。报错背景radare2 如何解析 DLL 序号导入Windows PE 导出表中每个导出函数既有名称name也可能同时被分配一个 1 起始的序号ordinal。为了缩小二进制体积或规避符号暴露部分 DLL 导出条目只有序号、没有函数名。radare2 在分析这类二进制时会查询一张序号 → 函数名的映射表路径固定为R2PATH/format/dll/DLLNAME.sdbR2PATH是 radare2 的共享数据目录安装后通常为share/radare2/版本号/format。这张映射表以 radare2 自研的 sdbString DataBase格式存储。当目标 DLL 对应的.sdb文件不存在时分析器便无法把序号还原为函数名只能输出Cannot find R2PATH/format/dll/DLLNAME.sdb之类的告警。仓库根目录 Makefile 展示了这些文件的安装路径mkdir -p ${WINDIST}/share/radare2/${VERSION}/format/dll cp -f libr/bin/d/dll/*.sdb ${WINDIST}/share/radare2/${VERSION}/format/dll也就是说libr/bin/d/dll/目录下的全部.sdb文件在构建时会被统一拷贝到format/dll/数据目录供运行时查询。解决步骤一用 rabin2 提取 DLL 序号符号doc/sdb_ordinal.md 给出的核心命令是一行管道rabin2 -rs DLLNAME.dll | grep -i DLLNAME | grep -v Ordi | grep ^k | cut -d / -f 4- DLLNAME.sdb.txt逐段拆解这行命令的作用rabin2 -rs DLLNAME.dll列出目标 DLL 的符号symbols。-r让输出采用 radare2 命令格式-s表示输出符号表。其中k开头的行形如k symbol/imp.DLLNAME.序号/...恰好就是 sdb 的键值存储结构grep -i DLLNAME只保留与当前 DLL 相关的符号条目避免混入导入的其他模块grep -v Ordi剔除行内包含 Ordi 字样的条目这类条目携带的是序号之外的信息不需要写入映射表grep ^k仅保留以k开头的键定义行也就是真正的序号函数名键值对cut -d / -f 4-以/为分隔符截取第 4 列之后的内容把symbol/imp.kernel32.25/...之类的前缀剥掉只留下序号函数名本体 DLLNAME.sdb.txt把清洗后的结果重定向为文本文件。生成后的文件内容形如 libr/bin/d/dll/kernel32.sdb.txt1BaseThreadInitThunk 2InterlockedPushListSList 3AcquireSRWLockExclusive 4AcquireSRWLockShared 5ActivateActCtx 6AddAtomA 7AddAtomW每一行都是序号函数名。radare2 运行时会将这个文本解析为 sdb 键值库把 PE 导出表里的ordinal与这里映射出的名字对应起来。libr/bin/d/dll/ws2_32.sdb.txt 同样是这种格式可见整个dll/目录的规范高度一致。解决步骤二把生成的文件放到正确位置把上一步得到的DLLNAME.sdb.txt放入仓库的libr/bin/d/dll/目录。该目录存放了 150 个 Windows 系统 DLL 的序号映射文件包括kernel32、ws2_32、oleaut32、shell32、user32等常用模块也包含大量 16 位时代的avicap、ole2、winsock等旧库覆盖面与 libr/bin/d/Makefile 中DLLS变量声明的清单一致。值得一提的是dll/目录里还附带了一个辅助脚本 convert_dumpbin_exports_to_sdb_txt.py提供另一条可行的生成路径如果本机装有 MSVC可先用dumpbin /exports your_file.dll your_file_dumpbin.txt导出导出表再运行脚本转换python convert_dumpbin_exports_to_sdb_txt.py your_file_dumpbin.txt your_file.sdb.txt脚本会把dumpbin输出中每一行的序号 函数签名拆解为序号函数名并自动剥离const修饰符等签名细节所以 C 重载函数会被折叠为同名条目。rabin2与dumpbin两条路线殊途同归都产出同一套序号函数名格式。解决步骤三把新 DLL 注册进构建系统仅有文件还不够radare2 的构建系统需要知道要编译、安装哪些 DLL 映射表。编辑 libr/bin/d/Makefile把新 DLL 的小写名称追加到DLLS变量中DLLSws2_32 oleaut32 wsock32 msi csmfpapi msvbvm60 kernel32 DLLSaclui activeds atl borlndmm browseui comctl32 dsound DLLSmfc42 mfc42u mstlsapi msvbvm50 odbc32 olecli32 oledlg DLLSolepro32 olesvr32 shdocvw shell32 shlwapi uxtheme DLLSvb40032 vssapi winmm cabinet gsprop32 spr32d70 mfc90u DLLSwldap32 iertutil urlmon wsnmp32 mfc30 mfc40 mfc71 mfc71u DLLSmfc120 csmtpapi csncdapi mfc140u mfc100u DLLS...DLL_SDB变量会把每个名字展开成dll/名字.sdbDLL_SDB$(addsuffix .sdb,$(addprefix dll/,$(DLLS)))install目标随后把dll/*.sdb拷贝到安装数据目录install: $(F_SDB) ... mkdir -p $P/dll cp -f dll/*.sdb $P/dll注意当前仓库libr/bin/d/dll/下存放的源文件扩展名是.sdb.txt而构建期会借助 sdb 工具链$(SDB) -r把.sdb.txt编译为二进制.sdb库参见 libr/bin/d/Makefile 中all目标的两行$(SDB) -r调用因此添加条目时保持命名与现有DLLS条目一致即可。解决步骤四提交 Pull Request按惯例创建 Pull Request 合并到主分支。提交内容应当包含三部分新增的libr/bin/d/dll/DLLNAME.sdb.txt序号映射文件、libr/bin/d/Makefile 中DLLS的新增条目以及如有需要配套测试。radare2 社区的协作规范可参考仓库根目录的 CONTRIBUTING.md贡献前建议先阅读。从源码看 .sdb 序号表如何被消费序号函数名的映射最终服务于 radare2 的符号解析链路。从源码结构看bin 层通过RBinImport/RBinSymbol结构携带ordinal字段见 libr/bin/bfile.c 中对string-ordinal的序列化与输出PE 格式解析器也会为导出符号维护 1 起始的序号见 libr/bin/format/elf/elf.c 中psym-ordinal i及ordinals are 1-based的注释PE 侧逻辑与此同理。当某个导入条目只有 ordinal 时radare2 便回头查询format/dll/DLL.sdb这张映射表补全名称——这也正是报错信息中路径存在的意义。小结与自查清单遇到Cannot find R2PATH/format/dll/DLLNAME.sdb时完整修复流程为运行rabin2 -rs DLLNAME.dll | grep -i DLLNAME | grep -v Ordi | grep ^k | cut -d / -f 4- DLLNAME.sdb.txt生成序号映射文本将DLLNAME.sdb.txt放入 libr/bin/d/dll/ 目录格式为每行序号函数名在 libr/bin/d/Makefile 的DLLS变量中登记新 DLL 名使构建系统将其编译为.sdb并安装到format/dll/数据目录提交 Pull Request让全社区受益。此外也可以借助 convert_dumpbin_exports_to_sdb_txt.py 从 MSVCdumpbin输出生成同样格式的映射文件。如果你只是本地临时使用、并不打算向仓库提交完成第 1 步后直接把生成的.sdb文件放进自己的R2PATH/format/dll/目录即可消除报错并恢复序号符号解析。【免费下载链接】radare2UNIX-like reverse engineering framework and command-line toolset项目地址: https://gitcode.com/gh_mirrors/ra/radare2创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表