逆向Android软件的步骤

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

逆向Android软件的步骤:

        首先使用反编译的工具对反编译,然后阅读反汇编代码,如果有必要还会对其进行动态调试,找到突破口后注入或直接修改反汇编代码,最后重新编译软件进行测试。整个过程可分为反编译、静态分析、动态调试、重编译等4个环节。

        结论:反破解技术也是从这四个方面进行的。


一、对抗反编译工具(如ApkTool、BackSmali、dex2jar),使其无法进行反编译,或者反编译后无法得到软件正确的反汇编代码。

思路是:寻找反编译工具在处理apk或dex文件时的缺陷,然后在自己的软件中加以利用。主要方法有:

1、阅读反编译工具源码,找出漏洞。

2、压力测试。测试大量apk文件,找到反编译工具反编译不了的,分析其特征。

此方法难度较大,而且反编译工具不断升级,方法容易过时,因此不太建议。(不行)


二、对抗静态分析。


1、代码混淆技术:

Android2.3的SDK中正式加入了ProGuard代码混淆工具,开发人员可以使用该工具对自己的代码进行混淆。Android2.3以前的项目同样可以使用此工具。

2、NDK保护。

NDK简介:“android原生开发套件”。他是一款功能强大的工具,可以将原生C,C++代码的强大功能和android应用的图形化界面结合到一起,解决软件的跨平台问题。通过使用该工具,一些应用程序直接通过JNI调用(ps:java native interface,允许Java代码和其他语言编写的代码进行交互)与CPU打交道使性能得到提升。同时能够将程序的核心功能封装进基于“原生开发套件”的模块中,从而大大提高性能!(PS:C/C++的抗攻击能力比Java强)

优势:逆向NDK程序是很困难和繁琐的,安全性很高。

缺点:程序员开发成本提高。


3、外壳保护。

java由于其语言自身特殊性,没有外壳保护这个概念,只能通过混淆方式对其进行保护。外壳保护重点针对使用NDK编写的Native代码,逆向Native本身就已经够困难了,如果添加了外壳保护则更是难上加难,目前已知可用于ARM Linux内核程序的加壳工具只有upx。

PS:关于upx:http://upx.sourceforge.net/    支持的平台


三、对抗动态调试。


1、检测调试器:

动态调试使用调试器来挂钩软件,获取软件运行时的数据,我们可以在软件中加入检测调试器的代码,当检测到软件被调试器连接时,中止软件的运行。

首先,在AndroidManifest.xml文件的Application标签中加入android:debuggable="false",让程序不可调试,这样,如果别人想调试该程序,就必然会修改它的值,我们在代码中检查它的值来判断程序是否被修改过。代码如下:

if (0!=(getApplicationInfo().flags&=ApplicationInfo.FLAG_DEBUGGABLE)) {  Log.e("DEBUG", "程序被修改为可调试状态!!!");  android.os.Process.killProcess(android.os.Process.myPid());  }

另外,Android SDK中提供了一个方法方便程序员来检测调试器是否已经连接,代码如下:

android.os.Debug.isDebuggerConnected()

如果方法返回真,说明了调试器已经连接。我们可以随机地在软件中插入这行代码来检测调试器,碰到有调试器连接就果断地结束程序运行。

PS:感觉这是个好的办法!但是不知道是否有破解的方法???如果有必要留待以后查资料

对抗检测调试器的方法:

方法1:IsDebuggerPersent()/查找PEB中BeingDebugged内容

方法2:检查是否有异常处理器

方法3:利用调试器约定特殊指令检测

方法4:查找当前硬件断点

方法5:在执行特殊函数后检查GetLastError()值

方法6:DebugPort: CheckRemoteDebuggerPresent()/NtQueryInformationProcess()

方法7:检测SetUnhandledExceptionFilter()

方法8:ThreadHideFromDebugger

方法9:进程遍历

方法10:父进程检查

方法11:SeDebugPrivilege()

方法12:FindWindow

方法13:STARTUPINFO

方法14:timecheck

...

方法N:利用调试器漏洞



(未扩展   但是不知道能不能在android上实现这些对抗)


2、检测模拟器。(ps:只是增加了逆向的成本,必须有一台android机器)

软件发布后会安装到用户的手机中运行,如果有发现软件运行在模拟器中,很显然不合常理,可能是有人试图破解或分析它,这种情况我们必须予以阻止。

模拟器与真实的Android手机有许多差异,我们可以在命令提示符下执行"adb shell getprop"查看并对比它们的属性值,经过对比发现如下几个属性值可以用来判断软件是否运行在模拟器中:

ro.product.model、ro.build.tag、ro.kernel.qemu。

编写检测代码如下:

