android apk 防止反编译技术第三篇-伪加密

经过了忙碌的一周终于有时间静下来写点东西了,我们继续介绍android apk防止反编译技术的另一种方法。前两篇我们讲了加壳技术和运行时修改字节码,如果有不明白的可以查看我的博客的前两篇中关于这两种技术的介绍。接下来我们将介绍另一种简单适用的防止apk反编译的技术-伪加密。

一、伪加密技术原理

我们知道android apk本质上是zip格式的压缩包,我们将android应用程序的后缀.apk改为.zip就可以用解压软件轻松的将android应用程序解压缩。在日常生活或者工作中,我们通常为了保护我们自己的文件在进行压缩式都会进行加密处理。这样的方法对于android apk同样适用。原理很简单,在zip的文件格式中有一个位用来标示该zip压缩文件中的文件是否被加密,我们只要找到该标志位将其置1就可以实现我们的目的。而android的包安装服务(PackageManagerService)在进行apk安装时并不关心这个加密位(暂时我们就这么叫它吧)可以进行正常的安装并且也不会影响apk的运行。

二、zip文件格式

zip的文件格式通常有三个部分组成:压缩文件源数据、压缩目录源数据、目录结束标识。这三个部分中和我们说的加密位有关的是压缩目录源数据部分,我们接下来详细介绍这一部分。

压缩目录源数据部分记录着所有的压缩目录源数据。其结构如下:

Central directory file header

Offset

Bytes

Description[18]

0

4

Central directory file header signature =0x02014b50

核心目录文件header标识=(0x02014b50)

4

2

Version made by

压缩所用的pkware版本

6

2

Version needed to extract (minimum)

解压所需pkware的最低版本

8

2

General purpose bit flag

通用位标记

10

2

Compression method

压缩方法

12

2

File last modification time

文件最后修改时间

14

2

File last modification date

文件最后修改日期

16

4

CRC-32

CRC-32算法

20

4

Compressed size

压缩后大小

24

4

Uncompressed size

未压缩的大小

28

2

File name length (n)

文件名长度

30

2

Extra field length (m)

扩展域长度

32

2

File comment length (k)

文件注释长度

34

2

Disk number where file starts

文件开始位置的磁盘编号

36

2

Internal file attributes

内部文件属性

38

4

External file attributes

外部文件属性

42

4

Relative offset of local file header. This is the number of bytes between the start of the first disk on which the file occurs, and the start of the local file header. This allows software reading the central directory to locate the position of the file inside the ZIP file.

本地文件header的相对位移。

46

n

File name

目录文件名

46+n

m

Extra field

扩展域

46+n+m

k

File comment

文件注释内容

该结构中的General purpose bit flag部分的第0位如果置1,标识该压缩包被加密;置为0标识该压缩包没有被加密。

三、具体实施

我们可以利用ZipCenOp.jar这个jar包对apk进行加密和解密操作(也有用python实现这个操作的这里我们不做介绍)。

(1)对apk进行加密

加密后,我们用解压缩软件进行解密会看如下的提示信息:

用apktool进行反编译会提示如下的错误信息:

加密后apk是可以正常的安装和运行的。

(2)对apk进行解密

解密对我们来说没有多大的用途,只是了解一下。

根据上面的讲述相信大家对apk的伪加密技术有了一定的了解,不过这种方法对于android 4.2.x版本及以后系统已经不适用了它会拒绝这种加密apk的安装。下一篇我们将讲解另一种android apk防止反编译技术,期待大家的捧场。

原文发布于微信公众号 - 程序员互动联盟(coder_online)

原文发表时间:2015-04-12

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏安恒网络空间安全讲武堂

MeePwn-Web复现

这里有一个链接的跳转header( "Location: alien_sector.php" ),但是需要$_GET['alien']==='@!#$@!@@'

1291
来自专栏Golang语言社区

package http

要管理代理、TLS配置、keep-alive、压缩和其他设置,创建一个Transport:

1564
来自专栏owent

Android和IOS的TLS问题

这个问题起源于以前给客户端写的一个log模块,然后里面为了线程安全且多线程下不互相写乱,并且因为这些系统基本都用比较高版本的编译器,都支持C++11了,所以就用...

891
来自专栏魏琼东

分布式消息总线,基于.NET Socket Tcp的发布-订阅框架之离线支持,附代码下载

     在前面的分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载一文之中给大家分享和介绍了一个极其简单也非常容易上的基于...

910
来自专栏Android 研究

OKHttp源码解析(九):OKHTTP连接中三个"核心"RealConnection、ConnectionPool、StreamAllocation

RealConnection是Connection的实现类,代表着链接socket的链路,如果拥有了一个RealConnection就代表了我们已经跟服务器有了...

1735
来自专栏坚毅的PHP

jersey处理支付宝异步回调通知的问题:java.lang.IllegalArgumentException: Error parsing media type 'application/x-www

tcpflow以流为单位分析请求内容,非常适合服务器端接口类服务查问题 这次遇到的问题跟支付宝支付后的回调post结果有关 淘宝的代码例子: publi...

5045
来自专栏Janti

基础巩固——长连接 、短连接、心跳机制与断线重连

本文将从长连接和短连接的概念切入,再到长连接与短连接的区别,以及应用场景,引出心跳机制和断线重连,给出代码实现。

1351
来自专栏魏琼东

分布式消息总线,基于.NET Socket Tcp的发布-订阅框架之离线支持,附代码下载

一、分布式消息总线以及基于Socket的实现      在前面的分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载一文之中给...

3237
来自专栏程序员八阿哥

Python从入门到摔门(6):Python Web服务器Tornado使用小结

举例来说,假设某个银行网站有这样的 URL: http://bank.example.com/withdraw?amount=1000000&for=Eve ...

1042
来自专栏空帆船w

Android 专用的日志封装库

所以在程序开发或者上线后如果出现了 Bug,能够及时查看日志,对修复 Bug 非常有帮助。

652

扫码关注云+社区