Skip to content

Commit cd9ec1d

Browse files
authored
Update main.cpp
Added section parsing. Raw implementation, will improve later.
1 parent 4fb4e6c commit cd9ec1d

File tree

1 file changed

+28
-5
lines changed

1 file changed

+28
-5
lines changed

main.cpp

+28-5
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
#include <iostream>
22
#include <windows.h>
33
#include <iomanip>
4+
#include <vector>
45

56
std::string returnArch(const int machineArch);
67
void parseFileHeader(IMAGE_FILE_HEADER& ImgFileHeader);
78
void parseOptionalHeader(IMAGE_OPTIONAL_HEADER& ImgOptionalHeader);
9+
void parseSectionHeaders(IMAGE_SECTION_HEADER* pImgSectionHeader, WORD& ImgNoOfSections);
810

911
int main(int argc, char* argv[]){
10-
if (argc < 2){
11-
std::cout << "Please provide the filename!" << std::endl;
12-
return -1;
13-
}
12+
if (argc != 2){
13+
std::cout << "Please provide the filename!" << std::endl;
14+
return -1;
15+
}
1416

1517
HANDLE hFile = CreateFile(argv[1], GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
1618

@@ -51,6 +53,11 @@ int main(int argc, char* argv[]){
5153
IMAGE_FILE_HEADER ImgFileHeader = (IMAGE_FILE_HEADER)(pNtHeaders->FileHeader);
5254
IMAGE_OPTIONAL_HEADER ImgOptionalHeader = (IMAGE_OPTIONAL_HEADER)(pNtHeaders->OptionalHeader);
5355

56+
WORD ImgTotalSections = ImgFileHeader.NumberOfSections;
57+
PIMAGE_SECTION_HEADER pImgSectionHeader = IMAGE_FIRST_SECTION(pNtHeaders);
58+
59+
parseSectionHeaders(pImgSectionHeader, ImgTotalSections);
60+
5461
std::cout << "Signature: 0x" << std::hex << pNtHeaders->Signature << std::endl;
5562
parseFileHeader(ImgFileHeader);
5663
parseOptionalHeader(ImgOptionalHeader);
@@ -98,7 +105,7 @@ std::string returnImageSubsystem(const int subsysNumber){
98105
}
99106

100107
void parseFileHeader(IMAGE_FILE_HEADER& ImgFileHeader){
101-
std::cout << "Architecutre: " << returnArch(ImgFileHeader.Machine) << std::endl;
108+
std::cout << "Architecture: " << returnArch(ImgFileHeader.Machine) << std::endl;
102109
std::cout << "Size of Section Table: " << ImgFileHeader.NumberOfSections << std::endl;
103110
std::cout << "Size of Optional Header: 0x" << ImgFileHeader.SizeOfOptionalHeader << std::endl;
104111
std::cout << "Relocs stripped: " << std::boolalpha << ((ImgFileHeader.Characteristics & IMAGE_FILE_RELOCS_STRIPPED) != 0) << std::endl;
@@ -114,3 +121,19 @@ void parseOptionalHeader(IMAGE_OPTIONAL_HEADER& ImgOptionalHeader){
114121
std::cout << "Header size: " << ImgOptionalHeader.SizeOfHeaders << std::endl;
115122
std::cout << "Subsystem: " << returnImageSubsystem(ImgOptionalHeader.Subsystem) << std::endl;
116123
}
124+
125+
void parseSectionHeaders(IMAGE_SECTION_HEADER* pImgSectionHeader, WORD& ImgNoOfSections){
126+
127+
for (int i = 0; i < ImgNoOfSections; i++) {
128+
std::cout << i+1 << ". " << pImgSectionHeader->Name << std::endl;
129+
std::cout << "\tVirtual Size: " << pImgSectionHeader->Misc.VirtualSize << std::endl;
130+
std::cout << "\tRaw Data Size: " << pImgSectionHeader->SizeOfRawData << std::endl;
131+
std::cout << "\tCharacteristics: " << std::endl;
132+
std::cout << "\t\tMEM_READ: " << std::boolalpha << ((pImgSectionHeader->Characteristics & IMAGE_SCN_MEM_READ) != 0)<< std::endl;
133+
std::cout << "\t\tMEM_EXECUTE: " << std::boolalpha << ((pImgSectionHeader->Characteristics & IMAGE_SCN_MEM_EXECUTE) != 0)<< std::endl;
134+
std::cout << "\t\tMEM_SHARED: " << std::boolalpha << ((pImgSectionHeader->Characteristics & IMAGE_SCN_MEM_SHARED) != 0)<< std::endl;
135+
std::cout << "\t\tCNT_CODE: " << std::boolalpha << ((pImgSectionHeader->Characteristics & IMAGE_SCN_CNT_CODE) != 0)<< std::endl;
136+
pImgSectionHeader++;
137+
}
138+
139+
}

0 commit comments

Comments
 (0)