boolean isRunningInEmualtor() {  boolean qemuKernel = false;  Process process = null;  DataOutputStream os = null;  try{    process = Runtime.getRuntime().exec("getprop ro.kernel.qemu");    os = new DataOutputStream(process.getOutputStream());  BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream(),"GBK"));  os.writeBytes("exit\n");    os.flush();  process.waitFor();  qemuKernel = (Integer.valueOf(in.readLine()) == 1);  Log.d("com.droider.checkqemu", "检测到模拟器:" + qemuKernel);               } catch (Exception e){    qemuKernel = false;  Log.d("com.droider.checkqemu", "run failed" + e.getMessage());   } finally {  try{    if (os != null) {    os.close();    }    process.destroy();    } catch (Exception e) {  }    Log.d("com.droider.checkqemu", "run finally");   }  return qemuKernel;  }  public static String getProp(Context context, String property) {  try {  ClassLoader cl = context.getClassLoader();  Class SystemProperties = cl.loadClass("android.os.SystemProperties");  Method method = SystemProperties.getMethod("get", String.class);  Object[] params = new Object[1];  params[0] = new String(property);  return (String)method.invoke(SystemProperties, params);  } catch (Exception e) {  return null;  }  }

四、防止重编译。


1、检查签名。

每一个软件在发布时都需要开发人员对其进行签名,而签名使用的密钥文件是开发人员所独有的,破解者通常不可能拥有相同的密钥文件,因此,签名成了Andriod软件一种有效的身份标识,如果软件运行时的签名与自己发布时的不同,说明软件被篡改过,这个时候我们就可以让软件中止运行。

获取签名hash值的代码如下:

public int getSignature(String packageName) {        PackageManager pm = this.getPackageManager();  PackageInfo pi = null;  int sig = 0;  try {  pi = pm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES);  Signature[] s = pi.signatures;  sig = s[0].hashCode();    } catch (Exception e1) {  sig = 0;  e1.printStackTrace();  }  return sig;  }

可使用Eclipse自带的调试版密钥文件生成的apk文件的hash值,与上面的函数获取的hash比较,可以判断签名是否一致。


2、校验保护。(PS:通过联网的方式检验)

重编译Andriod软件的实质是重新编译classes.dex文件,代码经过重新编译后,生成的classes.dex文件的hash值已经改变,我们可以检查程序安装后classes.dex文件的Hash值,来判断软件是否被重打包过。

private boolean checkCRC() {  boolean beModified = false;  long crc = Long.parseLong(getString(R.string.crc));  ZipFile zf;  
try {  zf = new ZipFile(getApplicationContext().getPackageCodePath());  ZipEntry ze = zf.getEntry("classes.dex");  Log.d("com.droider.checkcrc", String.valueOf(ze.getCrc()));  if (ze.getCrc() == crc) {  beModified = true;  }   
} catch (IOException e) {  e.printStackTrace();  beModified = false;  
}  
return beModified;  }

五:动态修改dalvik字节码 增加逆向分析的难度,这个技术比较新 搜不到相应的比较详细的技术介绍


六:将核心代码隐藏,增加分析的难度,这个技术有待查询



转载自梦想天涯的博客:http://blog.csdn.net/viviwen123/article/details/9117589


转载于:https://my.oschina.net/kutengshe/blog/482744

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flask Sessions会话

与Cookie不同,会话数据存储在服务器上。会话是客户端登录到服务器并注销的时间间隔。需要在此会话中进行的数据存储在服务器上的临时目录中。 与每个客户端的会话分配一个会话ID。会话数据存储在cookie顶部,服务器以加密方式签名。对于这种加密&#xf…

linux rsync 远程同步

rsync(Remote Sync) 是一个Unix/linux系统下的文件同步和传输工具。Rsync通过“rsync算法”提供了一个客户机和远程文件服务器的文件同步的快速方法。工作机制: 在远程同步任务中,负责发起rsync同步操作的客户机称为发起端,而负责响应来自客…

Windows下使用VisualSVN Server搭建SVN服务器

2019独角兽企业重金招聘Python工程师标准>>> 使用 VisualSVN Server来实现主要的 SVN功能则要比使用原始的 SVN和Apache相配合来实现源代码的 SVN管理简单的多,下面就看看详细的说明。 VisualSVN Server的下载地址如下,是免费的,随…

Aspx 页面生命周期

ASP.NET 页运行时,此页将经历一个生命周期,在生命周期中将执行一系列处理步骤。这些步骤包括初始化、实例化控件、还原和维护状态、运行事件处理程序代码以及进行呈现。了解页的生命周期非常重要,这样就能在合适的生命周期阶段编写代码&#…

Python 练习册,每天一个小程序

Python 练习册,每天一个小程序说明:Python 练习册,每天一个小程序。注:将 Python 换成其他语言,大多数题目也适用不会出现诸如「打印九九乘法表」、「打印水仙花」之类的题目点此链接,会看到每个题目的代码…

不同网段虚拟机,互相访问时的路由配置,附路由知识学习

