इस (लिनक्स) सी कोड का प्रयास करें:
#include <fcntl.h>
#include <stdio.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
unsigned int vpe2offset(void * base, unsigned int vpe) {
unsigned int * ptr = base;
unsigned int pe_offset;
unsigned short num_sections;
pe_offset = ptr[0x3c/4]; //PE header offset
ptr = base + pe_offset; //PE header address
num_sections = ((unsigned short*)ptr)[6/2]; //Section count
ptr = ((void*)base) + 0x18 + 0x60 + 16*8 + pe_offset;//Address of first section
while (num_sections--) {
if (vpe >= ptr[0x0c/4] && vpe < ptr[0x0c/4] + ptr[0x10/4]) {
return vpe - ptr[0x0c/4] + ptr[0x14/4];
}
ptr += 0x28/4;
}
return 0;
}
void iterate_exports(void * base, int(*iterator)(char*)) {
unsigned int * ptr = base;
unsigned int pe_offset,
exports_offset,
number_of_names,
address_of_names;
pe_offset = ptr[0x3c/4];
ptr = base + pe_offset;
exports_offset = ptr[0x78/4];
ptr = base + vpe2offset(base, exports_offset);
number_of_names = ptr[0x18/4];
address_of_names = ptr[0x20/4];
ptr = base + vpe2offset(base, address_of_names);
while (number_of_names-- && iterator((char*)(base + vpe2offset(base, ptr++[0])))) {
/* Do nothing */
}
}
int print_symbol_name(char * name) {
printf("%s\n", name);
return 1;
}
int main(int argc, char const *argv[]) {
int fd;
struct stat st;
void * base;
if (argc == 1) {
printf("Usage: %s <dll>\n", argv[0]);
} else if (stat(argv[1], &st) == 0 && (fd = open(argv[1], O_RDONLY)) >= 0) {
base = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
if (base != MAP_FAILED) {
iterate_exports(base, print_symbol_name);
munmap(base, st.st_size);
} else {
fprintf(stderr, "Could not map \"%s\".\n", argv[1]);
}
close(fd);
} else {
fprintf(stderr, "Could not open \"%s\" for reading.\n", argv[1]);
}
return 0;
}
यह पीई फ़ाइल के अंदर संदर्भ अनुसरण करता है और अंत में प्रत्येक निर्यात प्रतीक के लिए एक कॉलबैक फ़ंक्शन कॉल करता है। पीई फ़ाइल प्रारूप के एक सिंहावलोकन के लिए यह देखें: http://www.openrce.org/reference_library/files/reference/PE%20Format.pdf
स्रोत
2012-06-04 13:01:03
सिर्फ एक nitpick है, लेकिन मुझे लगता है कि आप मतलब> लेकिन मैं समझ एक सिस्टम कॉल –
आप इसे programmaticly करने के लिए एक रास्ता के लिए देख रहे हैं वहाँ होना चाहिए, देखें मेरा जवाब आगे नीचे। – Aaron
यह भी ध्यान रखें कि डीएलएल उन कार्यों को निर्यात कर सकता है जिनमें स्ट्रिंग नाम नहीं हैं, और इन्हें अपने ordinal के माध्यम से एक्सेस किया जाना चाहिए। –