libPeConv
A library to load, manipulate, dump PE files.
exported_func.cpp
Go to the documentation of this file.
2
3#include <algorithm>
4#include <sstream>
5#include <iomanip>
6#include <iostream>
7
8using namespace peconv;
9
10std::string peconv::get_dll_shortname(const std::string& str)
11{
12 std::size_t len = str.length();
13 std::size_t found = str.find_last_of("/\\");
14 std::size_t ext = str.find_last_of('.');
15 if (ext >= len) return "";
16
17 std::string name = str.substr(found+1, ext - (found+1));
18 std::transform(name.begin(), name.end(), name.begin(), tolower);
19 return name;
20}
21
23{
24 // names can be also mangled, i.e. MSVCRT.??0__non_rtti_object@std@@QAE@ABV01@@Z
25 bool has_dot = false;
26 size_t len = 0;
27 while ((*fPtr >= 'a' && *fPtr <= 'z')
28 || (*fPtr >= 'A' && *fPtr <= 'Z')
29 || (*fPtr >= '0' && *fPtr <= '9')
30 || (*fPtr == '.')
31 || (*fPtr == '_')
32 || (*fPtr == '#')
33 || (*fPtr == '@')
34 || (*fPtr == '?')
35 || (*fPtr == '-'))
36 {
37 if (*fPtr == '.') has_dot = true;
38 len++;
39 fPtr++;
40 }
41 if (*fPtr == '\0') {
42 if (!has_dot) {
43 return 0; //this is not a valid forwarder
44 }
45 return len;
46 }
47 return 0;
48}
49
50std::string peconv::get_func_name(const std::string& str)
51{
52 std::size_t len = str.length();
53 std::size_t ext = str.find_last_of(".");
54 if (ext >= len) return "";
55
56 std::string name = str.substr(ext+1, len - (ext+1));
57 return name;
58}
59
60std::string peconv::ordinal_to_string(DWORD func_ordinal)
61{
62 std::stringstream stream;
63 stream << "#";
64 stream << std::dec << func_ordinal;
65 return stream.str();
66}
67
68bool peconv::is_ordinal_string(const std::string& func_name_str)
69{
70 if (func_name_str.length() < 2) return false;
71 return (func_name_str[0] == '#');
72}
73
74DWORD peconv::ordinal_string_to_val(const std::string& func_name_str)
75{
76 if (!is_ordinal_string(func_name_str)) return 0;
77 const char* func_name = func_name_str.c_str();
78 return atoi(func_name + 1);
79}
80
81std::string peconv::format_dll_func(const std::string& str)
82{
83 std::string dllName = get_dll_shortname(str);
84 std::string funcName = get_func_name(str);
85 if (dllName.length() == 0 || funcName.length() == 0) {
86 return "";
87 }
88 std::transform(dllName.begin(), dllName.end(), dllName.begin(), tolower);
89 return dllName + "." + funcName;
90}
91
92ExportedFunc::ExportedFunc(std::string libName, std::string funcName, DWORD funcOrdinal)
93{
94 this->libName = ExportedFunc::formatName(libName);
95 this->funcName = funcName;
96 this->funcOrdinal = funcOrdinal;
97 this->isByOrdinal = false;
98}
99
100ExportedFunc::ExportedFunc(std::string libName, DWORD funcOrdinal)
101{
102 this->libName = ExportedFunc::formatName(libName);
103 this->funcOrdinal = funcOrdinal;
104 this->isByOrdinal = true;
105}
106
108{
109 this->libName = other.libName;
110 this->funcName = other.funcName;
111 this->funcOrdinal = other.funcOrdinal;
112 this->isByOrdinal = other.isByOrdinal;
113}
114
115ExportedFunc::ExportedFunc(const std::string &forwarderName)
116{
117 this->libName = get_dll_shortname(forwarderName);
118 std::string func_name_str = get_func_name(forwarderName);
119 if (func_name_str.length() < 2) {
120 this->funcOrdinal = -1;
121 this->funcName = "";
122 this->isByOrdinal = false;
123#ifdef _DEBUG
124 std::cerr << "Invalid function data" << std::endl;
125#endif
126 return;
127 }
128 if (is_ordinal_string(func_name_str)) {
129 // it is an ordinal in a string form, i.e.: "COMBASE.#110"
130 this->funcOrdinal = peconv::ordinal_string_to_val(func_name_str);
131 this->isByOrdinal = true;
132 this->funcName = "";
133 //std::cout << "[O] Adding forwarded func: " << forwarderName << " parsed: " << this->toString() << std::endl;
134 } else {
135 this->funcName = func_name_str;
136 this->isByOrdinal = false;
137 this->funcOrdinal = 0;
138 //std::cout << "[N] Adding forwarded func:" << this->toString() << std::endl;
139 }
140}
141
142std::string ExportedFunc::formatName(std::string name)
143{
144 if (name.length() == 0 || name.length() == 0) {
145 return "";
146 }
147 std::transform(name.begin(), name.end(), name.begin(), tolower);
148 return name;
149}
150
151std::string ExportedFunc::toString() const
152{
153 if (!isValid()) {
154 return "[Invalid func]";
155 }
156 std::stringstream stream;
157 stream << this->libName;
158 stream << ".";
159 if (!this->isByOrdinal) {
160 stream << this->funcName;
161 stream << " ";
162 }
163 stream << ordinal_to_string(this->funcOrdinal);
164 return stream.str();
165}
166
167std::string ExportedFunc::nameToString() const
168{
169 if (!isValid()) {
170 return "";
171 }
172 if (this->isByOrdinal) {
173 return ordinal_to_string(this->funcOrdinal);
174 }
175 return this->funcName;
176}
std::string funcName
Definition: exported_func.h:62
bool isValid() const
std::string nameToString() const
static std::string formatName(std::string name)
std::string toString() const
A definition of ExportedFunc class - used for storing the details of the exported function....
bool is_ordinal_string(const std::string &str)
std::string ordinal_to_string(DWORD func_ordinal)
size_t forwarder_name_len(BYTE *fPtr)
std::string get_func_name(const std::string &str)
std::string format_dll_func(const std::string &str)
DWORD ordinal_string_to_val(const std::string &str)
std::string get_dll_shortname(const std::string &str)