首页 > 其他 > 详细

IDA正确加载libc.so等动态库的调试信息

时间:2020-04-19 10:07:56      阅读:343      评论:0      收藏:0      [点我收藏+]

一、问题分析

在动态调试程序的时候,用gdb调试到libc的时候能正确加载符号信息,但同样的程序用IDA调试到libc的时候却缺失了libc中的许多符号,而且对应生成的伪代码可读性极差

这其实是IDA没有正确加载DWARF调试信息所导致的

解决方法是用objcopy把.gnu_debuglink段的内容从技术分享图片libc-2.23.so改成其他名字,比如技术分享图片libc-2.23.so.debug,再把.debug文件夹下DWARF调试信息的名字也从技术分享图片libc-2.23.so改成技术分享图片libc-2.23.so.debug,这样每次调到libc的时候IDA就能正确加载调试信息了

如图,虽然用的是带调试信息的libc,但是Load debug symbols的时候Output window会输出如下错误信息,这是因为加载了错误的技术分享图片libc-2.23.so

技术分享图片

 

二、解决方案

首先下载libc及其调试信息:https://github.com/matrix1001/glibc-all-in-one

切换工作目录到glibc-all-in-one/libs/2.23-0ubuntu10_amd64

然后执行以下命令,对libc进行修改

objcopy -R .gnu_debuglink ./libc-2.23.so
objcopy --add-gnu-debuglink=libc-2.23.so.debug ./libc-2.23.so
mv .debug/libc-2.23.so .debug/libc-2.23.so.debug

 再执行以下命令修改要调试的文件,使其加载修改后的libc

patchelf --set-interpreter 你的目录/glibc-all-in-one/libs/2.23-0ubuntu10_amd64/ld-2.23.so 你的程序
patchelf --replace-needed libc.so.6 你的目录/glibc-all-in-one/libs/2.23-0ubuntu10_amd64/libc-2.23.so 你的程序

 最后再用IDA来Start或者Attach你的程序

 点击右侧的Modules->libc-2.23.so->Load debug symbols

技术分享图片

 等待左下角显示AU:idle加载完成,此时仍有Name信息加载不全的问题

 再点击Modules->libc-2.23.so->Analyze module

 然后耐心等待调试信息加载完成

技术分享图片

 

三、运行结果

最后的效果如下,_IO_FILE_plus_1等结构体都能被很好地识别,在右侧注释中有对应的成员信息,而且伪代码也能正常生成了

技术分享图片

 

四、注意事项

apt里的patchelf是0.9版本的,有Bug

要自己到Github上编译0.10版本的才能正常使用

 

五、参考文献

https://blog.csdn.net/chinainvent/article/details/24129311?reload

IDA正确加载libc.so等动态库的调试信息

原文:https://www.cnblogs.com/algonote/p/12729657.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!