|
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.class1 error; aborting这个错误的意思就是编译java的jdk版本过高或者是dx的版本太低。解决方法就是降低jdk版本,或者提高dx的版本。在这里我采用降低jdk版本的方式。当然我也不会重新去安装我的jdk。javac自带功能就好。 使用命令: javac -source 1.6 -target 1.6 first.java![]()
这里有一个警告,无视他,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
|