tools/ida_scripts/linux_vtable_dump.idc
author Nicholas Hastings <skamonkey@gmail.com>
Sun Jul 21 11:53:56 2013 -0400 (2013-07-21)
changeset 3961 0dc477c29792
parent 2399 eb4ad6f28c7d
permissions -rw-r--r--
Split TF2, DoD:S, HL2:DM, and ND to separate binaries (bug 5813, r=asherkin).
dvander@1055
     1
dvander@1055
     2
// *****************************************************************************
dvander@1055
     3
// - IDA Pro script -
dvander@1055
     4
// Name: ida_vtables.idc
dvander@1055
     5
// Desc: Recreates the methods of a class from a vtable
dvander@1055
     6
// 
dvander@1055
     7
// Ver: 1.0b - July 20, 2006 - By Sirmabus   
dvander@1055
     8
// Ver: 2.0 - July 7, 2006 by BAILOPAN
dvander@1055
     9
// �������������������������������������������������������������������������-��-
dvander@1055
    10
//
dvander@1055
    11
// -----------------------------------------------------------------------------
dvander@1055
    12
dvander@1055
    13
#include <idc.idc>
dvander@1055
    14
dvander@1055
    15
static main()
dvander@1055
    16
{
dvander@1055
    17
	auto pAddress, iIndex;
dvander@1055
    18
	auto szFilePath, hFile;
dvander@1055
    19
	auto skipAmt;
dvander@1055
    20
dvander@1055
    21
	SetStatus(IDA_STATUS_WORK);
dvander@1055
    22
dvander@1055
    23
	// User selected vtable block
dvander@1055
    24
	pAddress = ScreenEA();
dvander@1055
    25
	
dvander@1055
    26
	if (pAddress == BADADDR)
dvander@1055
    27
	{	
dvander@1055
    28
		Message("** No vtable selected! Aborted **");
dvander@1055
    29
		Warning("No vtable selected!\nSelect vtable block first.");							
dvander@1055
    30
		SetStatus(IDA_STATUS_READY);
dvander@1055
    31
		return;
dvander@1055
    32
	}
dvander@1055
    33
dvander@1055
    34
	skipAmt = AskLong(1, "Number of vtable entries to ignore for indexing:");
dvander@1055
    35
dvander@1055
    36
	// Request output header file
dvander@1055
    37
	SetStatus(IDA_STATUS_WAITING);
dvander@1055
    38
	if ((szFilePath = AskFile(1, "*.txt", "Select output dump file:")) == 0)
dvander@1055
    39
	{		
dvander@1055
    40
		Message("Aborted.");
dvander@1055
    41
		SetStatus(IDA_STATUS_READY);
dvander@1055
    42
		return;
dvander@1055
    43
	}
dvander@1055
    44
	
dvander@1055
    45
	// And create it..
dvander@1055
    46
	if ((hFile = fopen(szFilePath, "wb")) != 0)
dvander@1055
    47
	{
dvander@1055
    48
		auto szFuncName, szFullName, BadHits;
dvander@1055
    49
		
dvander@1055
    50
		BadHits = 0;
dvander@1055
    51
dvander@1055
    52
		// Create the header
dvander@1055
    53
		fprintf(hFile, "// Auto reconstructed from vtable block @ 0x%08X\n// from \"%s\", by ida_vtables.idc\n", pAddress, GetInputFile());
dvander@1055
    54
		
dvander@1055
    55
		/* For linux, skip the first entry */
dvander@1055
    56
		if (Dword(pAddress) == 0)
dvander@1055
    57
		{
dvander@1055
    58
			pAddress = pAddress + 8;
dvander@1055
    59
		}
dvander@1055
    60
		
dvander@1055
    61
		pAddress = pAddress + (skipAmt * 4);
dvander@1055
    62
dvander@1055
    63
		// Loop through the vtable block
dvander@1055
    64
		while (pAddress != BADADDR)
dvander@1055
    65
		{
dvander@1055
    66
			auto real_addr;
dvander@1055
    67
			real_addr = Dword(pAddress);
dvander@1055
    68
				
pred@2121
    69
			szFuncName = Name(real_addr);
dvander@1055
    70
			if (strlen(szFuncName) == 0)
dvander@1055
    71
			{
dvander@1055
    72
				break;
dvander@1055
    73
			}
dvander@1055
    74
			szFullName = Demangle(szFuncName, INF_LONG_DN);
dvander@1055
    75
			if (szFullName == "")
dvander@1055
    76
			{
dvander@1055
    77
				szFullName = szFuncName;
dvander@1055
    78
			}
dvander@1055
    79
			if (strstr(szFullName, "_ZN") != -1)
dvander@1055
    80
			{
dvander@1055
    81
				fclose(hFile);
dvander@1055
    82
				Warning("You must toggle GCC v3.x demangled names!\n");
dvander@1055
    83
				break;
dvander@1055
    84
			}
dvander@1055
    85
			fprintf(hFile, "%d\t%s\n", iIndex, szFullName);
dvander@1055
    86
						
dvander@1055
    87
			pAddress = pAddress + 4;
dvander@1055
    88
			iIndex++;
dvander@1055
    89
		};
dvander@1055
    90
dvander@1055
    91
		fclose(hFile);
dvander@1055
    92
		Message("Successfully wrote %d vtable entries.\n", iIndex);
dvander@1055
    93
	}
dvander@1055
    94
	else
dvander@1055
    95
	{		
dvander@1055
    96
		Message("** Error opening \"%s\"! Aborted **\n", szFilePath);
dvander@1055
    97
		Warning("Error creating \"%s\"!\n", szFilePath);
dvander@1055
    98
	}
dvander@1055
    99
dvander@1055
   100
	Message("\nDone.\n\n");
dvander@1055
   101
	SetStatus(IDA_STATUS_READY);
dvander@1055
   102
}