A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

1.编写第一个java代码public class first{    public static void main(String[] args)    {            System.out.println("I Love Zhuzhu!");    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

代码很简单,就是输出一串字符,我就不输出HelloWorld了,想输出什么随你开心。

2.使用javac进行编译。

普及一下什么是javac:
简单的说javac 是java语言编程编译器。如果想要深入了解请:自行百度。
编译

javac first.java
  • 1


生成文件first.class。(使用的时候配置环境变量)
给一个传送门吧: http://blog.csdn.net/badboy2008/article/details/41316253

3.使用java命令运行java first
  • 1


这里我们成功的输出了我们想要输出的元素。

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
  • 1

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
  • 1

使用后效果:

出现了一个错误:

PARSE ERROR:unsupported class file version 52.0...while parsing first.class1 error; aborting
  • 1
  • 2
  • 3
  • 4

这个错误的意思就是编译java的jdk版本过高或者是dx的版本太低。解决方法就是降低jdk版本,或者提高dx的版本。在这里我采用降低jdk版本的方式。当然我也不会重新去安装我的jdk。javac自带功能就好。

使用命令:

javac -source 1.6 -target 1.6 first.java
  • 1


这里有一个警告,无视他,dex生成成功。

[img]http://otufvq0ew.bkt.clouddn.com/XQOI%28ILQD6$LRSPWBS%60%7D9@W.png-mylove[/img]

2.dex转smali

这个就非常简单了,丢在工具里,一键搞定,不得不说图形化界面真的省事。

稍等一下,就拿到了我们想要的smali文件。
我这里使用sublime Text查看。

sublime Text自己是不会带smali高亮的,需要自己设置关于sublime Text怎样设置smali语法高亮之前有过总结:https://bbs.ichunqiu.com/thread-31148-1-1.html
关于helloworld程序的smali代码分析,之前也有总结,这里就不再赘述:https://bbs.ichunqiu.com/thread-31104-1-1.html

0x05 结尾

这里提供一个关于整篇的全部文件的下载链接:http://download.csdn.net/download/qq_36869808/10191271


1 个回复

倒序浏览
v
很不错,受教了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马