Continued ripping up the source.
[aesalon.git] / monitor / src / ProgramManager.cpp
blob4b43cf2e2be4bb5d5b8c49e4d1b4bc05b6c083ad
1 #include <iostream>
2 #include <signal.h>
3 #include "ProgramManager.h"
4 #include "misc/ArgumentParser.h"
6 namespace Aesalon {
7 namespace Monitor {
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;
23 running = true;
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