前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android app反调试与代码保护的一些基本方案

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

作者头像
腾讯Bugly
发布2019-05-16 14:57:32
3.1K0
发布2019-05-16 14:57:32
举报
文章被收录于专栏:腾讯Bugly的专栏腾讯Bugly的专栏

| 导语 本文介绍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字,当前共字

发送中

微信扫一扫 关注该公众号

微信扫一扫 使用小程序

即将打开""小程序

取消 打开

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 腾讯Bugly 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Java:
    • (1)Proguard
      • (2)isDebuggerConnected
        • (3)android:debuggable属性
          • (1)ptrace函数
            • (2)文件节点检测
              • (3)Inotify
                • (4)so文件hash值检测
                  • (5)时间差检测
                  • Resource资源文件:
                    • APK签名检测
                      • 朋友会在“发现-看一看”看到你“在看”的内容
                      • 朋友将在看一看看到
                      • 发布到看一看
                  相关产品与服务
                  云开发 CloudBase
                  云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档