事情实例: 虚拟主机:192.168.90.247需要访问192.168.91.XX网段的数据库,无法访问。 1、这里要考虑一下添加一个路由,目的地址为192.168.91.XX,掩码为255.255.255.0,网关为如图所示 2、这里添加一个路由为:…

iOS使用自定义字体(添加字体包)

转载请注明出处!!! 首先是最简单也普遍的做法,打包内置字符库文件: 步骤如下: 1.第一步找到你想用的字体的 ttf 格式。加入到你的工程的resouce目录下。 2.在工程的plist中AddRow,“Fonts provi…

TP5:框架下载与安装——1

哪里下载? 一、百度搜索:ThinkPHP5.0完全开发手册 可以在找到安装TP5的介绍,分别有官网下载安装、Composer安装、Git安装三种方式下载 二、下载好文件 这里我们选择了GIT方式安装,要注意的是,要同时下载应用项目和核…

游戏密保卡图片识别

识别主要步骤 1.图像预处理。包括确认图片有效区域,灰度化,二值化。 2.字符分割。即将识别信息最小化。由于密保卡图片文字宽度固定且无粘连,只需要使用固定宽度切割。 3.对分割后的信息提取特征,建立特征库 4.提取特征和特征库样本进行匹配&…

基于visual Studio2013解决C语言竞赛题之0505选数

题目解决代码及点评/************************************************************************/ /* 5. 输入N个数到数组中,选出其中最大的数和最小的数,并分别将它们与最前面和最后面的数互换 */ /*************…

TP5:缩短访问路径和路由的使用——2

一、缩短访问路径 1、如图访问该文件路径 没有缩短之前,访问的路径是 http://localhost/zerg_new/public/index.php/api/v1/banner/1 缩短后,访问的路径是 http://z_new.cn/api/v1/banner/1 2、缩短路径步骤 本机apache配置,小编使用的…

10个加速Table Views开发的Tips

2019独角兽企业重金招聘Python工程师标准>>> 本文由CocoaChina译者yake_099(博客)翻译,作者:David McGraw 原文:10 Actionable Performance Tips To Speed Up Your Table View 在我们开始之前,…

TP5:验证器的封装——5

TP5的独立验证器如图所示: $validate new Validate([name > require|max:25,email > email ]); $data [name > thinkphp,email > thinkphpqq.com ]; if (!$validate->check($data)) {dump($validate->getError()); } 现在我们把验证器的封装…

flask蓝图的使用

flask蓝图的使用 首先,我对蓝图的理解相对通俗,就是觉得蓝图对于视图方法模块化、大项目协同开发过程中的一个很好的工具. 1.下图是我们通常情况下使用的项目组织结构 看一下视图方法: #views.py1 from app import app2 3 4 app.route(/user/index)5 d…

TP5:异常处理封装——3

如果不进过异常封装,如果抛出一异常只会只会上图所示,大部分时候,用户只需要知道Division by zero就够了。 1、首先先建一个类BaseException并继承Exception,这里有三个参数 $code 400; $msg ; $errorCode ;并处理当抛出异常时的…

接口测试(java+testng+ant+jenkins)第三篇ant

1、ant是什么? 是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具 2、下载安装 http://www.cnblogs.com/yuzhongwusan/archive/2013/03/26/2982411.html 3、在eclipce中的使用 准备工作: 项目右键——new——folder——folder name: li…

KVM虚拟机IO处理过程(二) ----QEMU/KVM I/O 处理过程

接着KVM虚拟机IO处理过程中Guest Vm IO处理过程(http://blog.csdn.net/dashulu/article/details/16820281),本篇文章主要描述IO从guest vm跳转到kvm和qemu后的处理过程. 首先回顾一下kvm的启动过程(http://blog.csdn.net/dashulu/article/details/17074675).qemu通过调用kvm提供…

如何利用echarts图表获取条状图点击名称和值

如何利用echarts图表获取条状图点击名称和值 听语音 |浏览:1505|更新:2017-06-13 10:20|标签:软件 1 2 3 4 5 6 7 分步阅读 echarts图表插件工具,包含了各种不同类型的图形,有圆饼图、折线图、圆环图、柱状图…

TP5: 日志记录改造——4

TP5的日志如果没有特别设置的话,只要出现错误就会记录在日志文件中。这种是没有做必要的,因为这样的话,LOG文件会特别大,而且有好多都是没有用的信息。下面我们对LOG日志进行改造只记录我们需要的信息。 还记得上一章中&#xff…

.NET使用免费开源类库操作Excel

2019独角兽企业重金招聘Python工程师标准>>> 自从上次找到NPOI之后,根据园友提供的线索以及Google,又找到了一些开源免费的类库,所以都简单体验了一遍。 主要找到以下类库: MyXls(http://sourceforge.net/projects/m…