当前位置: 首页 > news >正文

Relocations for this machine are not implemented,IDA版本过低导致生成汇编代码失败

目录

1、问题描述

2、安卓app发生崩溃,需要查看汇编代码上下文去辅助分析

3、使用IDA打开.so动态库文件,提示Relocations for this machine are not implemented

4、IDA版本较老,不支持ARM64的指令集,使用7.0版本就可以了

5、找到崩溃的那条汇编指令在目标函数中的位置

6、通过阅读汇编代码上下文,找到崩溃的那条汇编指令对应的C++源代码位置


C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/125529931C/C++基础与进阶(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_11931267.htmlVC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/124272585C++软件分析工具从入门到精通案例集锦(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/131405795开源组件及数据库技术(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_12458859.html网络编程与网络问题分享(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_2276111.html       最近在使用IDA打开一个64位ARM平台编译的.so动态库时,IDA先是提示:Relocations for this machine are not implemented,然后打开后并没有生成汇编代码。经多次尝试和研究得知,是IDA版本太低了,老版本IDA对ARM64指令集支持的有问题或者不支持ARM64指令集,使用7.0及以上的版本就可以了本文详细讲述一下问题的现象以及尝试解决的过程。

1、问题描述

       最近在排查一个安卓app崩溃问题时,需要查看app底层使用C++实现的.so动态库的汇编代码上下文去辅助分析。但是在使用64位版本的IDA打开.so动态库时,先是提示:Relocations for this machine are not implemented

然后打开后并没有生成汇编代码。

2、安卓app发生崩溃,需要查看汇编代码上下文去辅助分析

       安卓app在测试过程中发生了崩溃,并自动生成了包含异常信息的Tombstone文件。打开Tombstone文件,查看到了崩溃时的函数调用堆栈,如下所示:

从上述堆栈可以看出,崩溃发生在libxxservice_hddll.so 动态库(该模块是底层业务库,是用C++语言实现的动态库)中,具体是崩溃在函数CXXXServiceHMpHandler::OnTextImageCreateBannerInfoRsp中,并看到相对于该函数的偏移值1048(这个是十进制整型值)。仅仅看到崩溃在该函数中,但函数中的代码比较多,从现有信息中无法确定具体是崩溃在哪一行代码上。

       既然有函数名及相对于函数的偏移值,我们可以使用IDA工具打开libxxservice_hddll.so动态库文件定位到CXXXServiceHMpHandler::OnTextImageCreateBannerInfoRsp(mtmsg::CMtMsg*, unsigned int, unsigned int)+1048这个代码段地址对应那一句汇编代码,然后将汇编代码的上下文与C++源码对应起来看,看看崩溃的汇编代码到底对应哪一行C++源码,可能很快就能确定引发问题的原因了。


       在这里,给大家重点推荐一下我的几个热门畅销专栏:

专栏1:(该专栏订阅量接近350个,有很强的实战参考价值,广受好评!专栏文章持续更新中,预计更新到200篇以上!)

C++软件调试与异常排查从入门到精通系列文章汇总icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/125529931

本专栏根据近几年C++软件异常排查的项目实践,系统地总结了引发C++软件异常的常见原因以及排查C++软件异常的常用思路与方法,详细讲述了C++软件的调试方法与手段,以图文并茂的方式给出具体的实战问题分析实例,带领大家逐步掌握C++软件调试与异常排查的相关技术,适合基础进阶和想做技术提升的相关C++开发人员!

专栏中的文章均是通过项目实战总结出来的(通过项目实战积累了大量的异常排查素材和案例),有很强的实战参考价值!专栏文章还在持续更新中,预计文章篇数能更新到200篇以上!

专栏2: 

C/C++基础与进阶(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_11931267.html

以多年的开发实战为基础,总结并讲解一些的C/C++基础与进阶内容,以图文并茂的方式对相关知识点进行详细地展开与阐述!专栏涉及了C/C++领域的多个方面的内容,同时给出C/C++及网络方面的常见笔试面试题,并详细讲述Visual Studio常用调试手段与技巧!

专栏3: 

开源组件及数据库技术icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_12458859.html

以多年的开发实战为基础,分享一些开源组件及数据库技术! 


3、使用IDA打开.so动态库文件,提示Relocations for this machine are not implemented

       当前崩溃发生在libxxservice_hddll.so动态库中,所以我们要用IDA打开该二进制文件,查看相关的汇编代码上下文。libxxservice_hddll.so库是64位的,所以要使用64位版本的IDA打开。我当前使用的IDA版本是Version 6.1.110315 (64-bit),将libxxservice_hddll.so文件拖入到IDA中,会弹出选择文件格式的提示框(一般选择默认的就可以了,IDA会自动识别):

其实这个时候就有疑问了,自动生成的文件类型串为:ELF64 for Unknown CPU [183] (Shared object) [elfldw]即IDA无法识别出编译文件的CPU平台类型,这点就有些奇怪,之前也没遇到过。

       然后打开的过程中又弹出如下的提示框:

大致的意思是,对机器的重新定位没有被执行。然后没管这个提示,继续打开libxxservice_hddll.so文件,打开成功后,点击IDA菜单栏中的Jump -> Jump to function...,在弹出的函数列表窗口中,点击窗口下方的Search按钮,输入tombstone中展示的函数调用堆栈中的函数CXXXServiceHMpHandler::OnTextImageCreateBannerInfoRsp(上面已经讲了,崩溃就发生在这个函数中,要查看这个函数的汇编代码),搜到了函数:

双击这个条目,IDA就会跳转到函数的汇编代码处,结果看到如下的信息:

并没有看到有效的汇编代码,只是一串数字相关的内容,是二进制机器码?

       现在回过头看,先是弹出Relocations for this machine are not implemented提示,然后没有生成汇编代码,可能是哪里出问题了。

4、IDA版本较老,不支持ARM64的指令集,使用7.0版本就可以了

       首先这个libxxservice_hddll.so文件是没问题的,app程序运行时是可以正常使用的。难道是我的IDA版本太老了?我的IDA版本如下所示:

是2011年的版本,距今已经有十来年了,我们的libxxservice_hddll.so库是在ARM64平台下编译的,是不是老版本的IDA不支持ARM64平台呢?

        于是到网上搜索了一下,下载到了2017年版本的IDA,想看看这个版本能否正常地打开库文件。先是将libxxservice_hddll.so库文件拖入到IDA中,弹出选择文件格式的窗口,如下所示:

从上图得知,IDA识别出了这个二进制文件的平台类型为ARM64,估计既然能识别出来,应该生成汇编代码的。然后待文件打开完成后,搜索CXXXServiceHMpHandler::OnTextImageCreateBannerInfoRsp函数,查看该函数的汇编代码,看到如下的汇编代码:

所以,IDA7.0是支持ARM64平台的二进制文件的,生成的汇编代码也是正常的。

5、找到崩溃的那条汇编指令在目标函数中的位置

        CXXXServiceHMpHandler::OnTextImageCreateBannerInfoRsp函数对应的汇编代码如下所示:

       可以看到该函数的函数地址(函数首地址)为0x0000000000074DE8,根据Tombstone文件中显示的相对函数的偏移:

#00 pc 0000000000075200  /xxxkyui/lib64/libxxservice_hddll.so (CXXXServiceHMpHandler::OnTextImageCreateBannerInfoRsp(mtmsg::CMtMsg*, unsigned int, unsigned int)+1048) (BuildId: d6e3064a3e1a03d9bea3c4496e78cb4942d187d1)

计算新的地址:

0x0000000000074DE8 + 0x418(对应于10进制的1048)=  0x0000000000075200

然后在IDA中搜索该地址0x0000000000075200,找到对应的汇编代码行。具体的做法是,将鼠标点进汇编代码窗口中(使该窗口获得焦点),然后按下快捷键g,弹出Jump to address窗口,输入上面计算出来的地址0x0000000000075200:

点击OK,就会跳转到对应的行,如下所示:

6、通过阅读汇编代码上下文,找到崩溃的那条汇编指令对应的C++源代码位置

        我们平时看惯了X86平台的汇编代码,看这个ARM架构的汇编代码有点不习惯,无论是汇编指令的名称,还是寄存器的名称,都有很大的差异。感觉还是X86平台的汇编代码阅读起来更习惯一些。

       上面我们在汇编代码中定位到了位置,但与汇编代码对应的C++源码是哪一行呢?此外,Release下编译时编译器会对C++代码进行优化(有些变量或函数调用可能会被优化掉),导致汇编代码和C++代码可能是不完全一致的,甚至较难对应起来。

       该怎么将汇编代码与C++源码对应起来呢?难道我们要一句一句汇编代码去啃?强行去阅读汇编代码上下文,是需要有一定的汇编功底的,一般人比较难做到。一般我们借助汇编上下文中的注释信息去辅助阅读,本例中我们就是使用注释信息快读定位的。

一般在阅读汇编代码上下文时,一方面借助汇编代码中的注释,另一方面将汇编代码与C++源码对照着看!

       0x0000000000075200地址对应的汇编代码行,该行代码下面紧接就看到注释,是常量值字符串的注释:

但看不到完整的字符串。这个地方有个技巧,可以将鼠标移动到变量上,就会以TooTip的方式显示变量中的完整内容,如下所示:

这个地方巧了,这样的字符串是打印日志中的,于是到C++源码中找到CXXXServiceHMpHandler::OnTextImageCreateBannerInfoRsp函数,在函数中找“[CXXXServiceHMpHandler::OnTextImageCreateBannerInfoRsp] dispatch”这样的打印,确实有这行打印,如下所示:

所以就找到了0x0000000000075200地址对应的C++源码大概的行了,所以本例中的空指针问题应该就是上图中的ptTip指针,即该指针值为空,结果使用该指针调用value接口产生了崩溃。

       关于IDA工具介绍及详细使用说明,可以参见我之前写的文章:

IDA反汇编工具使用详解icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/120635120使用IDA查看汇编代码上下文去辅助排查C++软件异常问题icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/128942626使用反汇编工具IDA查看发生异常的汇编代码的上下文去辅助分析C++软件异常icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/132158574

相关文章:

Relocations for this machine are not implemented,IDA版本过低导致生成汇编代码失败

目录 1、问题描述 2、安卓app发生崩溃,需要查看汇编代码上下文去辅助分析 3、使用IDA打开.so动态库文件,提示Relocations for this machine are not implemented 4、IDA版本较老,不支持ARM64的指令集,使用7.0版本就可以了 5、…...

[ CTF ]【天格】战队WriteUp-第七届“强网杯”全国安全挑战赛

第七届“强网杯”全国安全挑战赛 2023.12.16~2023.12.17 文章目录 【Misc】Pyjail ! Its myFILTER !!!easyfuzz谍影重重2.0签到Pyjail ! Its myRevenge !!!server_8F6C72124774022B.py 问卷调查 【Reverse】ezre 【Web】happygame 【强网先锋】石头剪刀布TrieSpeedUpezreez_fmt…...

Android13音频录制适配

Android13音频录制适配 前言: 之前写过一篇音频录制的文章,当时是在Android10以下的手机可以成功录制和播放,但是Android10及以上手机提示创建文件失败,最近做过Android13的适配,索性一起把之前的录音也适配了&#…...

【Python】—— 如果使用matplotlib做数据可视化

matplotlib做数据可视化 相关知识掌握matplotlib的基本使用方法1. 折线图2. 散点图3. 柱状图4. 饼图5. 直方图6. 等高线图7. 图形定制 掌握数据处理的基本方法1. 数据筛选2. 缺失值处理3. 异常值处理 理解数据可视化的原则和方法1. 选择合适的图表类型2. 避免数据混淆3. 突出重…...

【MyBatis-Plus】多数据源分页配置(低版本暂时就支持一种(可选),高版本多支持)

【转载】一、Mybatis Plus 3.4 版本之后分页插件的变化 1、地址 Mybatis Plus 3.4版本之后分页插件的变化 2、内容 1、MybatisPlusInterceptor 从 Mybatis Plus 3.4.0 版本开始,不再使用旧版本的 PaginationInterceptor,而是使用 MybatisPlusInterce…...

Linux 特殊符号

目录 1. # 注释 2. ;命令分隔符 3. .. 上级目录 4. . 当前目录 5. " " 换行,解析变量 6. 换行,不解析变量 7. \ 和 / 8. !历史命令调用,取反 9. * 通配符 10. $ 调用变量 11. | 管道 12. || …...

TDengine 签约中船九院,助力航运业智能化转型升级

在大数据时代背景下,船舶智能化已经成为船舶制造与航运领域发展的必然趋势。智能船舶作为《中国制造 2025》中明确重点发展的领域,代表了船舶未来的方向,对于航运业的转型升级至关重要。其中,大数据的处理和运用成为船舶智能化转型…...

upload-labs笔记

简介 upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共21关,每一关都包含着不同上传方式。 文件上传漏洞是指: Web 服务器允许用户将文件上传至其…...

Android Studio好用的插件推荐

目录 一、插件推荐 二、如何下载 1.点击File—>Settings ​2.点击Plugins然后进行搜索下载 三、Android Studio 模板 一、插件推荐 这个插件可以为您自动生成Parcelable代码。Parcelable是一种用于在Android组件之间传递自定义对象的机制,但手动编写Parcela…...

第三十九章 其他特殊主题 - 映射 IRIS ID 以供导出

文章目录 第三十九章 其他特殊主题 - 映射 IRIS ID 以供导出控制导出时的命名空间前缀XMLPREFIX 第三十九章 其他特殊主题 - 映射 IRIS ID 以供导出 当在顶层映射 IRIS 对象(而不是作为另一个对象的属性)时,其内部 ID、OID 和全局唯一 ID 不…...

文件操作(下)

标题的顺序是接着之前写的,希望这篇博客对你有帮助 七. 随机读写函数 实际上,无论是读还是写,在一次调用顺序读写函数,文件指针会移到已经读过或者写过的下一个位置,从那个位置开始下一次读和写(在文件没有…...

面试必问-vue3中ref与这个reactive的区别

ref和reactive是Vue 3中两种不同的响应式数据处理方式。 ref:ref函数可以将普通的Javascript值转换为一个响应式引用。它返回一个包含.value属性的对象,可以通过读取或修改.value来操作引用的值。当引用的值发生变化时,Vue会自动追踪依赖并更…...

网络(九)三层路由、DHCP以及VRRP协议介绍

目录 一、三层路由 1. 定义 2. 交换原理 3. 操作演示 3.1 图示 3.2 LSW1新建vlan10、20、30,分别对应123接口均为access类型,接口4为trunkl类型,允许所有vlan通过 3.3 LSW2新建vlan10、20、30,配置接口1为trunk类型&…...

深度学习 Day19——P8YOLOv5-C3模块实现

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 文章目录 前言1 我的环境2 代码实现与执行结果2.1 前期准备2.1.1 引入库2.1.2 设置GPU(如果设备上支持GPU就使用GPU,否则使用C…...

轻量封装WebGPU渲染系统示例<51>- 视差贴图(Parallax Map)(源码)

视差纹理是一种片段着色阶段增强材质表面凹凸细节的技术。 这里在WebGPU的实时渲染材质管线中实现了视差贴图计算,以便增强相关的纹理细节表现力。 当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/material/src/voxgpu/sample/Para…...

YOLOv8改进 | 2023主干篇 | 华为最新VanillaNet主干替换Backbone实现大幅度长点

一、本文介绍 本文给大家来的改进机制是华为最新VanillaNet网络,其是今年最新推出的主干网络,VanillaNet是一种注重极简主义和效率的神经网络架构。它的设计简单,层数较少,避免了像深度架构和自注意力这样的复杂操作(需要注意的是…...

Leetcode 376 摆动序列

题意理解: 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 摆动序列 如果是摆动序列,前后差值呈正负交替出现 为保证摆动序列尽可能的长,我们可以尽可能的保留峰值,,删除上下坡的中间值&…...

51单片机控制1602LCD显示屏输出自定义字符二

51单片机控制1602LCD显示屏输出自定义字符二 1.概述 1602LCD除了内置的字符外还提供自定义字符功能,当内置的字符中没有我们想要输出的字符时,我们就可以自己创造字符让他显示,下面介绍1602如何创建自定义字符。 2.1602LCD创建字符原理 自…...

HarmonyOS自学-Day2(@Builder装饰器)

目录 文章声明⭐⭐⭐让我们开始今天的学习吧!Builder装饰器:自定义构建函数Builder介绍Builder使用说明自定义组件中创建自定义构建函数全局自定义构建函数 Builder参数传递规则按引用传递参数按值传递参数 文章声明⭐⭐⭐ 该文章为我(有编程…...

bottom-up-attention-vqa-master 成功复现!!!

代码地址 1、create_dictionary.py 建立词典和使用预训练的glove向量 (1)create_dictionary() 遍历每个question文件取出所关注的question部分,qs 遍历qs,对每个问题的文本内容进行分词,并将分词结果添加到字典中&…...

BigDecimal中divide方法详解

BigDecimal中divide方法详解 大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天,让我们一起深入探讨Java中BigDecimal的divide方法,揭开这个…...

视频推拉流EasyDSS互联网直播/点播平台构建户外无人机航拍直播解决方案

一、背景分析 近几年,国内无人机市场随着航拍等业务走进大众,出现爆发式增长。无人机除了在民用方面的应用越来越多,在其他领域也已经开始广泛应用,比如公共安全、应急搜救、农林、环保、交通 、通信、气象、影视航拍等。无人机使…...

行为型设计模式-策略模式(Strategy Pattern)

策略模式 策略模式:百度百科中引述为:指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。 策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通…...

html中RGB和RGBA颜色表示法

文章目录 RGB什么是RGBRGB颜色模式的取值范围RGB常用颜色对照表 RGBA什么是RGBARGBA颜色模式的取值范围 总结 RGB 什么是RGB RGB是一种颜色空间,其中R代表红色(Red)、G代表绿色(Green)、B代表蓝色(Blue&a…...

【BEV感知】BEVFormer 融合多视角相机空间特征和时序特征的端到端框架 ECCV 2022

前言 本文分享BEV感知方案中,具有代表性的方法:BEVFormer。 基本思想:使用可学习的查询Queries表示BEV特征,查找图像中的空间特征和先前BEV地图中的时间特征。 它基于Deformable Attention实现了一种融合多视角相机空间特征和时序特征的端到端框架,适用于多种自动驾驶感…...

git拉取hugging face代码失败:443

报错信息:fatal: unable to access http://huggingface.co/THUDM/chatglm2-6b/: OpenSSL SSL_connect: Connection reset by peer in connection to huggingface.co:443 解决方法:(127.0.0.1:7890配置为自己的实际代理ip及端口) …...

【赠书活动】OpenCV4工业缺陷检测的六种方法

文章目录 前言机器视觉缺陷检测工业上常见缺陷检测方法延伸阅读推荐语 赠书活动 前言 随着工业制造的发展,对产品质量的要求越来越高。工业缺陷检测是确保产品质量的重要环节,而计算机视觉技术的应用能够有效提升工业缺陷检测的效率和精度。 OpenCV是一…...

设计模式之创建型设计模式(一):单例模式 原型模式

单例模式 Singleton 1、什么是单例模式 在软件设计中,单例模式是一种创建型设计模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点。 这意味着无论何时需要该类的实例,都可以获得相同的实例,而不会创建…...

Amazon CodeWhisperer 在 vscode 的应用

文章作者:旧花阴 CodeWhisperer 是一款可以帮助程序员更快、更安全地编写代码的工具,可以在他们的开发环境中实时提供代码建议和推荐。亚马逊云科技发布的这款代码生成工具 CodeWhisperer 最大的优势就是对于个人用户免费。以在 vscode 为例,演示安装过程…...

【Java】基于fabric8io库操作k8s集群实战(pod、deployment、service、volume)

目录 前言一、基于fabric8io操作pod1.1 yaml创建pod1.2 fabric8io创建pod案例 二、基于fabric8io创建Service(含Deployment)2.1 yaml创建Service和Deployment2.2 fabric8io创建service案例 三、基于fabric8io操作Volume3.1 yaml配置挂载存储卷3.2 基于fa…...