服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|JavaScript|易语言|

服务器之家 - 编程语言 - Java教程 - 浅谈javap命令拆解字节码文件

浅谈javap命令拆解字节码文件

2021-09-02 15:1120481024 Java教程

这篇文章主要介绍了拆解字节码文件javap命令,对反编译感兴趣的同学可以参考下

目的拆解分析反编译字节码 解析成人能够理解的结构 ,然后再对字节码文件进一步分析

源代码

  1. public class test {
  2. private static int classV =2;
  3. public static void main(String[] args) {
  4. classV =200;
  5. int localV =4;
  6. localV =400;
  7. }
  8. }

二进制 idea bin_ed插件查看。

浅谈javap命令拆解字节码文件

看不懂 那就使用人能看的懂的汇编语言查看类文件结构和代码指令。

javap 指令和选项

浅谈javap命令拆解字节码文件

0:无选项

  1. 打印package, protected and public fields, and methods
  2. public class com.example.test {
  3. public com.example.test();
  4. public static void main(java.lang.String[]);
  5. static {};
  6. }

1:辅助指令

-help –help -?

2:代码行号和方法的局部变量表

-l

  1. public class com.example.test {
  2.  
  3. //默认构造方法
  4. public com.example.test();
  5. //代码行号:命令偏移位置
  6. LineNumberTable:
  7. line 3: 0
  8. //局部变量表
  9. LocalVariableTable:
  10. Start Length Slot Name Signature
  11. 0 5 0 this Lcom/example/test;
  12.  
  13. public static void main(java.lang.String[]);
  14. //代码行号:命令偏移位置
  15. LineNumberTable:
  16. line 6: 0
  17. line 7: 6
  18. line 8: 8
  19. line 9: 12
  20. //局部变量表
  21. LocalVariableTable:
  22. Start Length Slot Name Signature
  23. 0 13 0 args [Ljava/lang/String; //方法参数
  24. 8 5 1 localV I。/局部变量localV
  25.  
  26. //静态代码块
  27. static {};
  28. LineNumberTable:
  29. line 4: 0
  30. }

3 用级别过滤方法 属性 类

-public -protected -private -p

浅谈javap命令拆解字节码文件

4.反汇编 出汇编指令

javap -c

  1. //纯汇编指令
  2. public class com.example.test {
  3. public com.example.test();
  4. Code:
  5. 0: aload_0
  6. 1: invokespecial #1 // Method java/lang/Object."<init>":()V
  7. 4: return
  8.  
  9. public static void main(java.lang.String[]);
  10. Code:
  11. 0: sipush 200
  12. 3: putstatic #2 // Field classV:I
  13. 6: iconst_4
  14. 7: istore_1
  15. 8: sipush 400
  16. 11: istore_1
  17. 12: return
  18.  
  19. static {};
  20. Code:
  21. 0: iconst_2
  22. 1: putstatic #2 // Field classV:I
  23. 4: return
  24. }

5 显示verbose详细信息

javap -v

  1. Classfile /Users/zhangshanxue/Downloads/akka-quickstart-java/target/classes/com/example/test.class
  2. //javap -sysinfo显示下面3行
  3. Last modified 2021-4-5; size 507 bytes
  4. MD5 checksum 24a0c74751aafd61d0f7f69be9c161db
  5. Compiled from "test.java"
  6. public class com.example.test
  7. //即1.8 对照表和原因见附录1
  8. //u2类型 即每个占用两个字节
  9. minor version: 0
  10. major version: 52
  11. //类标志 见附录2
  12. //u2类型access_flags 通过位与表示多个权限
  13. flags: ACC_PUBLIC, ACC_SUPER
  14. //常量池。class文件结构重点
  15. //u2 2两个字节 表示数量
  16. //pool 常量池
  17. //constant_pool_count 和constant_pool[]表示为常量池中内容
  18. //后面大部分内容依赖此常量池
  19. Constant pool:
  20. #1 = Methodref #4.#22 // java/lang/Object."<init>":()V
  21. #2 = Fieldref #3.#23 // com/example/test.classV:I
  22. #3 = Class #24 // com/example/test
  23. #4 = Class #25 // java/lang/Object
  24. #5 = Utf8 classV
  25. #6 = Utf8 I
  26. #7 = Utf8 <init>
  27. #8 = Utf8 ()V
  28. #9 = Utf8 Code
  29. #10 = Utf8 LineNumberTable
  30. #11 = Utf8 LocalVariableTable
  31. #12 = Utf8 this
  32. #13 = Utf8 Lcom/example/test;
  33. #14 = Utf8 main
  34. #15 = Utf8 ([Ljava/lang/String;)V
  35. #16 = Utf8 args
  36. #17 = Utf8 [Ljava/lang/String;
  37. #18 = Utf8 localV
  38. #19 = Utf8 <clinit>
  39. #20 = Utf8 SourceFile
  40. #21 = Utf8 test.java
  41. #22 = NameAndType #7:#8 // "<init>":()V
  42. #23 = NameAndType #5:#6 // classV:I
  43. #24 = Utf8 com/example/test
  44. #25 = Utf8 java/lang/Object
  45. {
  46. public com.example.test();
  47. descriptor: ()V
  48. flags: ACC_PUBLIC
  49. Code:
  50. //代码汇编指令
  51. stack=1, locals=1, args_size=1
  52. 0: aload_0
  53. 1: invokespecial #1 // Method java/lang/Object."<init>":()V
  54. 4: return
  55. //Javap -l显示下面信息
  56. //行号和上面对应的指令偏移位置
  57. LineNumberTable:
  58. line 3: 0
  59. LocalVariableTable:
  60. //局部变量表 在指令偏移位置start start+length之间有效
  61. Start Length Slot Name Signature
  62. 0 5 0 this Lcom/example/test;
  63.  
  64. public static void main(java.lang.String[]);
  65. descriptor: ([Ljava/lang/String;)V
  66. flags: ACC_PUBLIC, ACC_STATIC
  67. Code:
  68. //代码汇编指令
  69. stack=1, locals=2, args_size=1
  70. 0: sipush 200
  71. 3: putstatic #2 // Field classV:I
  72. 6: iconst_4
  73. 7: istore_1
  74. 8: sipush 400
  75. 11: istore_1
  76. 12: return
  77. //Javap -l显示下面信息
  78. //行号和上面对应的指令偏移位置
  79. LineNumberTable:
  80. line 6: 0
  81. line 7: 6
  82. line 8: 8
  83. line 9: 12
  84. LocalVariableTable:
  85. Start Length Slot Name Signature
  86. 0 13 0 args [Ljava/lang/String;
  87. 8 5 1 localV I
  88.  
  89. static {};
  90. descriptor: ()V
  91. flags: ACC_STATIC
  92. Code:
  93. stack=1, locals=0, args_size=0
  94. 0: iconst_2
  95. 1: putstatic #2 // Field classV:I
  96. 4: return
  97. //行号和上面对应的指令偏移位置
  98. LineNumberTable:
  99. line 4: 0
  100. }

附录1

1.1从45开始因为正式发布之前可能 其他版本号可能已经被用了 1.5改为5.0 也是差不多原因 为了表示重要性更名

浅谈javap命令拆解字节码文件

Corresponding major version 指定版本 和"Supported major versions"兼容范围

附录2

浅谈javap命令拆解字节码文件

附录3

直接分析字节码块

1为了方便交流表达class文件的结构

使用u1 u2 u4 u8无符号数表示字节数使用*_info 结尾表示池(数组cp_info、field_info、method_info、attribute_info

  1. ClassFile {
  2. //表示java class的文件格式 固定为cafe baby 4个字节
  3. u4 magic;
  4. //主版本号和次版本号共同决定了类文件格式的版本
  5. //u2类型 即每个占用两个字节
  6. //56包含56以后support for N.0 and N.65535
  7. u2 minor_version;
  8. //主版本号56(java12)之前 minjor只支持0
  9. u2 major_version;
  10. //常量池数量
  11. u2 constant_pool_count;
  12. cp_info constant_pool[constant_pool_count-1];
  13. u2 access_flags;
  14. //this_class、super_class、interfaces指向常量池的CONSTANT_Class_info
  15. u2 this_class;
  16. u2 super_class;
  17. u2 interfaces_count;
  18. u2 interfaces[interfaces_count];
  19. u2 fields_count;
  20. //指向常量池structures:CONSTANT_Fieldref_info 结构
  21. field_info fields[fields_count];
  22. u2 methods_count;
  23. //指向常量池CONSTANT_Methodref_info 结构
  24. method_info methods[methods_count];
  25. u2 attributes_count;
  26. attribute_info attributes[attributes_count];
  27. }

附录4

常量池字节码结构和常量池结构部分对应关系

浅谈javap命令拆解字节码文件

以上就是拆解字节码文件javap命令的详细内容,更多关于拆解字节码文件javap命令的资料请关注服务器之家其它相关文章!

原文链接:https://blog.csdn.net/zt011052/article/details/115445687

延伸 · 阅读

精彩推荐