vova7878/DexFile
GitHub: vova7878/DexFile
一个用于读取、生成和修改Android DEX文件的现代Java库,采用类似JDK Class-File API的流式设计。
Stars: 27 | Forks: 2

[](https://github.com/vova7878/DexFile/blob/main/LICENSE)
# 关于
该库旨在用于读取、生成、修改和写入 dex 文件。其设计主要灵感来源于 JDK 22 中引入的 [Class-File API](https://openjdk.org/jeps/484)
### 安装
```
dependencies {
implementation("io.github.vova7878:DexFile:")
}
```
### 示例
这是一个简单的 [BrainFuck](https://brainfuck.org/brainfuck.html) 语言到 dex 格式的编译器
```
public static byte[] compile(int tape_length, String bf) {
var impl_name = "com.v7878.bf.Main";
var impl_id = TypeId.ofName(impl_name);
var system_id = TypeId.of(System.class);
var print_stream_id = TypeId.of(PrintStream.class);
var system_out_id = FieldId.of(system_id, "out", print_stream_id);
var system_write_id = MethodId.of(print_stream_id, "print", TypeId.V, TypeId.C);
var input_stream_id = TypeId.of(InputStream.class);
var system_in_id = FieldId.of(system_id, "in", input_stream_id);
var system_read_id = MethodId.of(input_stream_id, "read", TypeId.I);
var write_byte_id = MethodId.of(impl_id, "write", TypeId.V, TypeId.B);
var read_byte_id = MethodId.of(impl_id, "read", TypeId.B);
var impl_def = ClassBuilder.build(impl_id, cb -> cb
.withSuperClass(TypeId.OBJECT)
.withFlags(ACC_PUBLIC | ACC_FINAL)
.withMethod(mb -> mb
.of(write_byte_id)
.withFlags(ACC_PRIVATE | ACC_STATIC)
.withCode(/* locals */ 1, ib -> {
ib.generate_lines();
int field_reg = ib.l(0);
ib.sget(field_reg, system_out_id);
ib.invoke(VIRTUAL, system_write_id, field_reg, ib.p(0));
ib.return_void();
})
)
.withMethod(mb -> mb
.of(read_byte_id)
.withFlags(ACC_PRIVATE | ACC_STATIC)
.withCode(/* locals */ 2, ib -> {
ib.generate_lines();
int field_reg = ib.l(0);
ib.sget(field_reg, system_in_id);
ib.invoke(VIRTUAL, system_read_id, field_reg);
int data_reg = ib.l(1);
ib.move_result(data_reg);
ib.unop(INT_TO_BYTE, data_reg, data_reg);
ib.return_(data_reg);
})
)
.withMethod(mb -> mb
.withFlags(ACC_PUBLIC | ACC_STATIC)
.withName("main")
.withReturnType(TypeId.V)
.withParameterTypes(TypeId.of(String[].class))
.withCode(/* locals */ 3, ib -> {
ib.generate_lines();
int tape_reg = ib.l(0);
ib.const_(tape_reg, tape_length);
ib.new_array(tape_reg, tape_reg, TypeId.B.array());
ib.local(tape_reg, "tape", TypeId.B.array());
int index_reg = ib.l(1);
ib.const_(index_reg, /* start */ 0);
ib.local(index_reg, "index", TypeId.I);
int tmp_reg = ib.l(2);
ib.local(tmp_reg, "tmp", TypeId.I);
int depth = 0;
var labels = new LinkedList();
for (char op : bf.toCharArray()) {
switch (op) {
case '>' -> ib.binop_lit(ADD_INT, index_reg, index_reg, 1);
case '<' -> ib.binop_lit(ADD_INT, index_reg, index_reg, -1);
case '+' -> {
ib.aget('B', tmp_reg, tape_reg, index_reg);
ib.binop_lit(ADD_INT, tmp_reg, tmp_reg, 1);
ib.aput('B', tmp_reg, tape_reg, index_reg);
}
case '-' -> {
ib.aget('B', tmp_reg, tape_reg, index_reg);
ib.binop_lit(ADD_INT, tmp_reg, tmp_reg, -1);
ib.aput('B', tmp_reg, tape_reg, index_reg);
}
case '.' -> {
ib.aget('B', tmp_reg, tape_reg, index_reg);
ib.invoke(STATIC, write_byte_id, tmp_reg);
}
case ',' -> {
ib.invoke(STATIC, read_byte_id);
ib.move_result(tmp_reg);
ib.aput('B', tmp_reg, tape_reg, index_reg);
}
case '[' -> {
labels.add(depth);
int open_depth = depth++;
ib.label("label_open_" + open_depth);
ib.aget('B', tmp_reg, tape_reg, index_reg);
ib.if_testz(EQ, tmp_reg, "label_close_" + open_depth);
}
case ']' -> {
int close_depth = labels.pollLast();
ib.goto_("label_open_" + close_depth);
ib.label("label_close_" + close_depth);
}
default -> { /* nop */ }
}
}
ib.return_void();
})
)
);
return DexIO.write(Dex.of(impl_def));
}
```
标签:Android安全, APP安全, Class-File API, Dalvik字节码, DEX文件, Java库, JDK 17, Malware Analysis, 云安全监控, 云资产清单, 代码混淆, 代码生成, 动态加载, 后台面板检测, 域名枚举, 字节码操作, 安卓开发, 渗透测试工具, 编程工具, 编译器, 远程代码执行, 逆向工程, 静态分析