1
1
#include < iostream>
2
2
#include < windows.h>
3
3
#include < iomanip>
4
+ #include < vector>
4
5
5
6
std::string returnArch (const int machineArch);
6
7
void parseFileHeader (IMAGE_FILE_HEADER& ImgFileHeader);
7
8
void parseOptionalHeader (IMAGE_OPTIONAL_HEADER& ImgOptionalHeader);
9
+ void parseSectionHeaders (IMAGE_SECTION_HEADER* pImgSectionHeader, WORD& ImgNoOfSections);
8
10
9
11
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
+ }
14
16
15
17
HANDLE hFile = CreateFile (argv[1 ], GENERIC_READ, FILE_SHARE_READ, NULL , OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
16
18
@@ -51,6 +53,11 @@ int main(int argc, char* argv[]){
51
53
IMAGE_FILE_HEADER ImgFileHeader = (IMAGE_FILE_HEADER)(pNtHeaders->FileHeader );
52
54
IMAGE_OPTIONAL_HEADER ImgOptionalHeader = (IMAGE_OPTIONAL_HEADER)(pNtHeaders->OptionalHeader );
53
55
56
+ WORD ImgTotalSections = ImgFileHeader.NumberOfSections ;
57
+ PIMAGE_SECTION_HEADER pImgSectionHeader = IMAGE_FIRST_SECTION (pNtHeaders);
58
+
59
+ parseSectionHeaders (pImgSectionHeader, ImgTotalSections);
60
+
54
61
std::cout << " Signature: 0x" << std::hex << pNtHeaders->Signature << std::endl;
55
62
parseFileHeader (ImgFileHeader);
56
63
parseOptionalHeader (ImgOptionalHeader);
@@ -98,7 +105,7 @@ std::string returnImageSubsystem(const int subsysNumber){
98
105
}
99
106
100
107
void parseFileHeader (IMAGE_FILE_HEADER& ImgFileHeader){
101
- std::cout << " Architecutre : " << returnArch (ImgFileHeader.Machine ) << std::endl;
108
+ std::cout << " Architecture : " << returnArch (ImgFileHeader.Machine ) << std::endl;
102
109
std::cout << " Size of Section Table: " << ImgFileHeader.NumberOfSections << std::endl;
103
110
std::cout << " Size of Optional Header: 0x" << ImgFileHeader.SizeOfOptionalHeader << std::endl;
104
111
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){
114
121
std::cout << " Header size: " << ImgOptionalHeader.SizeOfHeaders << std::endl;
115
122
std::cout << " Subsystem: " << returnImageSubsystem (ImgOptionalHeader.Subsystem ) << std::endl;
116
123
}
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 << " \t Virtual Size: " << pImgSectionHeader->Misc .VirtualSize << std::endl;
130
+ std::cout << " \t Raw Data Size: " << pImgSectionHeader->SizeOfRawData << std::endl;
131
+ std::cout << " \t Characteristics: " << std::endl;
132
+ std::cout << " \t\t MEM_READ: " << std::boolalpha << ((pImgSectionHeader->Characteristics & IMAGE_SCN_MEM_READ) != 0 )<< std::endl;
133
+ std::cout << " \t\t MEM_EXECUTE: " << std::boolalpha << ((pImgSectionHeader->Characteristics & IMAGE_SCN_MEM_EXECUTE) != 0 )<< std::endl;
134
+ std::cout << " \t\t MEM_SHARED: " << std::boolalpha << ((pImgSectionHeader->Characteristics & IMAGE_SCN_MEM_SHARED) != 0 )<< std::endl;
135
+ std::cout << " \t\t CNT_CODE: " << std::boolalpha << ((pImgSectionHeader->Characteristics & IMAGE_SCN_CNT_CODE) != 0 )<< std::endl;
136
+ pImgSectionHeader++;
137
+ }
138
+
139
+ }
0 commit comments