吾爱Java逆向,Android逆向-java代码基础(1)

本文介绍了如何使用javac编译Java代码并运行,讲解了Java虚拟机(JVM)的作用,以及.class文件的结构。此外,还涉及了将.class转换为dex文件在Android逆向工程中的重要性,包括使用dx工具转换过程中遇到的问题及解决方法。最后,简要提到了dex文件的生成与smali代码的分析。

[TOC]

0x00 简述

好久没有动过java代码的样子,都是在Android开发中使用一下,今天假装自己是一个初学者来温习一下吧。当然现在的行当是逆向,那么逆向是不能少的。之前学习都是使用Eclipse的,现在使用javac进行编译,找点新鲜感,有所进步和学习还是很好的。

链接

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

3.使用java命令运行

java first

8FKMSOH%5BGTUJIQA%5B61%28%24~CF.png-mylove

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

4.结束语

以上就是使用javac进行编译java代码的简单过程,恩。非常简单,但是又必须得知道。以为这里就结束了?恩,就是结束了。

0x02         附加内容(java虚拟机)

1.java虚拟机

(1)首先明确

.class并不是直接运行在系统进程上的,而是通过一个java虚拟机来进行托管。

790Z1_24%5D2%5BOD3Q69C40KL1.png-mylove

(2)类装载器

类加载指将类的字节码文件(.class)中的二进制数据读入内存,将其放在运行时数据区的方法区内,然后在堆上创建java.lang.Class对象,封装类在方法区内的数据结构。

(3)理解

先把.class文件给JVM,JVM进行运行,如果当该程序结束的时候,JVM也紧跟着一起结束,

(4)结束语

详细的以后会讲到,现在只是一个简单的了解

0x03 附加内容(class文件)

1.简要说明

class文件是一种8位字节的二进制流文件,相邻的项之间没有间隙,class文件中的信息是一项一项排列的, 每项数据都有它的固定长度。

2.class文件的数据项

%247WE_%5BBWAZL%5DXZN8P%24Y@%2428.png-mylove

3.class文件的结构

3.1 魔数【magic】

文件开头是4个字节大小的magic,也就是魔数。

所谓的魔数就是校验位,JVM通过判断魔数来判断是不是.class文件。一般通过java编译器编译过的魔数都是:CA FE BA BE。

K~E~AU%2576EQ%24L_SR9T@X%29%5BR.png-mylove

3.2副版本号【minor_version】

副版本号占用第5、6两个字节,一般都为0。

BS%5BO_LJ%7D%7D8KR9F%28%29U0YX1MD.png-mylove

3.3主版本号 【major_version】

主版本号占用第7,8两个字节,1.0的jdk 版本号是45,1.7的就是51,对应的十六进制就是0x33。

A~R2%282OXBK%285B9%291%5DZV~JNI.png-mylove

3.4 小技巧

有没有什么办法可以直接查看主版本号和副版本号的吗,当然有了,我们来使用jdk自带的javap来进行查看吧。

javap -v first

%7BWW~W69EC31%299K4~%24%24F0EUK.png-mylove

3.5 常量池计数器(constant_pool_count)

(1)常量池计数器占两个字节,他描述整个class文件的字面信息。

(2)常量池是由一组constant_pool结构体数组组成的,而数组的大小则由常量池计数器指定。

(3)常量池计数器constant_pool_count 的值 =constant_pool表中的成员数+ 1。constant_pool表的索引值只有在大于 0 且小于constant_pool_count时才会被认为是有效的。

6%2876%5BD8L%298_%5B1YLQ7Q3VJPU.png-mylove

这里我们看出,常量池计数器是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

使用后效果:

XOQ%2800%24W~V%60B%5DXZCFG58EE6.png-mylove

出现了一个错误:

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

34%7BORTD3L%5D9%5BD2TLR%5B%7DDCFA.png-mylove

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

XQOI%28ILQD6%24LRSPWBS%60%7D9@W.png-mylove

2.dex转smali

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

MT1G%24NOPLY6R_ASZ8%28ICXG7.png-mylove

稍等一下,就拿到了我们想要的smali文件。

我这里使用sublime Text查看。

Y%28_REVM8J%28DFJBF1~Z8@U%7DO.png-mylove

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 结尾

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值