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


一开始我想,你只给我一个安装包就想让我说出程序的工作原理,叫我这个既没接触过android开发又没搞过逆向工程的小菜鸟如何下手。
不过我知道两件事,1、android程序多是基于java的  2、java一类的解释型语言所写的程序大部分是可以被逆向到接近源码的。于是我开始尝试从这两点切入。
首先apk文件的图标吸引了我,那明显是个归档文件(类似.zip .rar .tar.gz的),如果在电脑上打开,一定能看到一部分内容。
双击后,果然出现了下图的窗口pic

./res文件夹代表的应该是resources,包含程序运行时需要调用的各种图标等等;
./META-INF是任何java程序都会生成的文件夹,一般用来装载程序信息。
所以这两个文件夹基本上不会是切入点,那么重点就在./下的文件了
*.xml一般不会用来描述程序本身,resources顾名思义,很显然最关键的文件是classes.dex
那么这个class.dex到底是什么样一个文件,蕴含了多少信息,又和java有着怎样的联系呢?

为此,我在维基上搜索了一下,在apk的页面下,维基只给出了一句话,
"classes.dex: 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,维基给出了一个长长的解释页面(http://en.wikipedia.org/wiki/Dalvik_virtual_machine),其中对于我有用的信息大致是这样的:Dalvik是一个为安卓系统所有的、不同于java架构的虚拟机(VM)。

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

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

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

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


pic



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


pic



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


pic



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

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


pic



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



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

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

一搜即得,果然有结果:


pic



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


pic



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


pic



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

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


pic



最后,虽然我是一个坚定的自由软件主义者,但还是不得不提一下,逆向工程很有趣,可以对软件进行加工,破解,但从别人已完成的作品中榨取源代码总不是什么好事。毕竟对方并没有公开源代码,就像一个不愿告诉你心底秘密的人,若是你某一天在他不知道的情况给他催了眠,套出了他脑袋里所有的东西,总还是过意不去的。
逆向有风险 hacking请谨慎
2011-9-28 09:20:29
1楼
语气很轻松,功力很深厚
折叠评论
加载评论中,请稍候...
折叠评论
2楼
LZ强人呀!   要是偶有一点就好了..  [s:226]
折叠评论
加载评论中,请稍候...
折叠评论
2011-10-2 23:02:02
2011-10-2 23:02:02
3楼
很强大……学习了
折叠评论
加载评论中,请稍候...
折叠评论
2011-10-3 12:26:34
4楼
[s:225] Jar太不靠谱了!

算法核心部分还是用JNI调用比较安全一些,速度也要比Java快。
折叠评论
加载评论中,请稍候...
折叠评论
5楼
逆向太可怕了T_T
难道要为了保护源码,放弃所有解释型语言,再牺牲一些性能?
折叠评论
加载评论中,请稍候...
折叠评论
2011-10-4 09:55:53
6楼
啥语言都没用,c,c++照样逆向……
折叠评论
加载评论中,请稍候...
折叠评论
7楼
破SS  你从哪找来这么华丽的VIM的
折叠评论
加载评论中,请稍候...
折叠评论
8楼
这个vim确实够华丽的……

C++那个比较难逆向……C++那么飘逸的风格反编译出来的基本就不是人看的了……
折叠评论
加载评论中,请稍候...
折叠评论
9楼
用C写的开-O3来编译看你怎么逆向。

反汇编出来的变量名估计惨不忍睹。
折叠评论
加载评论中,请稍候...
折叠评论
2011-10-16 11:12:55
2011-10-16 11:12:55
10楼
似乎有研究C++逆向的。。。有一定成果
直接用汇编和C++混合算了。。。。。。
折叠评论
加载评论中,请稍候...
折叠评论
2011-10-18 13:08:09
2011-10-18 13:08:09
11楼
同事讲现在反编译工具反编译不了最新版本生成的安装包了,
据他讲之前混淆代码花的时间跟开发时间差不多
折叠评论
加载评论中,请稍候...
折叠评论
2011-10-24 01:00:10
2011-10-24 01:00:10
12楼
回 7楼(我说要有光) 的帖子
开了语法高亮
用的好像是taglist插件
不过这个配色 不好看。。
我还是喜欢黑背景的
折叠评论
加载评论中,请稍候...
折叠评论
2012-10-16 14:18:43
2012-10-16 14:18:43
13楼
楼主,才子啊,
折叠评论
加载评论中,请稍候...
折叠评论
14楼
膜拜牛人[s:271]
折叠评论
加载评论中,请稍候...
折叠评论
2012-10-24 22:34:51
2012-10-24 22:34:51
15楼
高人~~[s:271][s:271][s:271]
折叠评论
加载评论中,请稍候...
折叠评论
2012-10-25 08:06:55
16楼
回 12楼(鹏鹏有木有) 的帖子
黑底绿字。
折叠评论
加载评论中,请稍候...
折叠评论

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

{{submitted?"":"投诉"}}
请选择违规类型:
{{reason.description}}
支持的图片格式:jpg, jpeg, png