-
Notifications
You must be signed in to change notification settings - Fork 489
Hacking on Manticore
Yan edited this page Aug 8, 2017
·
21 revisions
Manticore implements a synchronous publish/subscribe system for executing code when certain analysis events happen.
If you are implementing an event handler there are certain things you need to know about locking: https://github.com/trailofbits/manticore/pull/433#issuecomment-320056828
The following classes produce the following events:
-
manticore.core.cpu.Cpu-
will_write_register, arguments:register,value -
did_write_register, arguments:register,value -
will_read_register, arguments:register -
did_read_register, arguments:register,value -
will_write_memory, arguments:where,expression, size -
did_write_memory, arguments:where,expression, size -
will_read_memory, arguments:where,size -
did_read_memory, arguments:where,value,size -
will_decode_instruction, arguments:pc -
will_execute_instruction, arguments:instruction -
will_emulate_instruction, arguments:instruction -
did_emulate_instruction, arguments:instruction -
did_execute_instruction, arguments:instruction
-
-
manticore.core.Executor-
did_add_state, arguments:state_id,state -
will_generate_testcase, arguments:state,prefix,message -
will_fork_state, arguments:state,expression,solutions,policy -
forking_state, arguments:state,expression,new_value,policy -
will_load_state, arguments:current_state,current_state_id -
will_terminate_state, arguments:current_state,current_state_id,messageorexception will_finish_run- All events produced by currently-executing
manticore.core.State
-
-
manticore.core.State-
state_generate_inputs, arguments:name,message - All events produced by
manticore.platforms.Platform
-
-
manticore.platforms.Platform- All events produced by
manticore.core.cpus.Cpu
- All events produced by
as of a0717aa661c0b04d5f73879b265da4da05756630
To implement a Linux syscall:
- Look up the name of your syscall in
manticore/platforms/linux_syscalls.pyto get the correct name of your syscall for the corresponding syscall number. - In
manticore/platforms/linux.py, add a method to theSLinux(Symbolic Linux) class for your syscall. Name your method precisely the name above. The arguments to this method should be- 1:
self(standard Python self variable) - 2:
cpu(manticore.core.abstractcpu.Cpuobject representing current cpu state) - 3+: arguments to the syscall
- 1:
- Implement the logic of the syscall in this method, using the
CpuAPIs as needed - The method should return the value returned by the syscall
as of c78ea5c9109191654d26c7bfd2bedd662dafcdc5
To implement a cpu instruction:
- Open the file according to the architecture for this instruction
- x86 is in
manticore/core/cpu/x86.py - armv7 is in
manticore/core/cpu/arm.py
- x86 is in
- Add a method to the Cpu class in either of those files that subclasses
Cpu- Decorate it with the
@instructiondecorator - The arguments to the method should be
- 1:
self - 2+ one argument for every operand in
instruction.operandsas decoded by Capstone. The types of these arguments aremanticore.core.abstractcpu.Operandwhich is a light wrapper over a Capstone operand object (e.g. ArmOp)) and notably support convenience.readand.writemethods.
- 1:
- Decorate it with the
- Implement the instruction's effects
manticore/
├── binary # code related to binary formats. ignore this
│ ├── grr
│ │ ├── __init__.py
│ │ └── snapshot.py
│ ├── __init__.py
│ └── pe
│ ├── __init__.py
│ └── minidump.py
├── core
│ ├── cpu # code implementing symbolic emulators
│ │ ├── abstractcpu.py
│ │ ├── arm.py
│ │ ├── bitwise.py
│ │ ├── cpufactory.py
│ │ ├── __init__.py
│ │ ├── register.py
│ │ └── x86.py
│ ├── executor.py # main symbolic execution file
│ ├── __init__.py
│ ├── mappings.py
│ ├── memory.py
│ ├── parser
│ │ ├── __init__.py
│ │ └── parser.py
│ ├── smtlib # code related to handling symbolic data
│ │ ├── constraints.py #
│ │ ├── expression.py # defines symbolic data types
│ │ ├── __init__.py
│ │ ├── operators.py # library of operators for transparently handling concrete or symbolic data
│ │ ├── solver.py # code for interacting with the SMT solver
│ │ └── visitors.py # code for transforming expression trees, including serializing to SMTLIB
│ └── state.py # defines type for program state
├── __init__.py
├── __main__.py
├── manticore.py # high level API object
├── platforms # operating system models implemented here
│ ├── cgcrandom.py
│ ├── decree.py
│ ├── __init__.py
│ ├── libc.py
│ ├── linux.py
│ ├── windows.py
│ └── windows_syscalls.py
└── utils
├── emulate.py # code integrating unicorn for emulation of unimplemented instructions
├── event.py
├── helpers.py
├── __init__.py
├── iterpickle.py
└── nointerrupt.py
- Do a Manticore dev install (see README), or just install Sphinx
cd docsmake html