逆向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,一经查实,立即删除!

相关文章

CRT 重启Was

输入用户名、密码登陆以后 # ps -eaf | grep websphere 找到路径 /usr/IBM/WebSphere/AppServer/ 进入/usr/IBM/WebSphere/AppServer/bin 运行 stopServer.sh server1 其中server1为服务器实例名 需要输入登陆was控制台的用户名、密码 运行 startServer.sh server1 即完成服务器…

JAVA中跨平台分隔符

在Windows下的路径分隔符和Linux下的路径分隔符是不一样的,当直接使用绝对路径时,跨平台会暴出“No such file or diretory”的异常。 比如说要在temp目录下建立一个test.txt文件,在Windows下应该这么写:File file1 new File (&q…

Flask Sessions会话

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

linux rsync 远程同步

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

GUI 快捷键的实现思路

思路: 前提快捷键操作不可重复,即一个快捷键对应一个控件的动作一个窗体保持一份快捷键的map映射在相应的消息中获取快捷键列表如键盘消息在控件类对象中定义一个默认的响应行为,比如Button按了Enter键当子控件隐藏,父控件关系发生变化时则重新设置快捷键转载于:https://www.cn…

hadoop中unhealthynodes的问题解决

在yarn-site.xml中加入如下配置 <property> <name>yarn.nodemanager.disk-health-checker.min-healthy-disks</name> <value>0.0</value> </property> <property><name>yarn.nodemanager.disk-health-checker.max-d…

javascript权威指南——笔记(第十章:正则)

正则表达式是描述字符模式的对象 为什么使用正则&#xff1a; 1.找数字 1 var str "12 f13kjm54n43 43k";2 var arr [];3 4 for(var i 0, len str.length; i<len; i){5 6 var char str.charAt(i);7 8 if(char > "0"…

解決 centos -bash: vim: command not found

i. 那么如何安裝 vim 呢? 输入rpm -qa|grep vim 命令, 如果 vim 已经正确安裝,会返回下面的三行代码: rootserver1 [~]# rpm -qa|grep vim vim-enhanced-7.0.109-7.el5 vim-minimal-7.0.109-7.el5 vim-common-7.0.109-7.el5 如果少了其中的某一条,比如 vim-enhanced 的,就…

mysql日期和时间类型

mysql日期和时间类型 mysql有5种表示时间值的日期和时间类型&#xff0c;分别为、DATE&#xff0c;TIME&#xff0c;YEAR&#xff0c;DATETIME&#xff0c;TIMESTAMP。 TIMESTAMP类型有专有的自动更新特性&#xff0c; TIMESTAMP类型有专有的自动更新特性&#xff0c; TIME…

Python程序每日一练习

问题一&#xff1a;做为Apple Store App独立开发者&#xff0c;你要搞限时促销&#xff0c;为你的应用生成激活码&#xff08;或者优惠券&#xff09;&#xff0c;使用Python如何生成200个激活码&#xff08;或者优惠券&#xff09;&#xff1f; 简介&#xff1a;通用唯一识别码…

C/C++查找一定范围内的素数(筛法)

本文转自于&#xff1a;http://dalu.blogbus.com/logs/37977984.html 由于一个合数总是可以分解成若干个质数的乘积&#xff0c;那么如果把质数&#xff08;最初只知道2是质数&#xff09;的倍数都去掉&#xff0c;那么剩下的就是质数了。例如要查找100以内的质数&#xff0c;首…

mysql中char,varchar与text类型的区别和选用

关于char&#xff0c;varchar与text平时没有太在意&#xff0c;一般来说&#xff0c;可能现在大家都是用varchar。但是当要存储的内容比较大时&#xff0c;究竟是选择varchar还是text呢&#xff1f;不知道。。。。。。 text 、 char、varchar 是数据在数据库中的存放策略问题…

循环Map方法

public static void main(String[] args) { Map<String, String> map new HashMap<String, String>(); map.put("1", "张三"); map.put("2", "李四"); map.put("3", "王五"); /*方法一 &#xff1a;…

rsync备份学习

备份内容&#xff1a;把虚拟机A&#xff08;192.168.91.243&#xff09;需要把文件备份到虚拟机B&#xff08;192.168.91.207&#xff09; 一、检查两台虚拟机是否已经安装rsync rsync -version命令检查 二、如果没有安装rsync&#xff0c;需要先安装rsync 在客户端和服务器…

四大组件的工作过程

1、四大组件的运行状态 Android的四大组件中除了BroadcastReceiver以外&#xff0c;其他三种组件都必须在AndroidManifest中注册&#xff0c;对于BroadcastReceiver来说&#xff0c;既可以在AndroidManifest中注册也可以通过代码来…

联系表单 1_copy

你的名字 &#xff08;必填&#xff09; [text* your-name] 你的邮箱 &#xff08;必填&#xff09; [email* your-email] 主题 [text your-subject] 你的留言 [textarea your-message] [submit "发送"] [your-subject] [your-name] < [your-email]> 发件人…

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

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

新装的linux系统,用SSH连接出现乱码怎么办?附改名虚拟机文件方法

原因&#xff1a;SSH不支持中文&#xff0c;需要系统语言设置 1、查看当前操作系统的语言 echo $LANG 2、临时更改默认语言(关闭当前会话失效) export LANGen_US.UTF-8 3、永久生效,编辑文件保存并退出 vi /etc/sysconfig/i18n LANG"en_US.UTF-8" 4、使其…

hdu 6183 线段树的空间优化

题意&#xff1a; 一个空的坐标系&#xff0c;有④种操作&#xff1a;①1 x y c表示在(x, y)点染上颜色c&#xff1b;②2 X y1 y2表示查询在(1, y1)到(X, y2)范围内有多少种不同的颜色&#xff1a; ③0表示清屏&#xff1b;④3表示程序退出&#xff08;0<x, y<1000000, 0…

js 判断数据是否为空

// var a ""; // var a " "; // var a null; // var a undefined; // var a []; // var a {}; // var a NaN;if(a undefined) { // 只能用 运算来测试某个值是否是未定义的console.log("为undefined");}if(a nul…