[TOC]
0x00 简述
好久没有动过java代码的样子,都是在Android开发中使用一下,今天假装自己是一个初学者来温习一下吧。当然现在的行当是逆向,那么逆向是不能少的。之前学习都是使用Eclipse的,现在使用javac进行编译,找点新鲜感,有所进步和学习还是很好的。
链接
Android逆向-java代码基础(2)
0x01 本次内容
1.编写第一个java代码
public class first
{
public static void main(String[] args)
{
System.out.println("I Love Zhuzhu!");
}
}
代码很简单,就是输出一串字符,我就不输出HelloWorld了,想输出什么随你开心。
2.使用javac进行编译。
普及一下什么是javac:
简单的说javac 是java语言编程编译器。如果想要深入了解请:自行百度。
编译
javac first.java
生成文件first.class。(使用的时候配置环境变量)
给一个传送门吧: http://blog.csdn.net/badboy2008/article/details/41316253
3.使用java命令运行
java first
这里我们成功的输出了我们想要输出的元素。
4.结束语
以上就是使用javac进行编译java代码的简单过程,恩。非常简单,但是又必须得知道。以为这里就结束了?恩,就是结束了。
0x02 附加内容(java虚拟机)
1.java虚拟机
(1)首先明确
.class并不是直接运行在系统进程上的,而是通过一个java虚拟机来进行托管。
(2)类装载器
类加载指将类的字节码文件(.class)中的二进制数据读入内存,将其放在运行时数据区的方法区内,然后在堆上创建java.lang.Class对象,封装类在方法区内的数据结构。
(3)理解
先把.class文件给JVM,JVM进行运行,如果当该程序结束的时候,JVM也紧跟着一起结束,
(4)结束语
详细的以后会讲到,现在只是一个简单的了解
0x03 附加内容(class文件)
1.简要说明
class文件是一种8位字节的二进制流文件,相邻的项之间没有间隙,class文件中的信息是一项一项排列的, 每项数据都有它的固定长度。
2.class文件的数据项
3.class文件的结构
3.1 魔数【magic】
文件开头是4个字节大小的magic,也就是魔数。
所谓的魔数就是校验位,JVM通过判断魔数来判断是不是.class文件。一般通过java编译器编译过的魔数都是:CA FE BA BE。
3.2副版本号【minor_version】
副版本号占用第5、6两个字节,一般都为0。
3.3主版本号 【major_version】
主版本号占用第7,8两个字节,1.0的jdk 版本号是45,1.7的就是51,对应的十六进制就是0x33。
3.4 小技巧
有没有什么办法可以直接查看主版本号和副版本号的吗,当然有了,我们来使用jdk自带的javap来进行查看吧。
javap -v first
3.5 常量池计数器(constant_pool_count)
(1)常量池计数器占两个字节,他描述整个class文件的字面信息。
(2)常量池是由一组constant_pool结构体数组组成的,而数组的大小则由常量池计数器指定。
(3)常量池计数器constant_pool_count 的值 =constant_pool表中的成员数+ 1。constant_pool表的索引值只有在大于 0 且小于constant_pool_count时才会被认为是有效的。
这里我们看出,常量池计数器是00 1D,也就是说常量池的长度就是
3.6 常量池【constant_pool】
常量池,constant_pool是一种表结构,它包含 Class 文件结构及其子结构中引用的所有字符串常量、 类或接口名、字段名和其它常量、类或接口名、字段名和其它常量。 常量池中的每一项都具备相同的格式特征——第一个字节作为类型标记用于识别该项是哪种类型的常量,称为 “tag byte” 。
4.结束语
class文件结构暂时就只介绍到这里,以后会有章节进行详细解释。
0x04 .class 转换dex
虽说是要复习一下java以及学习java没有学到的知识点,但是呢,还是要侧重一下逆向的嘛。smali是APK逆向之后的常见的东西,代码这种东西就是敲的越多,见的越多,它就和你越熟练。所以把java编译成二进制字节码的class文件,然后再把class文件转化成dex文件就十分重要了。
1.class转dex
编译工具在 Android SDK 的路径如下./build-tools/19.0.1/dx
这里我把这个目录加在了环境变量里,方便我在任何目录进行使用。
使用的命令如下:
dx --dex --output=first.dex first.class
使用后效果:
出现了一个错误:
PARSE ERROR:
unsupported class file version 52.0
...while parsing first.class
1 error; aborting
这个错误的意思就是编译java的jdk版本过高或者是dx的版本太低。解决方法就是降低jdk版本,或者提高dx的版本。在这里我采用降低jdk版本的方式。当然我也不会重新去安装我的jdk。javac自带功能就好。
使用命令:
javac -source 1.6 -target 1.6 first.java
这里有一个警告,无视他,dex生成成功。
2.dex转smali
这个就非常简单了,丢在工具里,一键搞定,不得不说图形化界面真的省事。
稍等一下,就拿到了我们想要的smali文件。
我这里使用sublime Text查看。
sublime Text自己是不会带smali高亮的,需要自己设置关于sublime Text怎样设置smali语法高亮之前有过总结:hxxps://bbs.ichunqiu.com/thread-31148-1-1.html
关于helloworld程序的smali代码分析,之前也有总结,这里就不再赘述:hxxps://bbs.ichunqiu.com/thread-31104-1-1.html
0x05 结尾
这里提供一个关于整篇的全部文件的下载链接:http://download.csdn.net/download/qq_36869808/10191271