
Generate Proxy DLLs in Rust
cargo install rustdllproxy
이 크레이트는 현재 표준 DLL PE 형식만 지원합니다.
Rustdllproxy는 두 가지 하위 명령어를 제공합니다:
| 명령어 | 용도 |
|---|---|
rustdllproxy new | 하나 이상의 기존 DLL에서 새 프록시 cdylib 크레이트를 생성합니다. |
rustdllproxy build | .def 파일을 src/lib.rs와 동기화하고 크레이트를 빌드합니다. |
rustdllproxy --help # 최상위 도움말
rustdllproxy new --help # 생성 플래그
rustdllproxy build --help # 빌드 플래그
크레이트를 생성하기 전에 프록시가 어떻게 동작하길 원하는지 결정하세요. 일반적인 패턴은 검색 순서 하이재킹(search order hijacking)입니다. 이 경우 먼저 대상 DLL의 이름을 target_.dll 같은 이름으로 바꾼 다음 컴파일된 프록시를 target.dll로 사용합니다. 이렇게 하면 binary -> target.dll -> target_.dll 흐름이 만들어집니다.
사용 사례에 따라 여러 가지 방법이 있습니다. 그러나 프록시 대상이 되는 기본 DLL의 이름을 바꿔야 한다면 생성된 .def 파일을 그에 맞게 업데이트하세요.
rustdllproxy new -p path/to/target_.dll -n my_proxy
팁: rustdllproxy는 clap으로 빌드된 CLI입니다. 모든 옵션과 플래그를 보려면 rustdllproxy --help를 실행하세요.
매크로 라이브러리는 prehook, posthook, fullhook의 세 가지 주요 후크 유형을 지원합니다.
#[no_mangle] 지시문을 후크 매크로로 바꾸세요. (//<dllname>.dll 끝 주석은 그대로 두세요)
#[prehook("dllbeingproxied.dll", "function_name")] //dllbeingproxied.dll
함수 시그니처를 작성하세요. (입력을 수정하려면 mut로 선언하세요)
rustdllproxy build로 빌드하세요.
prehook원본 함수 이전에 코드를 실행합니다. 기능을 추가하거나 입력 변수를 수정할 수 있습니다.
#[prehook("target.dll", "my_function")] //target.dll
fn my_function(mut param1: i32, mut param2: &str) {
// Your code here - executes before original function
param1 *= 2; // Modify parameters if needed
}
posthook원본 함수 이후에 코드를 실행합니다. 매직 ret 변수를 사용하여 반환 값을 확인하고 수정합니다.
#[posthook("target.dll", "calculate")] //target.dll
fn calculate(input: i32) -> i32 {
// Original function executes first
// Then your code runs with access to 'ret'
ret = ret * 2; // Modify return value
}
참고:
ret변수는 자동으로 가변(mutable)으로 정의됩니다. 필요하지 않으면 참조할 필요가 없습니다.
fullhook함수 실행에 대한 완전한 제어를 제공합니다. 반환 값과 함수 호출을 수동으로 관리합니다.
#[fullhook("target.dll", "do_multi_add")] //target.dll
fn do_multi_add(mut a: i32, mut b: i32, mut c: i32) -> i32 {
// Pre-processing
a += 10;
b += 20;
// Call original function with magic func()
let mut return_value: i32 = func(a, b, c);
// Post-processing
return_value *= 2;
// Must explicitly return the value
return_value
}
프록시 크레이트 디렉터리에서 실행하세요. (또는 첫 번째 인자로 전달하세요):
rustdllproxy build [PATH] [--profile <name>] [--no-build] [-- <extra cargo args>]
.def 파일은 빌드할 때마다 완전히 다시 생성되므로 수동 변경 사항은 덮어써집니다. rustdllproxy가 빌드하는 방식을 수동으로 변경해야 한다면 cargo를 사용하여 이를 수행할 수 있습니다.DLL 검색 순서 하이재킹을 통해 오피스 소프트웨어에서 사용되는 office.dll을 수정하려고 한다고 가정해 보겠습니다:
# 원본 DLL 이름 변경
mv office.dll office_.dll
rustdllproxy new -p office_.dll -n office_proxy
#[prehook("office_.dll", "open_window")] //office_.dll
fn open_window() {
// Your custom code here...
println!("Window is about to open!");
}
cd office_proxy
rustdllproxy build
빌드 파일은
/target아래에 있습니다.
단일 크레이트로 여러 대상 DLL을 프록시할 수 있습니다. 이 기능은 거의 사용되지 않으며 몇 가지 중요한 주의 사항이 있습니다.
여러 DLL을 번들링하는 경우:
릴리스 노트는 CHANGELOG.md에 있습니다.
기여를 환영합니다! 이슈와 풀 리퀘스트를 자유롭게 제출해 주세요.
| 플래그 | 기본값 | 효과 |
|---|
PATH | . | 프록시 크레이트 루트 경로. |
--profile <name> | release | Cargo 빌드 프로필 (release, dev, 사용자 지정). |
--no-build | off | .def 파일을 다시 생성하지만 cargo build는 건너뜁니다. |
-- <args> | — | cargo build에 그대로 전달됩니다. |