|
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 |
} |