mirror of
https://github.com/bitdefender/bddisasm.git
synced 2025-01-03 20:00:54 +00:00
Move rsbddisasm to the bindings directory
This commit is contained in:
parent
af3d23e3ff
commit
584150cb44
10
.github/workflows/rust.yml
vendored
10
.github/workflows/rust.yml
vendored
@ -24,16 +24,16 @@ jobs:
|
|||||||
run: echo "LIBCLANG_PATH=$((gcm clang).source -replace "clang.exe")" >> $env:GITHUB_ENV
|
run: echo "LIBCLANG_PATH=$((gcm clang).source -replace "clang.exe")" >> $env:GITHUB_ENV
|
||||||
if: matrix.os == 'windows-latest'
|
if: matrix.os == 'windows-latest'
|
||||||
- name: Debug Build
|
- name: Debug Build
|
||||||
run: cargo build --verbose --manifest-path rsbddisasm/Cargo.toml
|
run: cargo build --verbose --manifest-path bindings/rsbddisasm/Cargo.toml
|
||||||
- name: Release build
|
- name: Release build
|
||||||
run: cargo build --release --verbose --manifest-path rsbddisasm/Cargo.toml
|
run: cargo build --release --verbose --manifest-path bindings/rsbddisasm/Cargo.toml
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
run: cargo test --verbose --manifest-path rsbddisasm/Cargo.toml
|
run: cargo test --verbose --manifest-path bindings/rsbddisasm/Cargo.toml
|
||||||
- name: Run clippy
|
- name: Run clippy
|
||||||
run: cargo clippy --manifest-path rsbddisasm/Cargo.toml
|
run: cargo clippy --manifest-path bindings/rsbddisasm/Cargo.toml
|
||||||
- name: Run format checks
|
- name: Run format checks
|
||||||
run: |
|
run: |
|
||||||
cd rsbddisasm
|
cd bindings/rsbddisasm
|
||||||
cargo fmt -- --check
|
cargo fmt -- --check
|
||||||
cd ..
|
cd ..
|
||||||
|
|
||||||
|
4
.gitignore
vendored
4
.gitignore
vendored
@ -64,6 +64,6 @@ libbddisasm.pc
|
|||||||
build/
|
build/
|
||||||
.vscode
|
.vscode
|
||||||
disasmtool_lix/_build
|
disasmtool_lix/_build
|
||||||
rsbddisasm/target
|
bindings/rsbddisasm/target
|
||||||
rsbddisasm/Cargo.lock
|
bindings/rsbddisasm/Cargo.lock
|
||||||
bindings/pybddisasm/pybddisasm.egg-info
|
bindings/pybddisasm/pybddisasm.egg-info
|
||||||
|
@ -12,7 +12,7 @@ This crate uses the [*-sys crate convention](https://doc.rust-lang.org/cargo/ref
|
|||||||
|
|
||||||
### bddisasm
|
### bddisasm
|
||||||
|
|
||||||
This crate aims to offer a higher-level interface over [bddisasm-sys](#bddisasm-sys). It is currently held back by the fact that I don't really know Rust.
|
This crate aims to offer a higher-level interface over [bddisasm-sys](#bddisasm-sys).
|
||||||
|
|
||||||
Parts of it are auto-generated, with slight manual changes (for example, the `Mnemonic` enum and related functions).
|
Parts of it are auto-generated, with slight manual changes (for example, the `Mnemonic` enum and related functions).
|
||||||
|
|
||||||
@ -24,3 +24,5 @@ Parts of it are auto-generated, with slight manual changes (for example, the `Mn
|
|||||||
- [ ] more examples for `cpu_modes`
|
- [ ] more examples for `cpu_modes`
|
||||||
- [ ] an API to check if an instruction is supported with certain CPU modes on or off (currently a user has to manually check the `CpuModes` structure)
|
- [ ] an API to check if an instruction is supported with certain CPU modes on or off (currently a user has to manually check the `CpuModes` structure)
|
||||||
- [ ] implement `Display` for more types (especially those in `operand`)
|
- [ ] implement `Display` for more types (especially those in `operand`)
|
||||||
|
- [ ] remove the `bindgen` dev dependency? See [this issue](https://github.com/rust-lang/rust-bindgen/issues/918) as to why we may want to do that
|
||||||
|
- [ ] better directory structure
|
@ -6,6 +6,7 @@ edition = "2018"
|
|||||||
links = "bddisasm"
|
links = "bddisasm"
|
||||||
build = "build.rs"
|
build = "build.rs"
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
|
readme = "README.md"
|
||||||
repository = "https://github.com/bitdefender/bddisasm"
|
repository = "https://github.com/bitdefender/bddisasm"
|
||||||
documentation = "https://docs.rs/bddisasm-sys"
|
documentation = "https://docs.rs/bddisasm-sys"
|
||||||
description = """
|
description = """
|
1
bindings/rsbddisasm/bddisasm-sys/LICENSE
Symbolic link
1
bindings/rsbddisasm/bddisasm-sys/LICENSE
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../../../LICENSE
|
9
bindings/rsbddisasm/bddisasm-sys/README.md
Normal file
9
bindings/rsbddisasm/bddisasm-sys/README.md
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# bddisasm-sys
|
||||||
|
|
||||||
|
Rust bindings for [bddisasm](https://github.com/bitdefender/bddisasm).
|
||||||
|
|
||||||
|
See [bddisasm](https://crates.io/crates/bddisasm) if you're looking for a Rust wrapper for these bindings.
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
[bindgen](https://crates.io/crates/bindgen) is used to generate the bindings at build time. Because of this, users need to have `clang` installed. Check the [bindgen documentation](https://rust-lang.github.io/rust-bindgen/requirements.html) for more information.
|
1
bindings/rsbddisasm/bddisasm-sys/csrc/bddisasm
Symbolic link
1
bindings/rsbddisasm/bddisasm-sys/csrc/bddisasm
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../../../../bddisasm/
|
1
bindings/rsbddisasm/bddisasm-sys/csrc/inc
Symbolic link
1
bindings/rsbddisasm/bddisasm-sys/csrc/inc
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../../../../inc/
|
@ -2,6 +2,15 @@
|
|||||||
* Copyright (c) 2021 Bitdefender
|
* Copyright (c) 2021 Bitdefender
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
|
//! Rust bindings for [bddisasm](https://github.com/bitdefender/bddisasm).
|
||||||
|
//!
|
||||||
|
//! See [bddisasm](https://crates.io/crates/bddisasm) if you're looking for a Rust wrapper for these bindings.
|
||||||
|
//!
|
||||||
|
//! # Requirements
|
||||||
|
//!
|
||||||
|
//! [bindgen](https://crates.io/crates/bindgen) is used to generate the bindings at build time. Because of this, users
|
||||||
|
//! need to have `clang` installed.
|
||||||
|
//! Check the [bindgen documentation](https://rust-lang.github.io/rust-bindgen/requirements.html) for more information.
|
||||||
#![allow(non_camel_case_types)]
|
#![allow(non_camel_case_types)]
|
||||||
#![allow(non_snake_case)]
|
#![allow(non_snake_case)]
|
||||||
#![allow(non_upper_case_globals)]
|
#![allow(non_upper_case_globals)]
|
136
bindings/rsbddisasm/bddisasm/README.md
Normal file
136
bindings/rsbddisasm/bddisasm/README.md
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
# bddisasm
|
||||||
|
|
||||||
|
Rust bindings for the [bddisasm](https://github.com/bitdefender/bddisasm) x86/x64 decoder library, built on top
|
||||||
|
of [bddisasm-sys](https://crates.io/crates/bddisasm-sys).
|
||||||
|
|
||||||
|
It supports all existing x86 instruction, offering a wide range of information about each one, including:
|
||||||
|
|
||||||
|
- operands (implicit and explicit)
|
||||||
|
- access mode for each operand
|
||||||
|
- CPUID feature flags
|
||||||
|
- CPU modes in which an instruction is valid
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Add `bddisasm` to your `Cargo.toml`:
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[dependencies]
|
||||||
|
bddisasm = "0.1.0"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
### Decoding one instruction
|
||||||
|
|
||||||
|
```rust
|
||||||
|
use bddisasm::decoded_instruction::{DecodedInstruction, DecodeMode, Mnemonic};
|
||||||
|
|
||||||
|
let code = vec![0x31, 0xc0];
|
||||||
|
match DecodedInstruction::decode(&code, DecodeMode::Bits32) {
|
||||||
|
Ok(ins) => {
|
||||||
|
assert_eq!(ins.mnemonic(), Mnemonic::Xor);
|
||||||
|
println!("{}", ins);
|
||||||
|
},
|
||||||
|
Err(err) => println!("Unable to decode: {}", err),
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Decoding multiple instructions
|
||||||
|
|
||||||
|
```rust
|
||||||
|
use bddisasm::decoder::{Decoder, DecodeMode};
|
||||||
|
|
||||||
|
let code = [
|
||||||
|
// ENCLS
|
||||||
|
0x0f, 0x01, 0xcf,
|
||||||
|
// MOV rax, qword ptr [rbx+rcx*4+0x1234]
|
||||||
|
0x48, 0x8b, 0x84, 0x8b, 0x34, 0x12, 0x00, 0x00,
|
||||||
|
// Not a valid instruction
|
||||||
|
0x0f,
|
||||||
|
// WRMSR
|
||||||
|
0x0f, 0x30,
|
||||||
|
];
|
||||||
|
let decoder = Decoder::new(&code, DecodeMode::Bits64, 0x1234);
|
||||||
|
|
||||||
|
for ins in decoder {
|
||||||
|
match ins {
|
||||||
|
Ok(ins) => println!("{}", ins),
|
||||||
|
Err(e) => println!("{}", e),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
This will print:
|
||||||
|
|
||||||
|
```text
|
||||||
|
ENCLS
|
||||||
|
MOV rax, qword ptr [rbx+rcx*4+0x1234]
|
||||||
|
the provided input buffer is too small
|
||||||
|
WRMSR
|
||||||
|
```
|
||||||
|
|
||||||
|
### Working with instruction operands
|
||||||
|
|
||||||
|
Rich informaion is offered for each type of operand. Bellow is a minimal example that looks at a memory operand.
|
||||||
|
|
||||||
|
```rust
|
||||||
|
# use bddisasm::decode_error::DecodeError;
|
||||||
|
# fn test() -> Result<(), DecodeError> {
|
||||||
|
use bddisasm::decoded_instruction::{DecodedInstruction, DecodeMode};
|
||||||
|
use bddisasm::operand::OpInfo;
|
||||||
|
|
||||||
|
// ` MOV rax, qword ptr [rcx+r15*2]`
|
||||||
|
let code = b"\x4a\x8b\x04\x79";
|
||||||
|
let ins = DecodedInstruction::decode(code, DecodeMode::Bits64).unwrap();
|
||||||
|
// Get the operands
|
||||||
|
let operands = ins.operands();
|
||||||
|
// Get the second operand which is the source (`[rcx+r15*2]`)
|
||||||
|
let src = operands[1];
|
||||||
|
|
||||||
|
println!("Source operand type: {}", src.info);
|
||||||
|
match src.info {
|
||||||
|
OpInfo::Mem(mem) => {
|
||||||
|
if let Some(base) = mem.base {
|
||||||
|
println!("Base register: {}", base);
|
||||||
|
} else {
|
||||||
|
println!("No base register");
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(index) = mem.index {
|
||||||
|
println!("Index register: {}", index);
|
||||||
|
} else {
|
||||||
|
println!("No index register");
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(scale) = mem.scale {
|
||||||
|
println!("Scale: {}", scale);
|
||||||
|
} else {
|
||||||
|
println!("No scale");
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(displacement) = mem.disp {
|
||||||
|
println!("Displacement: {}", displacement);
|
||||||
|
} else {
|
||||||
|
println!("No displacement");
|
||||||
|
}
|
||||||
|
},
|
||||||
|
_ => unreachable!(),
|
||||||
|
}
|
||||||
|
# Ok(())
|
||||||
|
# }
|
||||||
|
```
|
||||||
|
|
||||||
|
Will print:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Source operand type: memory
|
||||||
|
Base register: 1
|
||||||
|
Index register: 15
|
||||||
|
Scale: 2
|
||||||
|
No displacement
|
||||||
|
```
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
Because [bddisasm-sys](https://crates.io/crates/bddisasm-sys) uses [bindgen](https://crates.io/crates/bindgen) to generate the bindings at build time, users need to have `clang` installed. Check the [bindgen documentation](https://rust-lang.github.io/rust-bindgen/requirements.html) for more information.
|
@ -4,7 +4,9 @@
|
|||||||
*/
|
*/
|
||||||
//! bddisasm x86/x64 instruction decoder
|
//! bddisasm x86/x64 instruction decoder
|
||||||
//!
|
//!
|
||||||
//! This crate contains bindings for the [bddisasm](https://github.com/bitdefender/bddisasm) x86/x64 decoder library.
|
//! Rust bindings for the [bddisasm](https://github.com/bitdefender/bddisasm) x86/x64 decoder library, built on top
|
||||||
|
//! of [bddisasm-sys](https://crates.io/crates/bddisasm-sys).
|
||||||
|
//!
|
||||||
//! It supports all existing x86 instruction, offering a wide range of information about each one, including:
|
//! It supports all existing x86 instruction, offering a wide range of information about each one, including:
|
||||||
//!
|
//!
|
||||||
//! - operands (implicit and explicit)
|
//! - operands (implicit and explicit)
|
@ -1 +0,0 @@
|
|||||||
../../LICENSE
|
|
@ -1 +0,0 @@
|
|||||||
../../../bddisasm
|
|
@ -1 +0,0 @@
|
|||||||
../../../inc
|
|
Loading…
Reference in New Issue
Block a user