专栏首页腾讯Bugly的专栏Android app反调试与代码保护的一些基本方案

Android app反调试与代码保护的一些基本方案

| 导语 本文介绍Android app代码(java + ndk)的反调试的方法和保护代码增加逆向难度的一些基本方法。

Android自问世以来得以迅速发展,各大手机厂商纷纷投入成本开发、设计开发自己的Android系统,从2016年开始,Android已经超越ios成为全球最有影响力的操作系统。针对于Android app的逆向方法和逆向工具很多,所以反调试对于Android的代码保护扮演着很重要的角色。本文从四个方面介绍一下Android反调试的一些方法。

ps:反调试并不能完全阻止逆向行为,只是在长期的攻防战中给破解人员不断的增加逆向难度。

Java:

(1)Proguard

借助Android studio的proguard工具,对Java代码分别进行压缩(Shrink)、优化(Optimize)、混淆(Obfuscate)、检查(Veirfy)。

压缩(Shrink):去掉代码中无用的类、函数方法和字段。

优化(Optimize):对Android的可执行文件dex进行优化,去掉无用指令。

混淆(Obfuscate):用毫无意义的字段对代码的类名、函数名、变量名重命名,比如用a, b, c这种。

检查(Veirfy):对混淆后的代码进行检查。

经过Proguard后,代码程序依然可以重新组织和处理,处理后的程序逻辑与之前完全一致,而混淆后的代码即便反编译后依然很难阅读。同时,在混淆过程中对于一些不影响正常运行的信息将永久丢失,这些信息的丢失使得程序更加难以理解。

同时,Proguard还可以控制对某个类混淆,以及对某个类的某些函数方法混淆。

下图是一张混淆前和混淆后的对比图:

混淆前:

混淆后:

(2)isDebuggerConnected

Android Debug类提供isDebuggerConnected函数,函数原型如下:

在VMDebug类里的isDebuggerConnected的具体实现在ndk程序里。

这里暂且不跟进该函数,总之,isDebuggerConnected函数用于检测此刻是否有调试器挂载到程序上,如果返回值为true则表示此刻被调试中。用法很简单,如下:

(3)android:debuggable属性

在Android的AndroidManifest.xml清单文件的application节点下加入android:debuggable="false"属性,使程序不能被调试。在Java程序代码里也可检测该属性的值,如下:

NDK:

(1)ptrace函数

Linux内核的ptrace函数原型:

ptrace可以允许A进程控制B进程,并且A进程可以检查和修改B进程的内存和寄存器。但是一个进程只能被一个进程调试,所以根据这个特点,可以让进程自己ptrace自己,传入的request设置为PTRACE_TRACEME,程序被自己附加调试后,其他的调试操作就会失败了。

(2)文件节点检测

一旦程序处于被调试状态,Linux会向进程的节点写入数据,比如/proc/<pid>/status内容中的TracePid会写入调试进程的pid,如果TracePid的值不为0,就表明进程处于被调试状态了。

此外,通用的检测逻辑还有检测调试的端口号,Linux的文件节点/proc/net/tcp会记录着正在运行的进程的本地的端口号,调试工具IDA的默认的调试端口是23946,通过读取/proc/net/tcp内容,检测是否有23946,如果找到了就表明进程处于被调试状态了。

(3)Inotify

Linux的Inotify用于检测文件系统变化。它可以检测单个文件,也可以检测整个目录。

逆向最常做的一件事就是dump 内存,使用dd命令(或者如果使用gdb的话为gcore命令),dump掉/proc/<pid>/mem或/proc/<pid>/mpas或/proc/<pid>/pagemap的内容。

这里,就可以使用Inotify API对上述三个文件监控,如果有发现打开、读写操作,极大概率就是进程正在被破解。

(4)so文件hash值检测

so文件在被JNI_Onload加载后,so文件的函数的指令是固定的,若被调试器挂载,下了断点后指令会发生改变(断点地址会被改写为bkpt指令),计算内存中加载的so的hash值,进行校验检测函数是否被修改或被下断点即可判断出是否被调试状态。

(5)时间差检测

一个取巧的方法,正常情况下,一段程序在两条代码之间的时间差是很短的,而对于调试程序来说,单步调试中的程序两条代码之间的时间差会比较大,检测两条代码之间的时间差,可以大概率判断程序是否被调试。

Resource资源文件:

Android资源文件经常被恶意篡改,植入各种广告,插件,严重影响了Android app生态平衡。

APK签名检测

Android SDK中有apk 签名检测的方法,Framework的PackageManager类提供了getPackageInfo()函数,函数原型:

第二个参数传入GET_SIGNATURES时,返回对象的signature字段就是签名信息,计算其hash值,前后对比hash值。实际可用的两种方案:

(1)在本地Java代码里进行校验,不一致则强退应用;

(2)把签名信息发到服务器后台,服务器后台记录着正确的签名信息,比对后不一致则返回一个错误给错误。

上述即为对于Android app的反调试,代码保护的一些基本策略。

如果您觉得我们的内容还不错,就请转发到朋友圈,和小伙伴一起分享吧~

var first_sceen__time = (+new Date());if ("" == 1 && document.getElementById('js_content')) { document.getElementById('js_content').addEventListener("selectstart",function(e){ e.preventDefault(); }); } (function(){ if (navigator.userAgent.indexOf("WindowsWechat") != -1){ var link = document.createElement('link'); var head = document.getElementsByTagName('head')[0]; link.rel = 'stylesheet'; link.type = 'text/css'; link.href = "//res.wx.qq.com/mmbizwap/zh_CN/htmledition/style/page/appmsg_new/winwx45ba31.css"; head.appendChild(link); } })();

jackycao

赞赏

长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

阅读

分享 在看

已同步到看一看

取消 发送

我知道了

朋友会在“发现-看一看”看到你“在看”的内容

确定

已同步到看一看写下你的想法

最多200字,当前共字 发送

已发送

朋友将在看一看看到

确定

写下你的想法...

取消

发布到看一看

确定

最多200字,当前共字

发送中

微信扫一扫 关注该公众号

微信扫一扫 使用小程序

即将打开""小程序

取消 打开

本文分享自微信公众号 - 腾讯Bugly(weixinBugly),作者:jackycao

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-03-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 福利:免费送50 份价值 129 元的《Android 面试指南》

    又到了一年“金三银四”,是找工作的最佳季节了,估计很多朋友开始考虑自己的职业生涯问题了,是否拿完年终奖之后再去外面找找机会?或者看看在新的一年里如何提高自己的技...

    腾讯Bugly
  • 关于 Android N 那些你不知道的事儿

    今年3月,Google 破天荒提前半年发布了 Android N 开发者预览版。当然,作为一个不合格的谷粉并没有第一时间体验安装,因为至今仍然能够回忆起来去年今...

    腾讯Bugly
  • 新年开篇 | 总结一个技术总监的教训和经验

    导语 2017年来了,新年开篇,就不跟大家聊技术啦,给大家分享一篇鹅厂技术总监在多年工作中总结出的教训和经验。 这篇文章自从在腾讯内部论坛发表后,精神哥每年都会...

    腾讯Bugly
  • Android Studio的安装及第一次启动时的配置问题

    出现”Unable to access Android SDK add-on list“,百度后说是第一次启动还没有下载Android SDK所致,点Cance...

    砸漏
  • 前端圈的寒冬要来?

    (上图为便利蜂某前端实习生) 前言 前段时间,有个粉丝在后台给我留言,问我今年(2017年)新手前端是否真的很难找工作?作为混迹前端圈的老司机,我竟一时语塞。思...

    闰土大叔
  • Android Studio 4.0 正式版发布

    即便在如今这个变幻莫测的时势里,我们依然看到来自世界各地开发者们的佳作——那就是 Android 上一个又一个精彩的应用。不论您是在厨房里用一台笔记本工作,还是...

    Android 开发者
  • Android Studio 3.6 调试 smali的全过程

    Smali是用于Dalvik(Android虚拟机)的反汇编程序实现,汇编工具(将Smali代码汇编为dex文件)为smali.jar,与之对应的baksmal...

    砸漏
  • 干货 | 作为前端,工作中处理过什么复杂的需求,如何解决的?

    ? ? (多图预警)聊一聊当下发生的事情吧。疫情期间大家都在享受延长假期的福利,吐槽在家办公的不爽,而我们则从过年开始就一直在战斗,到现在还没有好好休息过。 ...

    腾讯NEXT学位
  • 把深度学习计算机做到1立方毫米大小,这群科学家想干什么?

    量子位 李林 | 编译自IEEE Spectrum ? 计算机科学家David Blaauw从包里拿出一个小小的塑料盒,打开,用指尖小心翼翼地捏起里面一个小黑点...

    量子位
  • Kibana:如何开始使用 Kibana

    Kibana 是用于在 Elasticsearch 中可视化数据的强大工具。 这是开始探索您的 Elasticsearch 数据的方法。Kibana 是一种开源...

    腾讯云ES团队

扫码关注云+社区

领取腾讯云代金券