‭一个小记录,关于安卓应用的逆向
epi.clyce2011/09/28软件综合 IP:上海
这几天收到一封邮件。
简单说就是有个地方想开发android手机程序,里面需要用到一些图片处理技术,然而他们的技术人员之前没有和图像处理打过交道。
于是他们就下载了同类的应用,通过邮件发给我,问我能不能帮他们看看这个应用程序用的是什么算法。
打开邮件,发现是一个典型的android安装包,.apk格式
140_f35c1317154889377c8b2ad40c5fe.png

一开始我想,你只给我一个安装包就想让我说出程序的工作原理,叫我这个既没接触过android开发又没搞过逆向工程的小菜鸟如何下手。
不过我知道两件事,1、android程序多是基于java的  2、java一类的解释型语言所写的程序大部分是可以被逆向到接近源码的。于是我开始尝试从这两点切入。
首先apk文件的图标吸引了我,那明显是个归档文件(类似.zip .rar .tar.gz的),如果在电脑上打开,一定能看到一部分内容。
双击后,果然出现了下图的窗口 140_482b1317154905a37fe9539146323.png
./res文件夹代表的应该是resources,包含程序运行时需要调用的各种图标等等;
./META-INF是任何java程序都会生成的文件夹,一般用来装载程序信息。
所以这两个文件夹基本上不会是切入点,那么重点就在./下的文件了
*.xml一般不会用来描述程序本身,resources顾名思义,很显然最关键的文件是XXXXXXXXXXx
那么这个XXXXXXXXx到底是什么样一个文件,蕴含了多少信息,又和java有着怎样的联系呢?

为此,我在维基上搜索了一下,在apk的页面下,维基只给出了一句话,
"XXXXXXXXXXx: The classes compiled in the dex format understandable by the Dalvik virtual machine"
顺藤摸瓜,维基搜索dex和Dalvik virtual machine,对于.dex文件,wiki的解释是:
"Dalvik Executable File (.dex), into which Android programs are compiled into."
而对于Dalvik virtual machine,维基给出了一个长长的解释页面(XXXXXXXXXXXXXXXXXXXXXXX/wiki/Dalvik_virtual_machine),其中对于我有用的信息大致是这样的:Dalvik是一个为安卓系统所有的、不同于java架构的虚拟机(VM)。

那么事情就很明朗了,这个XXXXXXXXx文件事实上就是一个Dalvik虚拟机上的可执行文件格式,.dex文件与安卓内置的Dalvik虚拟机的关系类似与.jar格式与JVM的关系。

既然如此,就可能存在两个突破口:对.dex文件直接进行逆向工程或者想办法将.dex转换成java程序的格式(一般来说是.jar)

后来在网上翻阅的更多信息,我得知.dex确实是可以转换为.jar的,于是眼前有了一条明路。
路有了,上阵之前得给自己挑把好刀,谷歌告诉我,有个叫做dex2jar的程序就不错,而且是绿色跨平台的。

dex2jar下载回来是一个压缩包,直接解压就能用。我习惯于把绿色软件放到用户文件夹下的 ./.GSoft/下
如图:


140_dfa413171549260789ed9a72802fe.png


将.apk文件中获得的XXXXXXXXXXx装入该目录下


140_1f6813171549372995d6d08aaff34.png


接下来就可以开始转换了,打开终端,cd到放dex2jar的地方,然后输入
bash XXXXXXXXXX XXXXXXXXXXx
等待操作完成,再ls一下,发现目录下多了一个叫做classes_dex2jar.jar 看来这个就是转换出来的文件了
全转换过程如下图:


140_c6931317154952a9cf780eea36448.png


接下来就是对.jar文件进行逆向。
java反编译的工具有很多,其中最好的应当数简洁强大的JD-gui了,同样也是一个跨平台的软件,全C++编写,运行效率高,生成结果准确。
(这里我想求助一下各位大牛,JD-gui有木有命令行版的,比如JD,JDCLI或者ncJD之类。。。我看到JD的官网上列出了JD-core,JD-gui和JD-eclipse,但是JD-core不能下载啊 TAT)

JD-gui是个绿色软件,解压后如下:


140_2d361317154965cf84e74b43c628f.png


直接双击jd-gui,就开始运行了,界面非常简洁,没有任何多余的按钮之类
打开转换后的.jar文件之后,反编译结果几乎立即就显示了出来,可是问题来了,源文件含有大量的包,拆成.java后文件数量更是数不尽,而且这里面还有许多反编译出来的java自带包和androidSDK包,我现在只需要图像处理部分的代码,肯定不能遍历寻找啊。 140_eee91317154979221a27a652750d8.png


究竟该搜索什么关键字呢?这时我觉得不如先使用一下这个应用,对熟悉其功能组织一定有所帮助。

于是我安装了那个apk文件到我的手机上,一个很漂亮的应用,具体功能出于保密性我没法说。
很快找到了应用的图像处理功能,是上传之前润色图片用的,拥有大量候选滤镜,是一个完全傻瓜化的图片处理模块。
翻阅这些滤镜,我看到有个滤镜的名字叫做lomo
ok,一个难得的具有标志性的好名字,就拿这个来搜索吧

一搜即得,果然有结果:


140_81db1317154996f15b548fe8daf75.png


双击搜索结果跳转到相应文件下,看到picprocessing包下的七个文件。
顾名思义,除了第一个之外,都是需要的:


140_a4321317155006ca14f729fce807f.png


接下来便是将这七个文件保存成.java文件,打开心爱的vim,准备进行分析或二次开发


140_658b1317155018cf36bff7cb2cf3d.png


另外,由于各种原因,JD是不能100%还原原来的代码的,可能会有缺失、错误,还会多出许多magic numbers,以及乱糟糟的跳转。但这些并不足以为分析代码的工作原理提供什么障碍,会一点编程,电脑里有一本android开发手册,就可以很轻松了

允许我做一下广告,vim是万能的,秒杀一切编辑器以及IDE的!


140_553113171550312088a00c04b24c2.png


最后,虽然我是一个坚定的自由软件主义者,但还是不得不提一下,逆向工程很有趣,可以对软件进行加工,破解,但从别人已完成的作品中榨取源代码总不是什么好事。毕竟对方并没有公开源代码,就像一个不愿告诉你心底秘密的人,若是你某一天在他不知道的情况给他催了眠,套出了他脑袋里所有的东西,总还是过意不去的。
逆向有风险 hacking请谨慎
来自:计算机科学 / 软件综合
17
 
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
epi.clyce
学者 机友 笔友
文章
345
回复
2156
学术分
21
2007/07/10注册,1个月5天前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}