Windows DLL exported symbols listing utility
修订版 | f60a4c6b8bd39074cb651d5e69782d0aebcdf414 (tree) |
---|---|
时间 | 2011-09-15 05:07:54 |
作者 | Keith Marshall <keithmarshall@user...> |
Commiter | Keith Marshall |
Avoid segmentation faults in forwarder function checks.
@@ -1,6 +1,19 @@ | ||
1 | +2011-09-14 Daniel Collins <solemnwarning@solemnwarning.net> | |
2 | + | |
3 | + Avoid segmentation faults in forwarder function checks. | |
4 | + | |
5 | + * pexports.h (dump_exports): Adjust prototype to accommodate new | |
6 | + 'exports_size' argument; this is to be assigned and passed from... | |
7 | + * pexports.c (main): ...here; assigned value is determined from the | |
8 | + export table size recorded in the PE file image, whence passed to... | |
9 | + (dump_exports): ...here; it is used to avoid crashing or corruption | |
10 | + when the export table isn't at the end of its section. Also check | |
11 | + for, and filter out duplicated symbol reports. | |
12 | + | |
1 | 13 | 2009-09-15 Charles Wilson <cwilso11@users.sourceforge.net> |
2 | 14 | |
3 | 15 | Slight build improvements. |
16 | + | |
4 | 17 | * README: Update. |
5 | 18 | * Makefile: Rewrite dist rule to create a .tar.lzma instead |
6 | 19 | of a .zip (and don't create a tarbomb). |
@@ -8,6 +21,7 @@ | ||
8 | 21 | 2009-09-15 Charles Wilson <cwilso11@users.sourceforge.net> |
9 | 22 | |
10 | 23 | Package 0.44-1-mingw32 fixes. |
24 | + | |
11 | 25 | * pexports.c (main): Fix typo in usage statement. |
12 | 26 | * pexports.h: Ensure ULONGLONG is defined. |
13 | 27 | * Makefile: Force use of flex and bison, not lex and yacc. |
@@ -15,6 +29,7 @@ | ||
15 | 29 | 2008-08-31 Tor Lillqvist <tml@novell.com> |
16 | 30 | |
17 | 31 | Release 0.44. Add support for 64-bit executables. |
32 | + | |
18 | 33 | * hlex.l |
19 | 34 | * hparse.y |
20 | 35 | * pexports.h |
@@ -64,7 +64,7 @@ int | ||
64 | 64 | main(int argc, char *argv[]) |
65 | 65 | { |
66 | 66 | PIMAGE_SECTION_HEADER section; |
67 | - DWORD exp_rva; | |
67 | + DWORD exp_rva, exp_size; | |
68 | 68 | int i; |
69 | 69 | #if defined(_WIN32) && !defined(_WIN64) |
70 | 70 |
@@ -174,10 +174,13 @@ main(int argc, char *argv[]) | ||
174 | 174 | nt_hdr32 = (PIMAGE_NT_HEADERS32) ((char *) dos_hdr + dos_hdr->e_lfanew); |
175 | 175 | nt_hdr64 = (PIMAGE_NT_HEADERS64) nt_hdr32; |
176 | 176 | |
177 | - if (nt_hdr32->FileHeader.Machine == IMAGE_FILE_MACHINE_I386) | |
177 | + if (nt_hdr32->FileHeader.Machine == IMAGE_FILE_MACHINE_I386) { | |
178 | 178 | exp_rva = nt_hdr32->OptionalHeader.DataDirectory[0].VirtualAddress; |
179 | - else | |
179 | + exp_size = nt_hdr32->OptionalHeader.DataDirectory[0].Size; | |
180 | + }else{ | |
180 | 181 | exp_rva = nt_hdr64->OptionalHeader.DataDirectory[0].VirtualAddress; |
182 | + exp_size = nt_hdr64->OptionalHeader.DataDirectory[0].Size; | |
183 | + } | |
181 | 184 | |
182 | 185 | if (verbose) |
183 | 186 | { |
@@ -196,10 +199,10 @@ main(int argc, char *argv[]) | ||
196 | 199 | { |
197 | 200 | section = IMAGE_SECTION_HDR(i); |
198 | 201 | if (memcmp(section->Name, exp_sign, sizeof(exp_sign)) == 0) |
199 | - dump_exports(section->VirtualAddress); | |
202 | + dump_exports(section->VirtualAddress, exp_size); | |
200 | 203 | else if ((exp_rva >= section->VirtualAddress) && |
201 | 204 | (exp_rva < (section->VirtualAddress + section->SizeOfRawData))) |
202 | - dump_exports(exp_rva); | |
205 | + dump_exports(exp_rva, exp_size); | |
203 | 206 | } |
204 | 207 | |
205 | 208 | free(dos_hdr); |
@@ -208,7 +211,7 @@ main(int argc, char *argv[]) | ||
208 | 211 | |
209 | 212 | /* dump exported symbols on stdout */ |
210 | 213 | void |
211 | -dump_exports(DWORD exports_rva) | |
214 | +dump_exports(DWORD exports_rva, DWORD exports_size) | |
212 | 215 | { |
213 | 216 | PIMAGE_SECTION_HEADER section; |
214 | 217 | PIMAGE_EXPORT_DIRECTORY exports; |
@@ -259,21 +262,35 @@ dump_exports(DWORD exports_rva) | ||
259 | 262 | dump_symbol(RVA_TO_PTR(name_table[i],char*), |
260 | 263 | ordinal_table[i] + exports->Base, |
261 | 264 | function_table[ordinal_table[i]]); |
265 | + | |
266 | + int f_off = ordinal_table[i]; | |
267 | + | |
268 | + if(function_table[f_off] >= exports_rva && function_table[f_off] < (exports_rva + exports_size) && verbose) { | |
269 | + printf(" ; Forwarder (%s)", RVA_TO_PTR(function_table[f_off], char*)); | |
270 | + } | |
271 | + | |
262 | 272 | printf("\n"); |
263 | 273 | } |
264 | 274 | |
265 | 275 | for (i = 0; i < exports->NumberOfFunctions; i++) |
266 | 276 | { |
267 | 277 | if ( (function_table[i] >= exports_rva) && |
268 | - (function_table[i] <= (section->VirtualAddress + section->SizeOfRawData))) | |
278 | + (function_table[i] < (exports_rva + exports_size))) | |
269 | 279 | { |
270 | - dump_symbol(strchr(RVA_TO_PTR(function_table[i],char*), '.')+1, | |
271 | - i + exports->Base, | |
272 | - function_table[i]); | |
273 | - if (verbose) | |
274 | - printf(" ; Forwarder\n"); | |
275 | - else | |
276 | - printf("\n"); | |
280 | + int name_present = 0, n; | |
281 | + | |
282 | + for(n = 0; n < exports->NumberOfNames; n++) { | |
283 | + if(ordinal_table[n] == i) { | |
284 | + name_present = 1; | |
285 | + break; | |
286 | + } | |
287 | + } | |
288 | + | |
289 | + if(!name_present) { | |
290 | + dump_symbol(strchr(RVA_TO_PTR(function_table[i],char*), '.')+1, i + exports->Base, function_table[i]); | |
291 | + | |
292 | + printf(" ; WARNING: Symbol name guessed from forwarder (%s)\n", RVA_TO_PTR(function_table[i], char*)); | |
293 | + } | |
277 | 294 | } |
278 | 295 | } |
279 | 296 | } |
@@ -207,7 +207,7 @@ void * | ||
207 | 207 | rva_to_ptr(DWORD rva); |
208 | 208 | |
209 | 209 | void |
210 | -dump_exports(DWORD exports_rva); | |
210 | +dump_exports(DWORD exports_rva, DWORD exports_size); | |
211 | 211 | |
212 | 212 | #define ADD_FUNCTION(nm,n) str_tree_add(&symbols, nm, (void*)(INT_PTR)n) |
213 | 213 | extern str_tree *symbols; |