3 #include "ProgramManager.h"
4 #include "misc/ArgumentParser.h"
9 ProgramManager::ProgramManager(Misc::SmartPointer
<Misc::ArgumentList
> argument_list
)
10 : argument_list(argument_list
), running(false) {
12 elf_parser
= new ELF::Parser(argument_list
->get_argument(0));
13 std::string libc_path
= Misc::ArgumentParser::get_instance()->get_argument("libc path").to
<Misc::StringArgument
>()->get_value();
14 libc_parser
= new ELF::Parser(libc_path
);
15 dwarf_parser
= new DWARF::Parser(elf_parser
);
16 disassembler
= new ASM::Disassembler(elf_parser
);
18 disassembler
->get_symbol_il("main");
21 void ProgramManager::execute() {
22 std::cout
<< "ProgramManager::execute() called . . ." << std::endl
;
24 ptrace_portal
= new PTrace::Portal(get_argument_list());
25 /*std::cout << "\tlibc offset is: " << get_ptrace_portal()->get_libc_offset() << std::endl;
26 std::cout << "\ttherefore, address of malloc is: " << libc_parser->get_symbol("malloc")->get_address() + get_ptrace_portal()->get_libc_offset() << std::endl;*/
29 void ProgramManager::wait() {
30 ptrace_portal
->handle_signal();
33 void ProgramManager::place_initial_breakpoints() {
34 std::cout
<< "ProgramManager::place_initial_breakpoints() called . . ." << std::endl
;
35 std::cout
<< std::hex
;
36 Word libc_offset
= get_ptrace_portal()->get_libc_offset();
37 std::cout
<< "ProgramManager::place_initial_breakpoints(): placing malloc breakpoint . . ." << std::endl
;
38 std::cout
<< "\tlibc offset is " << libc_offset
<< std::endl
;
39 std::cout
<< "\tmalloc offset is " << get_libc_parser()->get_symbol("malloc")->get_address() << std::endl
;
40 Word malloc_address
= libc_offset
+ get_libc_parser()->get_symbol("malloc")->get_address();
41 std::cout
<< "\tmalloc address is " << malloc_address
<< std::endl
;
42 malloc_breakpoint_id
= get_ptrace_portal()->place_breakpoint(malloc_address
, get_ptrace_portal()->get_malloc_observer());
44 std::cout
<< "ProgramManager::place_initial_breakpoints(): placing free breakpoint . . ." << std::endl
;
45 Word free_address
= libc_offset
+ get_libc_parser()->get_symbol("free")->get_address();
46 std::cout
<< "\tfree address is " << free_address
<< std::endl
;
47 free_breakpoint_id
= get_ptrace_portal()->place_breakpoint(free_address
, get_ptrace_portal()->get_free_observer());
49 std::cout
<< "ProgramManager::place_initial_breakpoints(): placing realloc breakpoing . . ." << std::endl
;
50 Word realloc_address
= libc_offset
+ get_libc_parser()->get_symbol("realloc")->get_address();
51 std::cout
<< "\trealloc address is " << realloc_address
<< std::endl
;
52 realloc_breakpoint_id
= get_ptrace_portal()->place_breakpoint(realloc_address
, get_ptrace_portal()->get_realloc_observer());
54 /* Remove the breakpoint on main(), it's not required any more. */
55 /*get_ptrace_portal()->get_breakpoint_by_address(get_elf_parser()->get_symbol("main")->get_address())->set_valid(false);*/
58 } // namespace Monitor
59 } // namespace Aesalon