DBG: Int3CoagulatorPass finished
This commit is contained in:
parent
576b58e7c3
commit
1602c52b70
|
@ -1,7 +1,9 @@
|
||||||
|
#include "AnalysisPass.h"
|
||||||
#include "Int3CoagulatorPass.h"
|
#include "Int3CoagulatorPass.h"
|
||||||
|
#include "console.h"
|
||||||
|
|
||||||
Int3CoagulatorPass::Int3CoagulatorPass(uint VirtualStart, uint VirtualEnd)
|
Int3CoagulatorPass::Int3CoagulatorPass(uint VirtualStart, uint VirtualEnd, BBlockArray & MainBlocks)
|
||||||
: AnalysisPass(VirtualStart, VirtualEnd)
|
: AnalysisPass(VirtualStart, VirtualEnd, MainBlocks)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,7 +11,66 @@ Int3CoagulatorPass::~Int3CoagulatorPass()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char* Int3CoagulatorPass::GetName()
|
||||||
|
{
|
||||||
|
return "INT3 Group Combiner";
|
||||||
|
}
|
||||||
|
|
||||||
bool Int3CoagulatorPass::Analyse()
|
bool Int3CoagulatorPass::Analyse()
|
||||||
{
|
{
|
||||||
return false;
|
// Execute
|
||||||
|
std::thread thread(&Int3CoagulatorPass::AnalysisWorker, this, 0, m_MainBlocks.size(), &m_MainBlocks);
|
||||||
|
|
||||||
|
// Wait for thread to finish
|
||||||
|
thread.join();
|
||||||
|
|
||||||
|
dprintf("Total basic blocks: %d\n", m_MainBlocks.size());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Int3CoagulatorPass::AnalysisWorker(uint Start, uint End, std::vector<BasicBlock>* Blocks)
|
||||||
|
{
|
||||||
|
int counterIndex = 0; // Loop counter
|
||||||
|
|
||||||
|
uint intSeriesStart = 0; // Block starting address
|
||||||
|
uint intSeriesCount = 0; // Number of blocks
|
||||||
|
uint intSeriesSize = 0; // Size of instructions
|
||||||
|
|
||||||
|
for(auto itr = Blocks->begin(); counterIndex < End; itr++, counterIndex++)
|
||||||
|
{
|
||||||
|
if(!itr->GetFlag(BASIC_BLOCK_FLAG_INT3))
|
||||||
|
{
|
||||||
|
// Synchronize the vector if more than 1 instruction
|
||||||
|
// is present. (Combine)
|
||||||
|
if(intSeriesCount > 1)
|
||||||
|
{
|
||||||
|
// Removal of old blocks
|
||||||
|
itr = Blocks->erase(itr - intSeriesCount, itr);
|
||||||
|
|
||||||
|
// Build the new block and insert
|
||||||
|
BasicBlock block;
|
||||||
|
block.VirtualStart = intSeriesStart;
|
||||||
|
block.VirtualEnd = intSeriesStart + intSeriesSize;
|
||||||
|
block.SetFlag(BASIC_BLOCK_FLAG_INT3);
|
||||||
|
|
||||||
|
itr = Blocks->insert(itr, block);
|
||||||
|
|
||||||
|
// Adjust the integer counter manually
|
||||||
|
End -= (intSeriesCount - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Counter is reset because the series is broken
|
||||||
|
intSeriesCount = 0;
|
||||||
|
intSeriesSize = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hit! An INT3 instruction block has been found.
|
||||||
|
// Update the counter stats.
|
||||||
|
if(intSeriesCount == 0)
|
||||||
|
intSeriesStart = itr->VirtualStart;
|
||||||
|
|
||||||
|
intSeriesCount += 1;
|
||||||
|
intSeriesSize += (itr->VirtualEnd - itr->VirtualStart);
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue