反编译之崩溃定位

1.背景

线上出了个崩溃(量挺大😭),但是apk是被混淆过的,一时摸不着头脑。崩溃信息如下:
崩溃信息
主要就是一个再常见不过的空指针的崩溃,
—java.lang.NullPointerException: Attempt to invoke virtual method ‘int java.lang.String.length()’ on a null object reference

若要定位代码所在位置,主要就是看com.jd.lib.mylive.e.d.s.onBindViewHolder(SourceFile:169)这一行,这就是我们崩溃的最终地方,但是路径被混淆了,而且代码行位置也看不出任何信息。这就让我们很头大了,如何才能找到最终的代码报错位置呢?

问题定位

这里我们分两步定位,第一步是找到崩溃的类和方法,第二是找到崩溃的代码行数。

1.首先我们需要找崩溃所在的类和方法

1.1普通混淆类

既然路径是被混淆的,首先我们需要根据混淆的mapping文件来还原出崩溃路径。
mapping文件一般的位置在

/app/build/outputs/mapping/release/mapping.txt

根据mapping文件我们很容找到路径对应的类为NewLiveCartSkuViewHolder:
根据混淆文件找到对应类
然后根据崩溃信息我们就能找到类中对应的方法onBindViewHolder

1.2匿名内部类混淆

有时候,我们找到的类,前面对应的混淆前引用是这样的
在这里插入图片描述
这说明前面是一个匿名内部类,它存在于LiveSkunVIew当中,并且是第15个,因为匿名内部类一般没有名字,所以在编译成class文件的时候为了能给它一个索引,一般会用“外部的类$数字编号”来表示匿名内部类。那我们如何找到这个匿名内部类的声明在哪一行呢?我们可以往下找,我们可以找到下面有一个匿名内部类的初始化方法,void<init>(com.jd.lib.mylive.view.widget.LiveSkinView):1754:1754 -><init> ,这方法表示类加器加载了这个匿名内部,并且在1754行加载的。这样的话,我们就可以定位到这个匿名内部类了。

接下来我们需要分析一下崩溃的行数在哪一行。

2.寻找崩溃的代码行数

寻找崩溃的代码行数就没那么容易,也就是本文的重点-反编译。
因为报错信息(SourceFile:169)给到的行数并不是真实代码所在的行数,而是编译混淆后class文件里面崩溃的行数。因此,若要定位到行数,我们必须先将apk进行反编译,然后将反编译后的dex转成jar,最后分析jar文件来定位崩溃的具体位置。

2.1借用反编译工具jadx查看反编译后的内容

这里我们推荐一个很好用的反编译开源工具jadx,路径如下

https://github.com/skylot/jadx

用这个工具我们只需要将apk,倒入即可看到反编译后的结果,不过有的方法和类可能反编译不出来
jadx展示
下面是反编译后的结果
反编译后的结果
首先我们根据混淆的路径来找到我们想要定位的类和方法的大致位置,然后我们借助右下角的code或者simple那一栏来进行问题的定位,如果code里面的方法没被反编译出来,我们可以尝试在simple那一栏里面找,我这里就遇到了clode栏没被反编译出来的情况,因此我从simple栏找到了对应的方法,如下图
找到崩溃的方法
最后我们只需要找到169行,即可找到崩溃具体的位置,这里我们需要注意一下左边的行数,一定要点击左侧tab并确定行数切换到了从方法开始计算行数的模式,因为崩溃信息中(SourceFile:169)169所指的行数表示的是从崩溃所在的方法开始计数的行数,且必须是源文件中的行数。由于jadx显示的是反编译过后的文件代码(目的是方便我们阅读),且它已经帮我们标记好了反编译前的行号,因此我们只需要在onBindViewHolder中找到反编译前的行号就能找到崩溃的位置。
找到编译代码的行号
如上图,我们找到了行号在169的位置,发现该行做了判断一个字段的长度,如果price为空,那么就会发生nullPointException,正好对应了上面的崩溃信息String.length()的空指针崩溃。
最后们回归到源代码中找到了此行,
源码验证代码
问题得到验证。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
### 回答1: VC反编译软件,也称为Visual C++反编译软件,是一种可以将已经编译成机器代码的程序重新转换回可读的源代码的工具。VC反编译软件主要用于逆向工程、代码审查、软件安全分析等领域。 VC反编译软件能够将机器代码进行逆向转换,还原出编写该程序时所使用的高级语言源代码。通过使用VC反编译软件,我们可以更加容易地理解程序的逻辑结构和运行过程,对程序进行修改和优化。 VC反编译软件一般支持多种编程语言,主要包括C++、C#等。通过将编译生成的可执行文件或动态链接库加载到VC反编译软件中,软件会尝试还原原始的源代码,包括变量名、函数名、类名等。 但是需要注意的是,VC反编译软件并不是完美的,它无法还原出源代码中的注释、宏定义等细节。此外,当程序使用了加密、压缩、混淆等保护措施时,VC反编译软件的效果会大打折扣。 由于VC反编译软件的存在,一些开发者可能担心自己的代码会被不法分子通过反编译获取。因此,在进行软件开发时,我们应该注意代码的安全性,采取一些措施来防止代码反编译,例如使用代码混淆技术、加密关键部分等。 总而言之,VC反编译软件是一种能够将机器代码还原为可读源代码的工具,它在逆向工程、代码审查、软件安全分析等领域发挥着重要的作用。然而,如何保护好自己的代码,避免被反编译,也是我们需要思考和解决的问题。 ### 回答2: VC反编译软件是一种能够将已经编译后的VC程序反向解析为可读的源代码的工具。VC指的是Visual C++,它是一种用于开发Windows操作系统上的应用程序的集成开发环境。反编译软件可以通过分析程序的二进制文件,还原出程序的源代码结构和逻辑。 反编译软件的作用主要有两方面。首先,对于一些没有提供源代码的软件,我们可以使用反编译软件将其反编译,从而了解软件的实现原理和逻辑。这对于研究学习和逆向工程都非常有用。其次,对于一些已经编译的程序,在需要修改或者调试的时候,我们可以使用反编译软件将其反编译为源代码,方便我们进行修改和调试。 然而,需要注意的是,反编译软件并不是万能的,它所还原出的源代码并不一定完全和原始的源代码相同。反编译只是通过解析二进制文件还原出源代码的一种技术手段,并且在这个过程中可能会存在误差。因此,反编译出的源代码可能会比原始的源代码缺失一些细节和结构。 另外,需要强调的是,反编译软件的使用需要严格遵守法律法规,不得用于侵犯他人的知识产权和商业利益。在使用反编译软件时,应该遵循合法合规的原则,尊重程序作者的权益,并仅限于学习、研究和技术交流等合法目的。 总之,VC反编译软件是一种能够将已经编译后的VC程序反向解析为可读的源代码的工具。它在研究学习和逆向工程中有一定的作用,在使用时需要遵守法律法规并保持合法合规的原则。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值