コード例 #1
0
ファイル: TbTrace.cpp プロジェクト: 0bliv10n/s2e
void TbTrace::printDebugInfo(uint64_t pid, uint64_t pc, unsigned tbSize, bool printListing)
{
    ModuleCacheState *mcs = static_cast<ModuleCacheState*>(m_events->getState(m_cache, &ModuleCacheState::factory));
    const ModuleInstance *mi = mcs->getInstance(pid, pc);
    if (!mi) {
        return;
    }
    uint64_t relPc = pc - mi->LoadBase + mi->ImageBase;
    m_output << std::hex << "(" << mi->Name;
    if (relPc != pc) {
       m_output << " 0x" << relPc;
    }
    m_output << ")";

    m_hasModuleInfo = true;

    std::string file = "?", function="?";
    uint64_t line=0;
    if (m_library->getInfo(mi, pc, file, line, function)) {
        size_t pos = file.find_last_of('/');
	if (pos != std::string::npos) {
            file = file.substr(pos+1);
        }

        m_output << " " << file << std::dec << ":" << line << " in " << function;
        m_hasDebugInfo = true;
    }

    if (PrintDisassembly && printListing) {
        m_output << std::endl;
        printDisassembly(mi->Name, relPc, tbSize);
    }
}
コード例 #2
0
ファイル: Asm_Printing.cpp プロジェクト: JaonLin/ROPInjector
void printInstruction(const INSTRUCTION * const i) 
{
	DISASSEMBLY d;
	FlushDecoded(&d);
	d.Address = (DWORD)(i->data);
	DWORD ilen = 0;
	Decode(&d, (char *)(i->data), &ilen);	

	printf("[%2d] ", i->index);
	printDisassembly(d);

	printf("size:\t\t%d\n", i->totalSize);
	if (i->regReads)
	{
		printf("reads:\t\t");
		for (BYTE reg = 0; reg < 8; reg++) {
			if (GET_READS(i, reg))
				printf ("%s ", REG[2][reg]);
		}
		printf("\n");
	}

	if (i->regWrites)
	{
		printf("writes:\t\t");
		for (BYTE reg = 0; reg < 8; reg++) {
			if (GET_WRITES(i, reg))
				printf ("%s ", REG[2][reg]);
		}
		printf("\n");
	}

	if (i->freeRegs)
	{
		printf("free:\t\t");
		for (BYTE reg = 0; reg < 8; reg++) {
			if (IS_FREE_REG(i,reg))
				printf ("%s ", REG[2][reg]);
		}
		printf("\n");
	}

	if (i->flags)
		printf("flags:\t\t0x%08X\n", i->flags);

	printf("offsets:\tOPCODE:%d, MODRM:%d, SIB:%d, DISP:%d:0x%08X, IMM:%d:0x%08X\n",
		OFFSET_TO_OPCODE(i),
		OFFSET_TO_MODRM(i), 
		OFFSET_TO_SIB(i),
		OFFSET_TO_DISP(i), getDisp(i),
		OFFSET_TO_IMM(i), getImm(i));

	if (i->jmp)
		printf("jumps to:\t%d\n", i->jmp->index);

	if (i->directVA)
		printf("refers to:\t0x%08X\n", *((DWORD *)(i->data + i->directVA)));
}
コード例 #3
0
ファイル: Asm_Printing.cpp プロジェクト: JaonLin/ROPInjector
void printIDisassembly(const INSTRUCTION * const iHead, const DWORD numInstr, const DWORD baseAddr)
{
    DISASSEMBLY d;
    d.Address = baseAddr;
	const INSTRUCTION *i = iHead;
	DWORD offset = 0;
	for (int index = 0; index < numInstr && i; index++, i = i->next)
    {
		FlushDecoded(&d);
		offset = 0;
        Decode(&d, (char *)i->data, &offset);
        
		printf("[%3d]\t", i->index);
		printDisassembly(d);
        d.Address += d.OpcodeSize + d.PrefixSize;
    }
}