java-在linux(windos)系统下解析加壳的apk

问题描述

在linux(windos)系统下解析加壳的apk

最好纯java代码 不要依赖组件 比如aapt 我用过aapt windos还好 linux需要的依赖太多

解决方案

首先加壳的方法和代码都是从Jack_Jia的博客学习的。

详见:http://blog.csdn.net/jiazhijun/article/details/8678399

由于本人从c++开发直接跳到Android开发,没有对android进行系统的学习,看上面博客时还是有很多不理解的地方。本文把不理解的地方梳理一下,最后提供个测试源码(加了比较详细的注释)。希望对于跟我一样安卓基础不是太好的人有一定帮助。

正文:
apk加壳的目的(我的用途):增加apk静态分析的难度。(如果反编译的人知道是加壳的,可以在data/包名目录下 找到真正的apk。所以在壳上增加正常的代码的话可以增加迷惑性)
基础知识:ClassLoader:http://www.iteye.com/topic/83978 这个写的不错想了解的可以去看看。

整个加壳的过程涉及到三个程序:要加壳的apk,加壳程序(demo中的apkjm),解壳程序(demo中的myunshell)。

其中加壳程序就是把要加壳的apk放入解壳程序的dex文件中。
解壳程序是最后替代我们apk安装到手机中运行的程序。它在执行中从自己的dex中释放出我们apk程序。

步骤:

1.实现加壳程序。
2.实现解壳程序:按博客创建个解壳的Application。如果我们的apk中用到了 Application,需要在解壳程序的xml文件中添加:

      <meta-data android:name="APPLICATION_CLASS_NAME" android:value="com.***.Application"/>

      com.***.Application  是我们apk的Application类名 加上我们apk的包名

注:1.我们apk用到的权限和组件都需要添加到解壳程序的xml中,组件都需要加上完整的包名路径。

   2.我们apk内用到的资源也就是res文件内的东西,需要拷贝到解壳程序的res中。

   3.如果我们apk静态注册了广播接收器,那广播接收器类需要在解壳程序中实现。

3.解壳程序完成后,把bin文件夹内的dex文件拷出来,用加密程序把我们的apk添加到该dex文件中。

4.把新生成的dex文件覆盖bin文件夹中原来的dex文件,并把apk文件也删掉,重新运行解壳程序生成新的解壳apk。 这个apk就是我们需要的最后的apk文件了。加壳就完成了。

另外:1.在解壳程序中对我们apk文件进行解密函数调用的地方不对。 在demo中做了修改和说明。

       2.我在释放apk的时候加了个判断,如果文件存在就不再释放了,如果是在测试的时候,可以先屏蔽掉,免的每次运行调试前要先删掉原来的程序。

[java] view plain copy
if (!dexFile.exists())

{

dexFile.createNewFile(); //在payload_odex文件夹内,创建payload.apk

// 读取程序classes.dex文件

byte[] dexdata = this.readDexFileFromApk();

// 分离出解壳后的apk文件已用于动态加载

this.splitPayLoadFromDex(dexdata);

}

首先加壳的方法和代码都是从Jack_Jia的博客学习的。

详见:http://blog.csdn.net/jiazhijun/article/details/8678399

由于本人从c++开发直接跳到Android开发,没有对android进行系统的学习,看上面博客时还是有很多不理解的地方。本文把不理解的地方梳理一下,最后提供个测试源码(加了比较详细的注释)。希望对于跟我一样安卓基础不是太好的人有一定帮助。

正文:
apk加壳的目的(我的用途):增加apk静态分析的难度。(如果反编译的人知道是加壳的,可以在data/包名目录下 找到真正的apk。所以在壳上增加正常的代码的话可以增加迷惑性)
基础知识:ClassLoader:http://www.iteye.com/topic/83978 这个写的不错想了解的可以去看看。

整个加壳的过程涉及到三个程序:要加壳的apk,加壳程序(demo中的apkjm),解壳程序(demo中的myunshell)。

其中加壳程序就是把要加壳的apk放入解壳程序的dex文件中。
解壳程序是最后替代我们apk安装到手机中运行的程序。它在执行中从自己的dex中释放出我们apk程序。

步骤:

1.实现加壳程序。
2.实现解壳程序:按博客创建个解壳的Application。如果我们的apk中用到了 Application,需要在解壳程序的xml文件中添加:

      <meta-data android:name="APPLICATION_CLASS_NAME" android:value="com.***.Application"/>

      com.***.Application  是我们apk的Application类名 加上我们apk的包名

注:1.我们apk用到的权限和组件都需要添加到解壳程序的xml中,组件都需要加上完整的包名路径。

   2.我们apk内用到的资源也就是res文件内的东西,需要拷贝到解壳程序的res中。

   3.如果我们apk静态注册了广播接收器,那广播接收器类需要在解壳程序中实现。

3.解壳程序完成后,把bin文件夹内的dex文件拷出来,用加密程序把我们的apk添加到该dex文件中。

4.把新生成的dex文件覆盖bin文件夹中原来的dex文件,并把apk文件也删掉,重新运行解壳程序生成新的解壳apk。 这个apk就是我们需要的最后的apk文件了。加壳就完成了。

另外:1.在解壳程序中对我们apk文件进行解密函数调用的地方不对。 在demo中做了修改和说明。

       2.我在释放apk的时候加了个判断,如果文件存在就不再释放了,如果是在测试的时候,可以先屏蔽掉,免的每次运行调试前要先删掉原来的程序。

[java] view plain copy
if (!dexFile.exists())

