Skip to content

Commit e5f53c7

Browse files
committed
Fixed PDB size check, added signature check, layout
1 parent 5873236 commit e5f53c7

File tree

2 files changed

+23
-8
lines changed

2 files changed

+23
-8
lines changed

GH Injector Library/Symbol Parser.cpp

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ SYMBOL_PARSER::~SYMBOL_PARSER()
2626
}
2727
}
2828

29-
bool SYMBOL_PARSER::VerifyExistingPdb(GUID guid)
29+
bool SYMBOL_PARSER::VerifyExistingPdb(const GUID & guid)
3030
{
3131
std::ifstream f(m_szPdbPath.c_str(), std::ios::binary | std::ios::ate);
3232
if (f.bad())
@@ -63,16 +63,31 @@ bool SYMBOL_PARSER::VerifyExistingPdb(GUID guid)
6363

6464
auto * pPDBHeader = ReCa<PDBHeader7*>(pdb_raw);
6565

66-
int min_file_size = (int)pPDBHeader->root_stream_page_number_list_number * pPDBHeader->page_size + pPDBHeader->root_stream_size;
67-
if (size_on_disk < (size_t)min_file_size)
66+
if (memcmp(pPDBHeader->signature, "Microsoft C/C++ MSF 7.00\r\n\x1A""DS\0\0\0", sizeof(PDBHeader7::signature)))
6867
{
6968
delete[] pdb_raw;
7069

7170
return false;
7271
}
7372

74-
int * pRootPageNumber = ReCa<int*>(pdb_raw + (size_t)pPDBHeader->root_stream_page_number_list_number * pPDBHeader->page_size);
75-
auto * pRootStream = ReCa<RootStream7*>(pdb_raw + (size_t)(*pRootPageNumber) * pPDBHeader->page_size);
73+
if (size_on_disk < (size_t)pPDBHeader->page_size * pPDBHeader->file_page_count)
74+
{
75+
delete[] pdb_raw;
76+
77+
return false;
78+
}
79+
80+
int * pRootPageNumber = ReCa<int*>(pdb_raw + (size_t)pPDBHeader->root_stream_page_number_list_number * pPDBHeader->page_size);
81+
auto * pRootStream = ReCa<RootStream7*>(pdb_raw + (size_t)(*pRootPageNumber) * pPDBHeader->page_size);
82+
83+
int size = 0;
84+
for (int i = 0; i < pRootStream->num_streams; ++i)
85+
{
86+
if (pRootStream->stream_sizes[i] == 0xFFFFFFFF)
87+
continue;
88+
89+
size += pRootStream->stream_sizes[i];
90+
}
7691

7792
std::map<int, std::vector<int>> streams;
7893
int current_page_number = 0;
@@ -100,9 +115,9 @@ bool SYMBOL_PARSER::VerifyExistingPdb(GUID guid)
100115
auto pdb_info_stream = streams.at(1);
101116
auto pdb_info_page_index = pdb_info_stream.at(0);
102117

103-
auto * stram_data = ReCa<GUID_StreamData*>(pdb_raw + (size_t)(pdb_info_page_index) * pPDBHeader->page_size);
118+
auto * stream_data = ReCa<GUID_StreamData*>(pdb_raw + (size_t)(pdb_info_page_index) * pPDBHeader->page_size);
104119

105-
int guid_eq = memcmp(&stram_data->guid, &guid, sizeof(GUID));
120+
int guid_eq = memcmp(&stream_data->guid, &guid, sizeof(GUID));
106121

107122
delete[] pdb_raw;
108123

GH Injector Library/Symbol Parser.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class SYMBOL_PARSER
1717

1818
bool m_Initialized;
1919

20-
bool VerifyExistingPdb(GUID guid);
20+
bool VerifyExistingPdb(const GUID & guid);
2121

2222
public:
2323

0 commit comments

Comments
 (0)