Skip to content

Commit 9bb41e1

Browse files
committed
fixed getmodulehandle with null param
1 parent 4716332 commit 9bb41e1

File tree

5 files changed

+83
-52
lines changed

5 files changed

+83
-52
lines changed

crates/libmwemu/src/emu/loaders.rs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@ impl Emu {
1919
let mut pe32 = PE32::load(filename);
2020
let base: u32;
2121

22-
println!("loading pe32 {}", filename);
22+
log::info!("loading pe32 {}", filename);
2323

2424
/* .rsrc extraction tests
2525
if set_entry {
26-
println!("get_resource_by_id");
26+
log::info!("get_resource_by_id");
2727
pe32.get_resource(Some(3), Some(0), None, None);
2828
}*/
2929

@@ -97,12 +97,12 @@ impl Emu {
9797
);
9898
}
9999

100-
println!("base: 0x{:x}", base);
100+
log::info!("base: 0x{:x}", base);
101101
}
102102

103103

104104
// 4. map pe and then sections
105-
println!("mapeando PE de {}", filename2);
105+
log::info!("mapeando PE de {}", filename2);
106106
let pemap = self
107107
.maps
108108
.create_map(
@@ -247,7 +247,7 @@ impl Emu {
247247
self.regs().rip
248248
);
249249
}
250-
println!("base: 0x{:x}", base);
250+
log::info!("base: 0x{:x}", base);
251251
}
252252

