mirror of
https://gitlab.com/BinaryHardening/cfgrip
synced 2026-07-26 12:41:08 +00:00
36 lines
1.1 KiB
C++
36 lines
1.1 KiB
C++
#pragma once
|
|
#include "types.hpp"
|
|
#include "loader/binary.hpp"
|
|
#include "disasm/engine.hpp"
|
|
#include <map>
|
|
#include <set>
|
|
#include <vector>
|
|
|
|
class CFGBuilder
|
|
{
|
|
public:
|
|
CFGBuilder(Binary* binary, Disassembler* disasm);
|
|
CFG build();
|
|
|
|
private:
|
|
void buildGotMap();
|
|
Function buildFunction(addr_t start, const string& name);
|
|
BasicBlock disassembleBlock(addr_t start, addr_t& next);
|
|
set<addr_t> findPrologs();
|
|
void markVisited(addr_t addr);
|
|
bool isVisited(addr_t addr);
|
|
|
|
addr_t resolveGOT(const Instruction& inst);
|
|
addr_t resolveJumpTable(const vector<Instruction>& block, const Instruction& inst);
|
|
addr_t traceReg(const string& reg, const vector<Instruction>& block, size_t idx);
|
|
void recordIndirect(const Instruction& inst, addr_t target, bool ok, const string& name, const string& lib);
|
|
|
|
Binary* m_bin;
|
|
Disassembler* m_dis;
|
|
set<addr_t> m_funcs;
|
|
set<addr_t> m_blocks;
|
|
set<addr_t> m_prologs;
|
|
map<addr_t, pair<string, string>> m_got;
|
|
vector<IndirectTarget> m_targets;
|
|
};
|