文档章节

混淆代码后bug定位源码

拉风的道长
 拉风的道长
发布于 2016/05/13 15:44
字数 787
阅读 775
收藏 3
点赞 2
评论 0

一.   代码混淆的意义

代码混淆的一个主要的目的是为了能够保证代码的安全性:我们的代码发布出去以后,有的用户可能会使用某些反编译工具查看我们的代码,为了避免这样的行为,故有代码混淆。

代码混淆以后,原有代码的包名,类名和方法名会被修改。

二.   问题定位

问题的定位是比较复杂的,基本的思路是

1.       准备:错误日志、mapping文件、源代码

2.       使用mapping文件迅速定位到源码位置

三.mapping.txt 在哪里?

设置proguard.config属性:

         在创建Android工程时,proguard.cfg文件会在根目录自动被创建,该文件定义了ProGuard如何优化和混淆代码。其默认的配置只覆盖了一些通用的情况,但也满足了基本的需求;如需深入定制,还需参考相关的配置文档。

         默认情况下,proguard.config属性是未被设置的,如需启用,则在工程根目录下的default.properties文件中设置,其路径可以是相对路径或是绝对路径。

书写形式如可以是这样的:

proguard.config=proguard.cfg  

也可以将proguard.cfg文件放到别处,然后指定路径:

proguard.config=/path/to/proguard.cfg  

混淆打包:

在release模式下,有如下几种导出方式:

1、右击工程->android tools->export signed android package生成签名的包,

2、右击工程——>Export选择导出类型

3、ant release

混淆成功后,除生成了指定类型的混淆包外,还会在工程的根目录下或是根目录下得bin文件夹中生成proguard文件夹,里面包含dump.txt、mapping.txt、seeds.txt和usage.txt四个文件。

Android  studio是在\app\build\outputs\mapping\release 这个目录下

dump.txt  : 描述.apk文件中所有类文件间的内部结构

mapping.txt :列出了原始的类,方法和字段名与混淆后代码间的映射。这个文件很重要,当你从release版本中收到一个bug报告时,可以用它来翻译被混淆的代码。

seeds.txt :列出了未被混淆的类和成员

usage.txt : 列出了从.apk中删除的代码

四. 实例操作

混淆之后的代码报错:

Caused by: java.lang.NullPointerException
at net.simplyadvanced.ltediscovery.be.u(Unknown Source)
at net.simplyadvanced.ltediscovery.at.v(Unknown Source)
at net.simplyadvanced.ltediscovery.at.d(Unknown Source)
at net.simplyadvanced.ltediscovery.av.onReceive(Unknown Source)

使用mapping之后的报错:

Caused by: java.lang.NullPointerException
at net.simplyadvanced.ltediscovery.UtilTelephony.boolean is800MhzNetwork()(Unknown Source)
at net.simplyadvanced.ltediscovery.ServiceDetectLte.void checkAndAlertUserIf800MhzConnected()(Unknown Source)
at net.simplyadvanced.ltediscovery.ServiceDetectLte.void startLocalBroadcastReceiver()(Unknown Source)
at net.simplyadvanced.ltediscovery.ServiceDetectLte$2.void onReceive(android.content.Context,android.content.Intent)(Unknown Source)

五. 如何做到的?

你可以在GUI或者命令行中进行操作。

在GUI下操作
1) 打开<
Android-sdk>/tools/proguard/bin/proguardgui.bat
2) 选择左边的 “ReTrace”操作.
3) 添加你的mapping文件和错误.
4) 点击“ReTrace!”

在命令行下操作
1) 将mapping.txt 和错误日志(txt保存一下)拷贝到你的这个目录下:

<android_sdk_root>/tools/proguard/bin.
2) 在windows下,进入到对应目录,运行命令(确保你的错误文件名字是对的):

retrace.bat -verbose mapping.txt stacktrace.txt > out.txt

3) out.txt 就是解混淆之后的错误日志了.

现在加上源码,就比较容易定位问题了。

© 著作权归作者所有

共有 人打赏支持
拉风的道长
粉丝 53
博文 105
码字总数 52862
作品 0
昌平
程序员
ProGuard 又搞了个大新闻

一般情况下,Android项目经常开启ProGuard功能来混淆代码,一方面可以降低应用被反编译后代码的友善度,增加被逆向的难度,另一方面开可以通过精简Java API的名字来减少代码的总量,从而精简...

Kaede
2017/03/20
0
0
Stunnix CXX-Obfus 3.10 发布,C++ 混淆器

Stunnix CXX-Obfus 3.10 改进对 C++11 的支持,修复了 C++ 解析器的 bug,在项目管理 GUI 的可用性增强等等。 Stunnix CXX-Obfus 是 C 和 C++ 源码的混淆器,可变成非常难于读懂、重用以及编...

oschina
2013/09/19
1K
4
在 ReactNative 的 App 中,集成 Bugly 你会遇到的一些坑

一、前言 最近开新项目,准备尝试一下 ReactNative,所以前期做了一些调研工作,ReactNative 的优点非常的明显,可以做到跨平台,除了少部分 UI 效果可能需要对不同的平台进行单独适配,其中...

承香墨影
2017/11/13
0
0
震惊,西方的程序员跑得居然这么快