253253
// 4. map pe and then sections
@@ -371,24 +371,23 @@ impl Emu {
371371
if text_addr == 0 {
372372
panic!(".text not found on this elf64");
373373
}
374-
log::info!("text_addr: 0x{:x}", text_addr);
375374

376375
// entry point logic:
377376

378377
// 1. Configured entry point
379378
if self.cfg.entry_point != constants::CFG_DEFAULT_BASE {
380-
println!("forcing entry point to 0x{:x}", self.cfg.entry_point);
379+
log::info!("forcing entry point to 0x{:x}", self.cfg.entry_point);
381380
self.regs_mut().rip = self.cfg.entry_point;
382381

383382
// 2. Entry point pointing inside .text
384383
} else if elf64.elf_hdr.e_entry >= text_addr && elf64.elf_hdr.e_entry < text_addr+text_sz {
385-
println!("Entry point pointing to .text 0x{:x}", elf64.elf_hdr.e_entry);
384+
log::info!("Entry point pointing to .text 0x{:x}", elf64.elf_hdr.e_entry);
386385
self.regs_mut().rip = elf64.elf_hdr.e_entry;
387386

388387
// 3. Entry point points above .text, relative entry point
389388
} else if elf64.elf_hdr.e_entry < text_addr {
390389
self.regs_mut().rip = elf64.elf_hdr.e_entry + elf64.base; //text_addr;
391-
println!("relative entry point: 0x{:x} fixed: 0x{:x}", elf64.elf_hdr.e_entry, self.regs().rip);
390+
log::info!("relative entry point: 0x{:x} fixed: 0x{:x}", elf64.elf_hdr.e_entry, self.regs().rip);
392391

393392
// 4. Entry point points below .text, weird case.
394393
} else {

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

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
use crate::emu;
2+
use crate::peb;
3+
use crate::constants;
24
use crate::winapi::helper;
35

46
pub fn GetModuleHandleA(emu: &mut emu::Emu) {
@@ -10,11 +12,30 @@ pub fn GetModuleHandleA(emu: &mut emu::Emu) {
1012
let mod_name: String;
1113

1214
if mod_name_ptr == 0 {
13-
mod_name = "self".to_string();
14-
emu.regs_mut().rax = match emu.maps.get_base() {
15-
Some(base) => base,
15+
16+
let caller_rip = emu.regs().rip;
17+
mod_name = match emu.maps.get_addr_name(caller_rip) {
18+
Some(n) => n,
19+
None => {
20+
log::info!("kernel32!GetModuleHandleA called from weird place 0x{:x}", caller_rip);
21+
constants::EXE_NAME
22+
}
23+
}.to_string();
24+
25+
let base = match peb::peb64::get_module_base(&mod_name, emu) {
26+
Some(b) => b,
1627
None => helper::handler_create(&mod_name),
17-
}
28+
};
29+
30+
log_red!(
31+
emu,
32+
"kernel32!GetModuleHandleA `{}` {:x}",
33+
mod_name,
34+
base
35+
);
36+
37+
emu.regs_mut().rax = base;
38+
1839
} else {
1940
mod_name = emu.maps.read_string(mod_name_ptr).to_lowercase();
2041
let mod_mem = match emu.maps.get_mem2(mod_name.as_str()) {
@@ -34,5 +55,6 @@ pub fn GetModuleHandleA(emu: &mut emu::Emu) {
3455
mod_name
3556
);
3657

58+
3759
emu.stack_pop32(false);
38-
}
60+
}
Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
use crate::emu;
2+
use crate::peb;
3+
use crate::constants;
24
use crate::winapi::helper;
35

46
pub fn GetModuleHandleW(emu: &mut emu::Emu) {
@@ -8,13 +10,16 @@ pub fn GetModuleHandleW(emu: &mut emu::Emu) {
810
.expect("kernel32!GetModuleHandleW cannot read mod_name_ptr") as u64;
911

1012
let mod_name: String;
13+
let base;
1114

1215
if mod_name_ptr == 0 {
13-
mod_name = "self".to_string();
14-
emu.regs_mut().rax = match emu.maps.get_base() {
15-
Some(base) => base,
16+
17+
mod_name = constants::EXE_NAME.to_string();
18+
base = match peb::peb64::get_module_base(&mod_name, emu) {
19+
Some(b) => b,
1620
None => helper::handler_create(&mod_name),
17-
}
21+
};
22+
1823
} else {
1924
mod_name = emu.maps.read_wide_string(mod_name_ptr).to_lowercase();
2025
let mod_mem = match emu.maps.get_mem2(&mod_name) {
@@ -24,14 +29,17 @@ pub fn GetModuleHandleW(emu: &mut emu::Emu) {
2429
return;
2530
}
2631
};
27-
emu.regs_mut().rax = mod_mem.get_base();
32+
base = mod_mem.get_base();
2833
}
2934

3035
log_red!(
3136
emu,
32-
"kernel32!GetModuleHandleW '{}'",
33-
mod_name
37+
"kernel32!GetModuleHandleW '{}' 0x{:x}",
38+
mod_name,
39+
base
3440
);
3541

42+
emu.regs_mut().rax = base;
43+
3644
emu.stack_pop32(false);
37-
}
45+
}
Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,22 @@
11

22
use crate::emu;
3+
use crate::peb;
4+
use crate::constants;
35
use crate::winapi::helper;
46

57
pub fn GetModuleHandleA(emu: &mut emu::Emu) {
68
let module_name_ptr = emu.regs().rcx;
79
let module_name: String;
10+
let base;
811

912
if module_name_ptr == 0 {
10-
module_name = "self".to_string();
11-
12-
let base = match emu.maps.get_base() {
13-
Some(base) => base,
13+
14+
module_name = constants::EXE_NAME.to_string();
15+
base = match peb::peb64::get_module_base(&module_name, emu) {
16+
Some(b) => b,
1417
None => helper::handler_create(&module_name),
1518
};
1619

17-
log_red!(
18-
emu,
19-
"kernel32!GetModuleHandleA `{}` {:x}",
20-
module_name,
21-
base
22-
);
23-
24-
emu.regs_mut().rax = base;
2520
} else {
2621
module_name = emu.maps.read_string(module_name_ptr);
2722

@@ -32,17 +27,16 @@ pub fn GetModuleHandleA(emu: &mut emu::Emu) {
3227
return;
3328
}
3429
};
35-
let base = mod_mem.get_base();
36-
37-
log_red!(
38-
emu,
39-
"kernel32!GetModuleHandleA `{}` {:x}",
40-
module_name,
41-
base
42-
);
30+
base = mod_mem.get_base();
4331

44-
emu.regs_mut().rax = base;
4532
}
4633

34+
log_red!(
35+
emu,
36+
"kernel32!GetModuleHandleA `{}` {:x}",
37+
module_name,
38+
base
39+
);
4740

41+
emu.regs_mut().rax = base;
4842
}
Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,41 @@
11

22
use crate::emu;
3+
use crate::peb;
4+
use crate::constants;
35
use crate::winapi::helper;
46

57
pub fn GetModuleHandleW(emu: &mut emu::Emu) {
68
let module_name_ptr = emu.regs().rcx;
79
let module_name: String;
10+
let base;
811

912
if module_name_ptr == 0 {
10-
module_name = "self".to_string();
11-
emu.regs_mut().rax = match emu.maps.get_base() {
12-
Some(base) => base,
13+
14+
module_name = constants::EXE_NAME.to_string();
15+
base = match peb::peb64::get_module_base(&module_name, emu) {
16+
Some(b) => b,
1317
None => helper::handler_create(&module_name),
14-
}
18+
};
19+
1520
} else {
1621
module_name = emu.maps.read_wide_string(module_name_ptr).to_lowercase();
17-
let mod_mem = match emu.maps.get_mem2(&module_name) {
22+
let mod_mem = match emu.maps.get_mem2(&module_name.to_lowercase().replace(".dll",".pe")) {
1823
Some(m) => m,
1924
None => {
2025
emu.regs_mut().rax = 0;
2126
return;
2227
}
2328
};
2429

25-
emu.regs_mut().rax = mod_mem.get_base();
30+
base = mod_mem.get_base();
2631
}
2732

2833
log_red!(
2934
emu,
30-
"kernel32!GetModuleHandleW `{}`",
31-
module_name
35+
"kernel32!GetModuleHandleW `{}` 0x{:x}",
36+
module_name,
37+
base
3238
);
33-
}
39+
40+
emu.regs_mut().rax = base;
41+
}

0 commit comments

Comments
 (0)