28 if (curr_name == NULL || wanted_name == NULL)
return false;
30 size_t wanted_name_len = strlen(wanted_name);
31 size_t curr_name_len = strlen(curr_name);
33 if (curr_name_len != wanted_name_len)
return false;
35 for (
size_t i = 0; i < wanted_name_len; i++) {
36 char c1 = curr_name[i];
37 char c2 = wanted_name[i];
40 if (c1 != c2)
return false;
45bool is_ordinal(IMAGE_EXPORT_DIRECTORY *exp, LPCSTR func_name)
47 ULONGLONG base = exp->Base;
48 ULONGLONG max_ord = base + exp->NumberOfFunctions;
49 ULONGLONG name_ptr_val = (ULONGLONG)func_name;
50 if (name_ptr_val >= base && name_ptr_val < max_ord) {
56FARPROC
get_export_by_ord(PVOID modulePtr, IMAGE_EXPORT_DIRECTORY* exp, DWORD wanted_ordinal)
58 SIZE_T functCount = exp->NumberOfFunctions;
59 DWORD funcsListRVA = exp->AddressOfFunctions;
60 DWORD ordBase = exp->Base;
65 for (DWORD i = 0; i < functCount; i++) {
66 DWORD ordinal = ordBase + i;
67 if (ordinal != wanted_ordinal)
continue;
69 DWORD* funcRVA = (DWORD*)(funcsListRVA + (BYTE*) modulePtr + i *
sizeof(DWORD));
71 LOG_ERROR(
"Invalid RVA of exported function");
74 BYTE* fPtr = (BYTE*) modulePtr + (*funcRVA);
76 LOG_ERROR(
"Invalid pointer to exported function");
80 LOG_WARNING(
"Forwarded function: [%lu -> %p] cannot be resolved.", wanted_ordinal, fPtr);
83 return (FARPROC) fPtr;
91 if (!modSize)
return 0;
96 SIZE_T namesCount = exp->NumberOfNames;
97 DWORD funcNamesListRVA = exp->AddressOfNames;
100 DWORD* nameRVAs = (DWORD*)(funcNamesListRVA + (ULONG_PTR)modulePtr);
102 for (i = 0; i < namesCount; i++) {
103 if (!
validate_ptr(modulePtr, modSize, &nameRVAs[i],
sizeof(DWORD))) {
106 DWORD nameRVA = nameRVAs[i];
110 LPSTR name = (LPSTR)(nameRVA + (BYTE*) modulePtr);
114 names_list.push_back(name);
123 if (!modSize)
return nullptr;
126 if (!exp)
return nullptr;
128 SIZE_T namesCount = exp->NumberOfNames;
130 DWORD funcsListRVA = exp->AddressOfFunctions;
131 DWORD funcNamesListRVA = exp->AddressOfNames;
132 DWORD namesOrdsListRVA = exp->AddressOfNameOrdinals;
135 LOG_DEBUG(
"Getting function by ordinal.");
140 LOG_ERROR(
"Invalid pointer to the name.");
144 for (SIZE_T i = 0; i < namesCount; i++) {
145 DWORD* nameRVA = (DWORD*)(funcNamesListRVA + (BYTE*) modulePtr + i *
sizeof(DWORD));
146 WORD* nameIndex = (WORD*)(namesOrdsListRVA + (BYTE*) modulePtr + i *
sizeof(WORD));
147 if (!
validate_ptr(modulePtr, modSize, nameRVA,
sizeof(DWORD))
148 || !
validate_ptr(modulePtr, modSize, nameIndex,
sizeof(WORD)))
150 LOG_ERROR(
"Invalid pointer to exported name RVA or index");
153 DWORD* funcRVA = (DWORD*)(funcsListRVA + (BYTE*) modulePtr + (*nameIndex) *
sizeof(DWORD));
154 if (!
validate_ptr(modulePtr, modSize, funcRVA,
sizeof(DWORD))) {
155 LOG_ERROR(
"Invalid pointer to exported function RVA");
158 LPSTR name = (LPSTR)(*nameRVA + (BYTE*) modulePtr);
160 LOG_ERROR(
"Invalid pointer to exported function name");
166 BYTE* fPtr = (BYTE*)modulePtr + (*funcRVA);
168 LOG_ERROR(
"Invalid pointer to exported function");
172 LOG_WARNING(
"Forwarded function: [%s -> %p] cannot be resolved.", name, fPtr);
175 return (FARPROC) fPtr;