# binary_editor
**Repository Path**: guo-dingyi/binary_editor
## Basic Information
- **Project Name**: binary_editor
- **Description**: binary_editor 是一个用Python编写的脚本,能够方便地将字节码文件转换为可编辑的字节显示为十六进制数文件,和够将这个十六进制文件编译为字节码文件。
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2024-05-31
- **Last Updated**: 2024-06-12
## Categories & Tags
**Categories**: Uncategorized
**Tags**: Python
## README
# binary_editor
#### 介绍
binary_editor 是一个用Python编写的脚本,能够方便地将字节码文件转换为可编辑的字节显示为十六进制数文件,和够将这个十六进制文件重新编译为字节码文件。
binary_editor 的诞生源自我在学习Java字节码文件的过程中,心血来潮,动了直接编辑字节码文件的心思,但由于字节码文件无法直接编辑,因此我开发了这个脚本。
#### 安装教程
把binary_editor.py clone 到本地
#### 使用介绍

该脚本有三个参数,分别是op、src、tar
```
--op OP option
--src SRC source file
--tar TAR target file
```
其中src是要转换的原文件,tar是要输出的目标文件。
而参数op则是转换模式,有四个可选的模式,分别是p、c、pa、ca
p:将字节码文件转变为可编辑的十六进制文件;
```
python binary_editor.py --op p --src .\source\file --tar .\target\file
```
c:将可编辑十六进制文件编译为字节码文件;
```
python binary_editor.py --op c --src .\source\file --tar .\target\file
```
pa:和p同理,将字节码文件转变为可编辑的十六进制文件,只不过pa将字节大于33并且小于126转换为对应的ascii码字符;
```
python binary_editor.py --op pa --src .\source\file --tar .\target\file
```
ca:和c同理,将可编辑十六进制码文件编译为字节码文件,只不过ca能允许十六进制文件有能用ascii码表示的字符;
```
python binary_editor.py --op ca --src .\source\file --tar .\target\file
```
#### 使用案例
1.以java的字节码为例,先写一个简单的java程序编译成class字节码文件
```java
import java.io.PrintStream;
public class Hello{
public static void main(String... arguments){
String s = "Hello World!";
PrintStream ps = System.out;
ps.println(s);
}
}
```
2.编译后运行测试,没有问题,输出Hello World!
```commandline
PS D:\python\python_project\binary_editor\java> javac Hello.java
PS D:\python\python_project\binary_editor\java> java Hello
Hello World!
```
3.使用binary_editor工具将Hello.class文件转为可编辑的字节显示为十六进制数文件,这里使用了pa模式
```commandline
PS D:\python\python_project\binary_editor\java> python ..\binary_editor.py --op pa --src .\Hello.class --tar .\Hello_Hex
```
4.打开Hello_Hex文件,可以看到Hello.class文件转变为可编辑的字节显示为十六进制数文件了
```
ca fe ba be 00 00 00 = 00 1d 0a 00 02 00 03 07
00 04 0c 00 05 00 06 01 00 10 j a v a / l
a n g / O b j e c t 01 00 06 < i n
i t > 01 00 03 ( ) V 08 00 08 01 00 0c H
e l l o 20 W o r l d ! 09 00 0a 00 0b
07 00 0c 0c 00 0d 00 0e 01 00 10 j a v a /
l a n g / S y s t e m 01 00 03 o u
t 01 00 15 L j a v a / i o / P r i
n t S t r e a m ; 0a 00 10 00 11 07 00
12 0c 00 13 00 14 01 00 13 j a v a / i o
/ P r i n t S t r e a m 01 00 07 p
r i n t l n 01 00 15 ( L j a v a /
l a n g / S t r i n g ; ) V 07 00
16 01 00 05 H e l l o 01 00 04 C o d e
01 00 0f L i n e N u m b e r T a b
l e 01 00 04 m a i n 01 00 16 ( [ L j
a v a / l a n g / S t r i n g ;
) V 01 00 0a S o u r c e F i l e 01
00 0a H e l l o . j a v a 00 ! 00 15
00 02 00 00 00 00 00 02 00 01 00 05 00 06 00 01
00 17 00 00 00 1d 00 01 00 01 00 00 00 05 * b7
00 01 b1 00 00 00 01 00 18 00 00 00 06 00 01 00
00 00 02 00 89 00 19 00 1a 00 01 00 17 00 00 00
1 00 02 00 03 00 00 00 0d 12 07 L b2 00 09 M
, + b6 00 0f b1 00 00 00 01 00 18 00 00 00 12
00 04 00 00 00 04 00 03 00 05 00 07 00 06 00 0c
00 07 00 01 00 1b 00 00 00 02 00 1c
```
5.尝试修改字节码,比如在这里我将程序名由Hello改为HelloPan,输出的字符串由"Hello World!",改为输出"Hi,Pan!"
```
ca fe ba be 00 00 00 = 00 1d 0a 00 02 00 03 07
00 04 0c 00 05 00 06 01 00 10 j a v a / l
a n g / O b j e c t 01 00 06 < i n
i t > 01 00 03 ( ) V 08 00 08 01 00 07 H i , P a n ! 09 00 0a 00 0b
07 00 0c 0c 00 0d 00 0e 01 00 10 j a v a /
l a n g / S y s t e m 01 00 03 o u
t 01 00 15 L j a v a / i o / P r i
n t S t r e a m ; 0a 00 10 00 11 07 00
12 0c 00 13 00 14 01 00 13 j a v a / i o
/ P r i n t S t r e a m 01 00 07 p
r i n t l n 01 00 15 ( L j a v a /
l a n g / S t r i n g ; ) V 07 00
16 01 00 08 H e l l o P a n 01 00 04 C o d e
01 00 0f L i n e N u m b e r T a b
l e 01 00 04 m a i n 01 00 16 ( [ L j
a v a / l a n g / S t r i n g ;
) V 01 00 0a S o u r c e F i l e 01
00 0d H e l l o P a n . j a v a 00 ! 00 15
00 02 00 00 00 00 00 02 00 01 00 05 00 06 00 01
00 17 00 00 00 1d 00 01 00 01 00 00 00 05 * b7
00 01 b1 00 00 00 01 00 18 00 00 00 06 00 01 00
00 00 02 00 89 00 19 00 1a 00 01 00 17 00 00 00
1 00 02 00 03 00 00 00 0d 12 07 L b2 00 09 M
, + b6 00 0f b1 00 00 00 01 00 18 00 00 00 12
00 04 00 00 00 04 00 03 00 05 00 07 00 06 00 0c
00 07 00 01 00 1b 00 00 00 02 00 1c
```
6.修改完成后即可将该十六进制文件重新编译为字节码文件,这里我为了演示方便已经将Hello_Hex的修改另存为Hello_Hex_Copy,并将其编译的字节码文件输出为HelloPan.class
```commandline
PS D:\python\python_project\binary_editor\java> python ..\binary_editor.py --op ca --src .\Hello_Hex_Copy --tar .\HelloPan.class
```
7.让jvm执行HelloPan.class 字节码文件,测试修改效果
```commandline
PS D:\python\python_project\binary_editor\java> java HelloPan
Hi,Pan!
```
可以看到这个HelloPan.class字节码文件是可以被jvm执行的,且能成功输出"Hi,Pan!",结果和预期一致,说明这次字节码修改成功了
#### 更新说明
- 2024.06.12: 新增注释功能,十六进制文件现支持使用双斜杠“//”进行单行注释。在将十六进制文件编译为字节码文件的过程中,该注释将会被自动忽略。
- ...
#### 参与贡献
#### 特技