{

dexFile.createNewFile(); //在payload_odex文件夹内,创建payload.apk

// 读取程序classes.dex文件

byte[] dexdata = this.readDexFileFromApk();

// 分离出解壳后的apk文件已用于动态加载

this.splitPayLoadFromDex(dexdata);

}

解决方案二:

我说下 用的是java

时间: 2024-11-01 14:18:24

java-在linux(windos)系统下解析加壳的apk的相关文章

linux CentOS 系统下如何将php和mysql命令加入到环境变量中_Linux

linux CentOS 系统下如何将php和mysql命令加入到环境变量中 在Linux CentOS系统上安装完php和MySQL后,为了使用方便,需要将php和mysql命令加到系统命令中,如果在没有添加到环境变量之前,执行"php -v"命令查看当前php版本信息时时,则会提示命令不存在的错误,下面我们详细介绍一下在linux下将php和mysql加入到环境变量中的方法(假设php.mysql和apache分别安装在/phpstudy/server/php/./phpstudy

windows与linux双系统-win10与Linux双系统下有线连接问题

问题描述 win10与Linux双系统下有线连接问题 小白一枚 先安装的win10,之后安装了Ubuntu,发现安装完Ubuntu之后,Ubuntu可以用有线,win10以太网(有线)连不上,老是显示无法是别Internet,求指点要怎么做啊?毕竟刚装Linux,还不熟悉 解决方案 windows 10把控制面板藏起来了.你可以右键点开始菜单-控制面板,找到网络,然后里面的适配器,看看网卡驱动有没有装,以及ip分配是否正确. 解决方案二: 可能是网卡驱动没有安装,或者不兼容win10,前往设备管

Linux(CentOS)系统下安装好apache(httpd)服务后,其他电脑无法访问的原因

原文:Linux(CentOS)系统下安装好apache(httpd)服务后,其他电脑无法访问的原因 今天试了下在虚拟机上利用CentOS系统的yum命令安装好了httpd(apache2.4.6),然后在windows系统下访问此虚拟机的ip地址,却访问不了. 因为前段时间有知道过iptable的限制,所以在想是不是因为iptable限制了80端口呢! 所以在网上找了下iptable的命令,并且把tcp的80端口设置成允许任何IP都可以访问: iptables -I INPUT -p TCP

Fedora Linux 8系统下配置JDK

1. 到sun.com下载jdk-6u4-linux-i586.bin,假设下载到当前用户目录下; 2. 在/home/abin下建立software目录,拷贝jdk-6u4-linux-i586.bin到software目录; 3. 找开终端,转到/home/abin/software,执行命令sh jdk-6u4-linux-i586.bin,屏幕会显示一些协议文件,一路回车,到最后会认你确认安装,输入yes,回车,稍等片刻......,会在/home/abin/software下生成一个文

linux ubuntu系统下MySQL的安装及设置

debian下安装MySQL:1.构建源或使用光盘镜像,当然你插入光盘也没问题2.有源时本地文件的源配置:修改/etc/apt/sources.list文件, 示例:deb http://192.168.10.73/ sid main 以上设置如果待安装的电脑可以接入Internet,均可省略.3.准备工作做好了,现在开始安装: 1)输入:apt-get install mysql-server 2)接下来会有几个询问对话框,不管你能不能看懂,无特殊情况一路yes就OK了,主要就是搜寻源,识别文

XP系统下加载Q77芯片组的AHCI驱动安装指导

  故障现象: 主机Q77芯片组主板,已经在IDE硬盘模式下安装了XP系统,希望指导在Windows XP系统下手动加载AHCI驱动 解决方案: 注意: 1. 确认用户当前BIOS中硬盘模式为IDE,如果先选成AHCI模式则启动会蓝屏,一定在系统下成功加载AHCI驱动之后再在BIOS中将IDE改成AHCI模式 2. 本方法并不能保证在非标准操作系统上加载成功,同时操作前提示用户一定备份数据,加载有风险此方案非微软官方操作,不一定能100%成功 步骤: 1. 带用户在设备管理器中找到此选项,如图选

poi3 11 excel2007-poi3.11 linux 下解析了不excel2007 但win7下没问题

问题描述 poi3.11 linux 下解析了不excel2007 但win7下没问题 使用spring mvc 上传文件.POI 在linux 64位下解析不了excel2007文件.而win7 32位下没问题.使用wps创建的excel都没问题.经过调试发现window下,上传文件的时候文件头是847d1caa,当写入本地再读取后会将文件头改为504b0304(zip格式),所以可以正常运行.但linux下再读取文件头也不会变,导致POI识别不了.代码如下: @RequestMapping(

双系统下的linux如何安全卸载

问题描述 双系统下的linux如何安全卸载 前几天装了一个elive的linux,感觉一点都不好用,所以想卸载了重新装一个centos的,请问各位大大如何安全地卸载linux.我的电脑是win7和linux的双系统,启动的时候先进linux的引导再进windows的 解决方案 双系统卸载Linux双系统 卸载linux双系统下完美卸载linux 解决方案二: 很大的可能性,你用的是 grub 作为启动引导程序 http://blog.sina.com.cn/s/blog_3f376a4f0101

linux/Windows系统如何安装PHP-openssl扩展

今天倒腾了半天公司的OA 办公系统,原来现在很多的smtp服务器是需要ssl方式加密的,而支持ssl需要php加载openssl扩展.所以本文我们将和大家一起分享如何在linux/Windows系统下安装PHP的openssl扩展. 关于openssl OpenSSL是一个安全套接字层密码库,囊括主要的密码算法.常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用. 安装openssl扩展 linux系统篇 1.CentOS系统 php安装包目录:/data/php