Skip to content

Commit bc43043

Browse files
committed
first drivers winapi32
1 parent 2d255fe commit bc43043

File tree

7 files changed

+81
-4
lines changed

7 files changed

+81
-4
lines changed

crates/libmwemu/src/emu/loaders.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,6 @@ impl Emu {
100100
}
101101

102102
// 4. map pe and then sections
103-
log::info!("mapeando PE de {}", filename2);
104103
let pemap = self
105104
.maps
106105
.create_map(

crates/libmwemu/src/winapi/winapi32/kernel32/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -714,7 +714,7 @@ pub fn load_library(emu: &mut emu::Emu, libname: &str) -> u64 {
714714
return 0;
715715
}
716716

717-
if !dll.ends_with(".dll") {
717+
if !dll.ends_with(".dll") && !dll.ends_with(".exe") {
718718
dll.push_str(".dll");
719719
}
720720

crates/libmwemu/src/winapi/winapi32/mod.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ mod user32;
1414
mod wincrt;
1515
mod wininet;
1616
mod ws2_32;
17+
mod ntoskrnl;
1718

1819
use crate::emu;
1920

@@ -37,11 +38,13 @@ pub fn gateway(addr: u32, name: &str, emu: &mut emu::Emu) {
3738
"iphlpapi.text" => iphlpapi::gateway(addr, emu),
3839
"libgcc_s_dw2-1.text" => libgcc::gateway(addr, emu),
3940
"api-ms-win-crt-runtime-l1-1-0.text" => wincrt::gateway(addr, emu),
41+
"ntoskrnl.text" => ntoskrnl::gateway(addr, emu),
42+
"ntoskrnlPAGE" => ntoskrnl::gateway(addr, emu),
4043
"not_loaded" => {
4144
// TODO: banzai check?
4245
emu.pe32.as_ref().unwrap().import_addr_to_name(addr)
4346
}
44-
_ => panic!("/!\\ trying to execute on {} at 0x{:x}", name, addr),
47+
_ => panic!("/!\\ winapi32 gateway: trying to execute on {} at 0x{:x}", name, addr),
4548
};
4649
emu.call_stack_mut().pop();
4750
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
use crate::emu;
2+
use crate::serialization;
3+
//use crate::winapi::helper;
4+
use crate::winapi::winapi32::kernel32;
5+
use crate::structures::UnicodeString;
6+
use crate::constants;
7+
8+
9+
pub fn gateway(addr: u32, emu: &mut emu::Emu) -> String {
10+
let api = kernel32::guess_api_name(emu, addr);
11+
match api.as_str() {
12+
"RtlInitUnicodeString" => RtlInitUnicodeString(emu),
13+
_ => {
14+
if emu.cfg.skip_unimplemented == false {
15+
if emu.cfg.dump_on_exit && emu.cfg.dump_filename.is_some() {
16+
serialization::Serialization::dump_to_file(
17+
&emu,
18+
emu.cfg.dump_filename.as_ref().unwrap(),
19+
);
20+
}
21+
22+
unimplemented!("atemmpt to call unimplemented API 0x{:x} {}", addr, api);
23+
}
24+
log::warn!(
25+
"calling unimplemented API 0x{:x} {} at 0x{:x}",
26+
addr,
27+
api,
28+
emu.regs().rip
29+
);
30+
return api;
31+
}
32+
}
33+
34+
String::new()
35+
}
36+
37+
38+
fn RtlInitUnicodeString(emu: &mut emu::Emu) {
39+
let dst_ptr = emu
40+
.maps
41+
.read_dword(emu.regs().get_esp())
42+
.expect("ntoskrnl!RtlInitUnicodeString: error reading arg1 (dst_ptr)") as u64;
43+
let src_ptr = emu
44+
.maps
45+
.read_dword(emu.regs().get_esp()+4)
46+
.expect("ntoskrnl!RtlInitUnicodeString: error reading optional arg2 (src_ptr)") as u64;
47+
48+
if !emu.maps.is_mapped(dst_ptr) {
49+
log_red!(emu, "ntoskrnl!RtlInitUnicodeString worng destination pointer 0x{:x}", dst_ptr);
50+
panic!();
51+
}
52+
53+
let mut s = "".to_string();
54+
let ustr;
55+
56+
if src_ptr > 0 && emu.maps.is_mapped(src_ptr) {
57+
ustr = UnicodeString::load(src_ptr, &emu.maps);
58+
if emu.maps.is_mapped(ustr.buffer as u64) {
59+
s = emu.maps.read_wide_string(ustr.buffer as u64);
60+
} else {
61+
log_red!(emu, "ntoskrnl!RtlInitUnicodeString ustr.buffer is not ok: 0x{:x}", ustr.buffer);
62+
}
63+
} else {
64+
ustr = UnicodeString::new();
65+
}
66+
67+
ustr.save(dst_ptr, &mut emu.maps);
68+
69+
log_red!(emu, "ntoskrnl!RtlInitUnicodeString dst: 0x{:x} str:'{}' src: 0x{:x}", dst_ptr, s, src_ptr);
70+
71+
emu.stack_pop32(false);
72+
emu.stack_pop32(false);
73+
74+
emu.regs_mut().rax = constants::STATUS_SUCCESS;
75+
}

crates/libmwemu/src/winapi/winapi64/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ pub fn gateway(addr: u64, name: &str, emu: &mut emu::Emu) {
4848
// TODO: banzai check?
4949
emu.pe64.as_ref().unwrap().import_addr_to_name(addr)
5050
}
51-
_ => panic!("/!\\ trying to execute on {} at 0x{:x}", name, addr),
51+
_ => panic!("/!\\ winapi64 gateway: trying to execute on {} at 0x{:x}", name, addr),
5252
};
5353

5454
emu.call_stack_mut().pop();

maps/maps32/ntoskrnl.exe

2.09 MB
Binary file not shown.

maps/maps64/ntoskrnl.exe

12.1 MB
Binary file not shown.

0 commit comments

Comments
 (0)