acea705df8
--HG-- rename : editor/ida/gcc_fpic.idc => tools/ida_scripts/gcc_fpic.idc rename : editor/ida/linux_vtable_dump.idc => tools/ida_scripts/linux_vtable_dump.idc
103 lines
2.4 KiB
C
103 lines
2.4 KiB
C
|
|
// *****************************************************************************
|
|
// - IDA Pro script -
|
|
// Name: ida_vtables.idc
|
|
// Desc: Recreates the methods of a class from a vtable
|
|
//
|
|
// Ver: 1.0b - July 20, 2006 - By Sirmabus
|
|
// Ver: 2.0 - July 7, 2006 by BAILOPAN
|
|
// ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ-ÄÄ-
|
|
//
|
|
// -----------------------------------------------------------------------------
|
|
|
|
#include <idc.idc>
|
|
|
|
static main()
|
|
{
|
|
auto pAddress, iIndex;
|
|
auto szFilePath, hFile;
|
|
auto skipAmt;
|
|
|
|
SetStatus(IDA_STATUS_WORK);
|
|
|
|
// User selected vtable block
|
|
pAddress = ScreenEA();
|
|
|
|
if (pAddress == BADADDR)
|
|
{
|
|
Message("** No vtable selected! Aborted **");
|
|
Warning("No vtable selected!\nSelect vtable block first.");
|
|
SetStatus(IDA_STATUS_READY);
|
|
return;
|
|
}
|
|
|
|
skipAmt = AskLong(1, "Number of vtable entries to ignore for indexing:");
|
|
|
|
// Request output header file
|
|
SetStatus(IDA_STATUS_WAITING);
|
|
if ((szFilePath = AskFile(1, "*.txt", "Select output dump file:")) == 0)
|
|
{
|
|
Message("Aborted.");
|
|
SetStatus(IDA_STATUS_READY);
|
|
return;
|
|
}
|
|
|
|
// And create it..
|
|
if ((hFile = fopen(szFilePath, "wb")) != 0)
|
|
{
|
|
auto szFuncName, szFullName, BadHits;
|
|
|
|
BadHits = 0;
|
|
|
|
// Create the header
|
|
fprintf(hFile, "// Auto reconstructed from vtable block @ 0x%08X\n// from \"%s\", by ida_vtables.idc\n", pAddress, GetInputFile());
|
|
|
|
/* For linux, skip the first entry */
|
|
if (Dword(pAddress) == 0)
|
|
{
|
|
pAddress = pAddress + 8;
|
|
}
|
|
|
|
pAddress = pAddress + (skipAmt * 4);
|
|
|
|
// Loop through the vtable block
|
|
while (pAddress != BADADDR)
|
|
{
|
|
auto real_addr;
|
|
real_addr = Dword(pAddress);
|
|
|
|
szFuncName = Name(real_addr);
|
|
if (strlen(szFuncName) == 0)
|
|
{
|
|
break;
|
|
}
|
|
szFullName = Demangle(szFuncName, INF_LONG_DN);
|
|
if (szFullName == "")
|
|
{
|
|
szFullName = szFuncName;
|
|
}
|
|
if (strstr(szFullName, "_ZN") != -1)
|
|
{
|
|
fclose(hFile);
|
|
Warning("You must toggle GCC v3.x demangled names!\n");
|
|
break;
|
|
}
|
|
fprintf(hFile, "%d\t%s\n", iIndex, szFullName);
|
|
|
|
pAddress = pAddress + 4;
|
|
iIndex++;
|
|
};
|
|
|
|
fclose(hFile);
|
|
Message("Successfully wrote %d vtable entries.\n", iIndex);
|
|
}
|
|
else
|
|
{
|
|
Message("** Error opening \"%s\"! Aborted **\n", szFilePath);
|
|
Warning("Error creating \"%s\"!\n", szFilePath);
|
|
}
|
|
|
|
Message("\nDone.\n\n");
|
|
SetStatus(IDA_STATUS_READY);
|
|
}
|