diff --git a/editor/ida/linux_vtable_dump.idc b/editor/ida/linux_vtable_dump.idc new file mode 100644 index 00000000..dd5bffde --- /dev/null +++ b/editor/ida/linux_vtable_dump.idc @@ -0,0 +1,102 @@ + +// ***************************************************************************** +// - 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 + +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 = GetFunctionName(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); +}