
PEB WALK 없이 DLL 베이스 주소 찾기
이 Rust 라이브러리 및 CLI 도구는 PEB(Process Environment Block) 워킹을 사용하지 않고 로드된 DLL의 베이스 주소를 찾는 대체 방법을 보여줍니다. 이 기법은 PEB 워킹이 탐지되거나 차단될 수 있는 시나리오에서 특히 유용합니다.
이 저장소에는 서로 다른 접근 방식을 가진 두 개의 브랜치가 있습니다:
winapi 크레이트와 VirtualQuery를 사용합니다lib.rs)는 깔끔한 통합을 위해 print 문이 없습니다main.rs)는 개념 증명을 위한 디버그 출력을 포함합니다VirtualQuery 대신 예외 처리를 사용한 직접 메모리 접근 방식두 브랜치 모두 사용해도 안전하지만, OPSEC 브랜치는 API 호출이 모니터링되거나 차단될 수 있는 시나리오에서 추가적인 작전 보안 이점을 제공합니다.
이 프로그램은 스택 워킹 방식을 사용하여 다음과 같이 DLL을 찾습니다:
TEB(Thread Environment Block) 접근:
스택 워킹:
VirtualQuery를 사용합니다모듈 식별:
검증:
DLL을 찾는 전통적인 방법은 종종 PEB의 모듈 목록을 워킹하는 것을 포함합니다. 효과적이지만 이 방식은 다음과 같은 문제가 있을 수 있습니다:
이 스택 워킹 방식은 다음과 같은 대안을 제공합니다:
winapi 크레이트Cargo.toml에 추가하세요:
메인 브랜치:
[dependencies]
moonwalk = { git = "https://github.com/Teach2Breach/moonwalk.git" }
OPSEC 브랜치:
[dependencies]
moonwalk = { git = "https://github.com/Teach2Breach/moonwalk.git", branch = "opsec" }
코드에서의 사용 예시:
use moonwalk::find_dll_base;
fn main() {
// Find ntdll.dll
if let Some(ntdll_base) = find_dll_base("ntdll.dll") {
println!("ntdll.dll base: 0x{:X}", ntdll_base);
}
// Case-insensitive, .dll extension optional
if let Some(kernel32_base) = find_dll_base("KeRNEl32") {
println!("kernel32.dll base: 0x{:X}", kernel32_base);
}
}
빌드:
cargo build --release
실행:
# Find ntdll.dll (default)
cargo run --release
# Find specific DLL (case insensitive, .dll extension optional)
cargo run --release kernel32.dll
cargo run --release KeRNEl32
cargo run --release USER32
print 문은 더 이상 포함되지 않습니다. 이 이미지는 교육 목적으로 포함되었습니다.

VirtualQuery를 사용합니다