昨天刚刚发表了一篇文章(ProGuard又搞了个大新闻),主要吐槽的是项目里面使用ProGuard工具导致的一个诡异的坑。其中根本的原因就是,ProGuard混淆Java注解类的时候,把两个方法混淆成同样的...

Kaede
2017/03/21
0
0
WLDragon/MixSWF

#MixSWF swf混淆工具,用于混淆FD/FB工程打包的swf文件,可智能提取项目中的包名、类名和类成员名等,并可以减少swf文件体积。bin目录下的MixSWF.swf已经进行了混淆处理,可以使用JPEXS Fre...

WLDragon
2016/01/25
0
0
使用proguard混淆android代码

当前是有些工具比如apktool,dextojar等是可以对我们android安装包进行反编译,获得源码的。为了减少被别人破解,导致源码泄露,程序被别人盗取代码,等等。我们需要对代码进行混淆,android...

码农明明
2014/05/31
0
4
插件框架项目--ZeusPlugin

本项目为插件框架项目,为插件框架代码,为测试插件与补丁的项目demo,为插件demo, 为补丁。绝大部分核心代码都在中。也是入口类,核心方法是初始化、加载插件、加载插件与补丁的资源、加载补...

匿名
2016/08/05
539
0
Android开发混淆使用手册

一、Android混淆最佳实践 混淆配置。 自定义混淆规则。 检查混淆结果。 解出混淆栈。 二、混淆简介 代码压缩。 资源压缩。 三、自定义混淆规则 常见混淆命令。 保持元素不参与混淆的规则。 ...

未来程序员
2017/04/20
0
0
.NET源码混淆工具对比及下载

.NET开发人员都知道,.NET的优点是比较多的,如:标准集成,简化应用,对移动设备的支持等,它是一个巨大的跨时代进步。但.NET程序有个致命的缺点:易被反编译。试想一个团队花了几个月甚至几...

nautygirl
2013/04/17
0
0
Android开发容易忽略的错误(持续更新中)

ClickSpan导致长按崩溃 2. webView踩过的坑 3. webView JS方法 正式版本不能使用,混淆问题 ClickSpan导致的长按崩溃(关于TextView中使用ClickSpan后, 长按该TextView会导致崩溃) 代码如下...

Remix_jx
2016/10/28
36
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

SpringBoot | 第七章:过滤器、监听器、拦截器

前言 在实际开发过程中,经常会碰见一些比如系统启动初始化信息、统计在线人数、在线用户数、过滤敏高词汇、访问权限控制(URL级别)等业务需求。这些对于业务来说一般上是无关的,业务方是无需...

oKong
15分钟前
2
0
存储结构分四类:顺序存储、链接存储、索引存储 和 散列存储

存储结构分四类:顺序存储、链接存储、索引存储 和 散列存储 存储结构分四类:顺序存储、链接存储、索引存储 和 散列存储。 顺序结构和链接结构适用在内存结构中。 顺序表每个单元都是按物理...

DannyCoder
26分钟前
0
0
Firefox 61已经为Ubuntu 提供支持

最新和最好的Mozilla Firefox 61 “Quantum”网络浏览器已经为Ubuntu Linux操作系统的用户提供了支持,现在可以通过官方软件库进行更新。 Mozilla于2018年6月26日发布了Firefox 61版本,该版...

六库科技
52分钟前
0
0
Win10升级后执行系统封装(Sysprep)报错

开始封装 一年多以前开始给公司封装Win10系统,便于统一给公司电脑初始化携带各种软件的系统,致力于装完既可以开发的状态。那时候最新的版本是Win10 1703版本,自然就以他为母盘,然后结合V...

lyunweb
今天
39
0
php 性能优化

#什么情况下会遇到性能问题 PHP 语法使用的不恰当

to_be_better
今天
0
0
Jenkins 构建触发器操作详解

前言 跑自动化用例每次用手工点击jenkins出发自动化用例太麻烦了,我们希望能每天固定时间跑,这样就不用管了,坐等收测试报告结果就行。 一、定时构建语法 * * * * * (五颗星,中间用空格隔...

覃光林
今天
0
0
IDEA配置技巧

超详细设置Idea类注释模板和方法注释模板 idea去掉注解param下划线 JetBrains全系列破解

AK灬
今天
0
0
rsync通过服务同步/Linux系统日志/screen工具

rsync通过服务同步 分为服务端(机器A) 和客户端(机器B) 机器A操作编辑/etc/rsyncd.conf配置文件 [root@yolks1 ~]# vim /etc/rsyncd.conf 文件中添加以下配置 port=873 ...

Hi_Yolks
今天
0
0
分发系统介绍expect脚本远程登录expect脚本远程执行命令 expect脚本传递参数

分发系统介绍 分发系统-expect讲解(也就是一个分发的脚本) 场景: 业务越来越大,网站app,后端,编程语言是php,所以就需要配置lamp或者lnmp,最好还需要吧代码上传到服务器上;但是因为业...

lyy549745
今天
0
0
android studio 中设置创建类时的说明信息(包含 作者 ,创建时间,注释说明等)

今天简单来说一下android studio开发工具中的 一个小设置功能; 在开发过程中我们习惯给新建的类添加一些注释信息,创建日期、时间和作者等。 设置信息 File—>Settings—>Editor—>File and...

切切歆语
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部