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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/256098.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ACM32如何保护算法、协议不被破解或者修改

ACM32具有以下几种功能,可以保护算法、协议不被破解或者修改。 1.存储保护  RDP读保护  WRP写保护  PCROP 专有代码读保护  MPU存储区域权限控制  Secure User Memory存储区域加密 2.密码学算法引擎  AES  HASH  随机数生成  …

Hugging Face实战-系列教程19:文本摘要建模实战1 之 数据清洗(中文商城评价数据处理方法)

🚩🚩🚩Hugging Face 实战系列 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Jupyter Notebook中进行 本篇文章配套的代码资源已经上传 文本摘要建模实战1 之 数据清洗 文本摘要建模实战2 之 Tokenizer处理 1 任务概述 1.1 任…

MATLAB求解微积分(代码+详细解读)

大多数实际工程问题常常简化为微分方程,其求解显地至关重要。 符号微积分 极限 % matlab提供的求极限函数limit(),其调用格式为 % y limit(fun,x,x0) % fun为要求解的函数,x为函数自变量,x0为函数自变量的取值,x趋近于x0 clc;…

用户权益保护:TikTok如何守护数字隐私

随着社交媒体的普及,数字隐私问题逐渐成为用户关注的焦点。在这一背景下,TikTok作为一款备受欢迎的短视频应用,怎样保护用户的数字隐私,成为一个备受关注的话题。本文将深入探讨TikTok在用户权益保护方面的举措,以及它…

13代现场实拍图

1. 2.1寸电子墨水屏显示; 2. 无线通信868M,跳频通信; 3. 自带1个按键及三色高亮LED指示灯指示; 4. 超低功耗; 5. 标签ID码正面显示; 6. 通信速率200K/50K; 7. 覆盖通信半径30米以上&#…

C语言求最大公约数(详解版)

1、问题描述 求任意两个正整数的最大公约数(GCD)。 2、问题分析 如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数。几个自然数公有的约数,叫做这几个自然数的公约数。公约数中最大的一个公约数&#x…

DTO/DO/VO分层与拷贝

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 这一篇其实没太多实质内…

我的创作纪念日【512】

机缘 学知识 收获 沉下心来安静学习的能力 日常 创作学习 成就 只要在学习,没有混时间就有成就感 憧憬 早日成为一个健康、漂亮、自律的富婆。

Android Studio(3.6.2版本)安装 java2smali 插件,java2smali 插件的使用方法简述

一、Android Studio(3.6.2版本)安装 java2smali 插件 1、左上角File—>Setting,如下图 2、Setting界面中:点击Plugins—>选择右侧上方Marketplace—>搜索栏输入java2smali,如下图 3、点击Install按钮—>点…

c语言:指针作为参数传递

探究实参与形参它们相互独立 由于主调函数的变量a,b与被调函数的形参x,y它们相互独立。函数 swap 可以修改变量x,y,但是却无法影响到主调函数中的a,b。 现在利用取地址运算符,分别打印它们的首地址&#x…

枚举enum(学习推荐版,通俗易懂)

定义及特点 第一行的列举名称(都是常量),代表每个枚举的对象(因为枚举不能创建对象,只能依靠罗列名称确定可使用枚举对象个数),这些名称代表的对象可以使用所在枚举类的所有成员变量、成员方法、…

网络编程day3作业

多进程实现TCP并发服务器 #include<myhead.h>#define PORT 8888 #define IP "192.168.125.130"void hadder(int signo) {if(signo SIGCHLD){while(waitpid(-1,NULL,WNOHANG) > 0);} }int information_exchange(int newfd,struct sockaddr_in cin) {char b…

查验身份证c语言

以下是一个简单的C语言程序&#xff0c;用于验证身份证号码的校验码&#xff1a; #include <stdio.h>#include <string.h>int main() { char id[19]; int i, weight[17] {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; int sum 0; char c…

企业微信自动登录自定义系统

方法一&#xff1a;企业微信构造OAuth2链接跳转登录到自定义系统 企业微信自定义应用配置 构造网页授权链接 如果企业需要在打开的网页里面携带用户的身份信息&#xff0c;第一步需要构造如下的链接来获取code参数&#xff1a; https://open.weixin.qq.com/connect/oauth2/…

Elasticsearch 向量相似搜索

Elasticsearch 向量相似搜索的原理涉及使用密集向量(dense vector)来表示文档,并通过余弦相似性度量来计算文档之间的相似性。以下是 Elasticsearch 向量相似搜索的基本原理: 向量表示文档: 文档的文本内容经过嵌入模型(如BERT、Word2Vec等)处理,得到一个密集向量(den…

在openSUSE-Leap-15.5-DVD-x86_64中使用deepin-wine-6.0.0.62再使用微信3.9.5

在openSUSE-Leap-15.5-DVD-x86_64中使用deepin-wine-6.0.0.62再使用微信3.9.5 参考文章&#xff1a; 《记录-下fedora 33安装deepin qq和微信 &#xff0c;不需要安装deepinwine》 https://tieba.baidu.com/p/7279470269 《opensuse使用virtualbox安装win10》 https://blog.c…

简便实用:在 ASP.NET Core 中实现 PDF 的加载与显示

前言 在Web应用开发中&#xff0c;经常需要实现PDF文件的加载和显示功能。本文小编将为您介绍如何在ASP.NET Core中实现这一功能&#xff0c;以便用户可以在Web应用中查看和浏览PDF文件。 实现步骤 1&#xff09;在服务器端创建PDF 打开 Visual Studio 并创建新的 ASP. NET…

PDF转为图片

PDF转为图片 背景pdf展示目标效果 发展过程最终解决方案&#xff1a;python PDF转图片pdf2image注意&#xff1a;poppler 安装 背景 最近接了一项目&#xff0c;主要的需求就是本地的文联单位&#xff0c;需要做一个电子刊物阅览的网站&#xff0c;将民族的刊物发布到网站上供…

Apipost检测接口工具的基本使用方法

&#x1f440; 今天言简意赅的介绍一款和postman一样好用的后端接口测试工具Apipost 专门用于测试后端接口的工具&#xff0c;可以生成接口使用文档官方下载网站&#xff1a;http://www.apipost.cn 傻瓜式安装—>register->项目->创建项目->APIs->新建目录&…

什么是 DDoS ?如何识别DDoS?怎么应对DDOS攻击

什么是DDOS攻击 DDoS攻击&#xff08;Distributed Denial of Service Attack&#xff09;即分布式拒绝服务攻击&#xff0c;是一种利用分布式网络来发起大量的请求&#xff0c;占用目标服务器或网络资源的攻击行为。这种攻击方式可以瘫痪目标系统&#xff0c;导致其无法正常提供…