- Статус
- Оффлайн
- Регистрация
- 21 Июн 2025
- Сообщения
- 141
- Реакции
- 35
Есть у кого самописная GetProcAdress, которая вручную ищет функцию в PE файле
Смотрите видео ниже, чтобы узнать, как установить наш сайт в качестве веб-приложения на домашнем экране.
Примечание: Эта возможность может быть недоступна в некоторых браузерах.
Пожалуйста, зарегистрируйтесь или авторизуйтесь, чтобы увидеть содержимое.
#include "CustomGetProcAddress.h"
CustomGetProcAddress::CustomGetProcAddress() {}
CustomGetProcAddress::~CustomGetProcAddress() {}
DWORD CustomGetProcAddress::RvaToFileOffset(DWORD rva, IMAGE_SECTION_HEADER* sections, WORD numSections, DWORD fileAlignment) {
for (WORD i = 0; i < numSections; i++) {
if (rva >= sections[i].VirtualAddress && rva < sections[i].VirtualAddress + sections[i].SizeOfRawData) {
return (rva - sections[i].VirtualAddress + sections[i].PointerToRawData);
}
}
return rva;
}
IMAGE_SECTION_HEADER* CustomGetProcAddress::ParseSections(BYTE* peData, DWORD ntHeadersOffset, WORD& numSections) {
IMAGE_NT_HEADERS* ntHeaders = (IMAGE_NT_HEADERS*)(peData + ntHeadersOffset);
numSections = ntHeaders->FileHeader.NumberOfSections;
DWORD sectionsOffset = ntHeadersOffset + sizeof(IMAGE_NT_HEADERS);
IMAGE_SECTION_HEADER* sections = new IMAGE_SECTION_HEADER[numSections];
for (WORD i = 0; i < numSections; i++) {
memcpy(§ions[i], peData + sectionsOffset + i * sizeof(IMAGE_SECTION_HEADER), sizeof(IMAGE_SECTION_HEADER));
}
return sections;
}
FARPROC CustomGetProcAddress::GetProcAddressCustom(HMODULE moduleBase, LPCSTR procName) {
if (!moduleBase) return nullptr;
BYTE* baseAddr = (BYTE*)moduleBase;
IMAGE_DOS_HEADER* dosHeader = (IMAGE_DOS_HEADER*)baseAddr;
if (dosHeader->e_magic != IMAGE_DOS_SIGNATURE) return nullptr;
IMAGE_NT_HEADERS* ntHeaders = (IMAGE_NT_HEADERS*)(baseAddr + dosHeader->e_lfanew);
if (ntHeaders->Signature != IMAGE_NT_SIGNATURE) return nullptr;
WORD numSections;
IMAGE_SECTION_HEADER* sections = ParseSections(baseAddr, dosHeader->e_lfanew, numSections);
IMAGE_EXPORT_DIRECTORY* exportDir = nullptr;
DWORD exportDirRva = ntHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
if (exportDirRva == 0) {
delete[] sections;
return nullptr;
}
DWORD exportDirOffset = RvaToFileOffset(exportDirRva, sections, numSections, ntHeaders->OptionalHeader.FileAlignment);
exportDir = (IMAGE_EXPORT_DIRECTORY*)(baseAddr + exportDirOffset);
DWORD functionsOffset = RvaToFileOffset(exportDir->AddressOfFunctions, sections, numSections, ntHeaders->OptionalHeader.FileAlignment);
DWORD namesOffset = RvaToFileOffset(exportDir->AddressOfNames, sections, numSections, ntHeaders->OptionalHeader.FileAlignment);
DWORD ordinalsOffset = RvaToFileOffset(exportDir->AddressOfNameOrdinals, sections, numSections, ntHeaders->OptionalHeader.FileAlignment);
DWORD* functions = (DWORD*)(baseAddr + functionsOffset);
DWORD* names = (DWORD*)(baseAddr + namesOffset);
WORD* ordinals = (WORD*)(baseAddr + ordinalsOffset);
FARPROC result = nullptr;
if ((ULONG_PTR)procName > 0xFFFF) {
for (DWORD i = 0; i < exportDir->NumberOfNames; i++) {
char* currentName = (char*)(baseAddr + RvaToFileOffset(names[i], sections, numSections, ntHeaders->OptionalHeader.FileAlignment));
if (strcmp(currentName, procName) == 0) {
WORD ordinal = ordinals[i];
if (ordinal < exportDir->NumberOfFunctions) {
DWORD functionRva = functions[ordinal];
if (functionRva != 0) {
result = (FARPROC)(baseAddr + functionRva);
}
}
break;
}
}
} else {
WORD ordinal = LOWORD(procName) - exportDir->Base;
if (ordinal < exportDir->NumberOfFunctions) {
DWORD functionRva = functions[ordinal];
if (functionRva != 0) {
result = (FARPROC)(baseAddr + functionRva);
}
}
}
delete[] sections;
return result;
}
FARPROC CustomGetProcAddress::GetProcAddressCustom(HMODULE moduleBase, WORD ordinal) {
return GetProcAddressCustom(moduleBase, (LPCSTR)ordinal);
}
#pragma once
#include <Windows.h>
#include <string>
class CustomGetProcAddress {
private:
struct IMAGE_SECTION_HEADER {
char Name[8];
union {
DWORD PhysicalAddress;
DWORD VirtualSize;
} Misc;
DWORD VirtualAddress;
DWORD SizeOfRawData;
DWORD PointerToRawData;
DWORD PointerToRelocations;
DWORD PointerToLinenumbers;
WORD NumberOfRelocations;
WORD NumberOfLinenumbers;
DWORD Characteristics;
};
struct IMAGE_EXPORT_DIRECTORY {
DWORD Characteristics;
DWORD TimeDateStamp;
WORD MajorVersion;
WORD MinorVersion;
DWORD Name;
DWORD Base;
DWORD NumberOfFunctions;
DWORD NumberOfNames;
DWORD AddressOfFunctions;
DWORD AddressOfNames;
DWORD AddressOfNameOrdinals;
};
DWORD RvaToFileOffset(DWORD rva, IMAGE_SECTION_HEADER* sections, WORD numSections, DWORD fileAlignment);
IMAGE_SECTION_HEADER* ParseSections(BYTE* peData, DWORD ntHeadersOffset, WORD& numSections);
public:
CustomGetProcAddress();
~CustomGetProcAddress();
FARPROC GetProcAddressCustom(HMODULE moduleBase, LPCSTR procName);
FARPROC GetProcAddressCustom(HMODULE moduleBase, WORD ordinal);
};
#include "CustomGetProcAddress.h"
CustomGetProcAddress::CustomGetProcAddress() {}
CustomGetProcAddress::~CustomGetProcAddress() {}
bool CustomGetProcAddress::IsPE64(BYTE* peData) {
IMAGE_DOS_HEADER* dosHeader = (IMAGE_DOS_HEADER*)peData;
if (dosHeader->e_magic != IMAGE_DOS_SIGNATURE) return false;
IMAGE_NT_HEADERS* ntHeaders = (IMAGE_NT_HEADERS*)(peData + dosHeader->e_lfanew);
if (ntHeaders->Signature != IMAGE_NT_SIGNATURE) return false;
return ntHeaders->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC;
}
bool CustomGetProcAddress::IsValidPointer(BYTE* baseAddr, DWORD size, BYTE* ptr) {
return ptr >= baseAddr && ptr < baseAddr + size;
}
bool CustomGetProcAddress::IsForwardedExport(DWORD functionRva, DWORD exportDirRva, DWORD exportDirSize, BYTE* baseAddr, std::string& forwardedModule, std::string& forwardedFunction) {
if (functionRva >= exportDirRva && functionRva < exportDirRva + exportDirSize) {
char* forwardStr = (char*)(baseAddr + functionRva);
if (strlen(forwardStr) > 0) {
char* dot = strchr(forwardStr, '.');
if (dot) {
*dot = '\0';
forwardedModule = forwardStr;
forwardedFunction = dot + 1;
*dot = '.';
return true;
}
}
}
return false;
}
std::string CustomGetProcAddress::FixModuleName(const std::string& moduleName) {
std::string fixed = moduleName;
if (fixed.find('.') == std::string::npos) {
fixed += ".dll";
}
return fixed;
}
FARPROC CustomGetProcAddress::GetProcAddressCustom(HMODULE moduleBase, LPCSTR procName) {
if (!moduleBase) return nullptr;
BYTE* baseAddr = (BYTE*)moduleBase;
IMAGE_DOS_HEADER* dosHeader = (IMAGE_DOS_HEADER*)baseAddr;
if (dosHeader->e_magic != IMAGE_DOS_SIGNATURE) return nullptr;
DWORD ntHeadersOffset = dosHeader->e_lfanew;
bool isPE64 = IsPE64(baseAddr);
if (isPE64) {
IMAGE_NT_HEADERS64* ntHeaders64 = (IMAGE_NT_HEADERS64*)(baseAddr + ntHeadersOffset);
if (ntHeaders64->Signature != IMAGE_NT_SIGNATURE) return nullptr;
DWORD exportDirRva = ntHeaders64->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
DWORD exportDirSize = ntHeaders64->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size;
if (exportDirRva == 0) return nullptr;
IMAGE_EXPORT_DIRECTORY_CUSTOM* exportDir = (IMAGE_EXPORT_DIRECTORY_CUSTOM*)(baseAddr + exportDirRva);
if (!IsValidPointer(baseAddr, ntHeaders64->OptionalHeader.SizeOfImage, (BYTE*)exportDir)) return nullptr;
DWORD* functions = (DWORD*)(baseAddr + exportDir->AddressOfFunctions);
DWORD* names = (DWORD*)(baseAddr + exportDir->AddressOfNames);
WORD* ordinals = (WORD*)(baseAddr + exportDir->AddressOfNameOrdinals);
if (!IsValidPointer(baseAddr, ntHeaders64->OptionalHeader.SizeOfImage, (BYTE*)functions) ||
!IsValidPointer(baseAddr, ntHeaders64->OptionalHeader.SizeOfImage, (BYTE*)names) ||
!IsValidPointer(baseAddr, ntHeaders64->OptionalHeader.SizeOfImage, (BYTE*)ordinals)) {
return nullptr;
}
FARPROC result = nullptr;
if (HIWORD(procName) != 0) {
for (DWORD i = 0; i < exportDir->NumberOfNames; i++) {
if (!IsValidPointer(baseAddr, ntHeaders64->OptionalHeader.SizeOfImage, (BYTE*)(names + i))) break;
char* currentName = (char*)(baseAddr + names[i]);
if (!IsValidPointer(baseAddr, ntHeaders64->OptionalHeader.SizeOfImage, (BYTE*)currentName)) continue;
if (strcmp(currentName, procName) == 0) {
if (!IsValidPointer(baseAddr, ntHeaders64->OptionalHeader.SizeOfImage, (BYTE*)(ordinals + i))) break;
WORD ordinal = ordinals[i];
if (ordinal < exportDir->NumberOfFunctions) {
if (!IsValidPointer(baseAddr, ntHeaders64->OptionalHeader.SizeOfImage, (BYTE*)(functions + ordinal))) break;
DWORD functionRva = functions[ordinal];
if (functionRva != 0) {
std::string forwardedModule, forwardedFunction;
if (IsForwardedExport(functionRva, exportDirRva, exportDirSize, baseAddr, forwardedModule, forwardedFunction)) {
std::string fixedModule = FixModuleName(forwardedModule);
HMODULE forwardedMod = GetModuleHandleA(fixedModule.c_str());
if (!forwardedMod) {
forwardedMod = LoadLibraryA(fixedModule.c_str());
}
if (forwardedMod) {
return GetProcAddress(forwardedMod, forwardedFunction.c_str());
}
} else {
result = (FARPROC)(baseAddr + functionRva);
}
}
}
break;
}
}
} else {
WORD ordinal = LOWORD(procName) - exportDir->Base;
if (ordinal < exportDir->NumberOfFunctions) {
if (!IsValidPointer(baseAddr, ntHeaders64->OptionalHeader.SizeOfImage, (BYTE*)(functions + ordinal))) return nullptr;
DWORD functionRva = functions[ordinal];
if (functionRva != 0) {
std::string forwardedModule, forwardedFunction;
if (IsForwardedExport(functionRva, exportDirRva, exportDirSize, baseAddr, forwardedModule, forwardedFunction)) {
std::string fixedModule = FixModuleName(forwardedModule);
HMODULE forwardedMod = GetModuleHandleA(fixedModule.c_str());
if (!forwardedMod) {
forwardedMod = LoadLibraryA(fixedModule.c_str());
}
if (forwardedMod) {
return GetProcAddress(forwardedMod, forwardedFunction.c_str());
}
} else {
result = (FARPROC)(baseAddr + functionRva);
}
}
}
}
return result;
} else {
IMAGE_NT_HEADERS* ntHeaders = (IMAGE_NT_HEADERS*)(baseAddr + ntHeadersOffset);
if (ntHeaders->Signature != IMAGE_NT_SIGNATURE) return nullptr;
DWORD exportDirRva = ntHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
DWORD exportDirSize = ntHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size;
if (exportDirRva == 0) return nullptr;
IMAGE_EXPORT_DIRECTORY_CUSTOM* exportDir = (IMAGE_EXPORT_DIRECTORY_CUSTOM*)(baseAddr + exportDirRva);
if (!IsValidPointer(baseAddr, ntHeaders->OptionalHeader.SizeOfImage, (BYTE*)exportDir)) return nullptr;
DWORD* functions = (DWORD*)(baseAddr + exportDir->AddressOfFunctions);
DWORD* names = (DWORD*)(baseAddr + exportDir->AddressOfNames);
WORD* ordinals = (WORD*)(baseAddr + exportDir->AddressOfNameOrdinals);
if (!IsValidPointer(baseAddr, ntHeaders->OptionalHeader.SizeOfImage, (BYTE*)functions) ||
!IsValidPointer(baseAddr, ntHeaders->OptionalHeader.SizeOfImage, (BYTE*)names) ||
!IsValidPointer(baseAddr, ntHeaders->OptionalHeader.SizeOfImage, (BYTE*)ordinals)) {
return nullptr;
}
FARPROC result = nullptr;
if (HIWORD(procName) != 0) {
for (DWORD i = 0; i < exportDir->NumberOfNames; i++) {
if (!IsValidPointer(baseAddr, ntHeaders->OptionalHeader.SizeOfImage, (BYTE*)(names + i))) break;
char* currentName = (char*)(baseAddr + names[i]);
if (!IsValidPointer(baseAddr, ntHeaders->OptionalHeader.SizeOfImage, (BYTE*)currentName)) continue;
if (strcmp(currentName, procName) == 0) {
if (!IsValidPointer(baseAddr, ntHeaders->OptionalHeader.SizeOfImage, (BYTE*)(ordinals + i))) break;
WORD ordinal = ordinals[i];
if (ordinal < exportDir->NumberOfFunctions) {
if (!IsValidPointer(baseAddr, ntHeaders->OptionalHeader.SizeOfImage, (BYTE*)(functions + ordinal))) break;
DWORD functionRva = functions[ordinal];
if (functionRva != 0) {
std::string forwardedModule, forwardedFunction;
if (IsForwardedExport(functionRva, exportDirRva, exportDirSize, baseAddr, forwardedModule, forwardedFunction)) {
std::string fixedModule = FixModuleName(forwardedModule);
HMODULE forwardedMod = GetModuleHandleA(fixedModule.c_str());
if (!forwardedMod) {
forwardedMod = LoadLibraryA(fixedModule.c_str());
}
if (forwardedMod) {
return GetProcAddress(forwardedMod, forwardedFunction.c_str());
}
} else {
result = (FARPROC)(baseAddr + functionRva);
}
}
}
break;
}
}
} else {
WORD ordinal = LOWORD(procName) - exportDir->Base;
if (ordinal < exportDir->NumberOfFunctions) {
if (!IsValidPointer(baseAddr, ntHeaders->OptionalHeader.SizeOfImage, (BYTE*)(functions + ordinal))) return nullptr;
DWORD functionRva = functions[ordinal];
if (functionRva != 0) {
std::string forwardedModule, forwardedFunction;
if (IsForwardedExport(functionRva, exportDirRva, exportDirSize, baseAddr, forwardedModule, forwardedFunction)) {
std::string fixedModule = FixModuleName(forwardedModule);
HMODULE forwardedMod = GetModuleHandleA(fixedModule.c_str());
if (!forwardedMod) {
forwardedMod = LoadLibraryA(fixedModule.c_str());
}
if (forwardedMod) {
return GetProcAddress(forwardedMod, forwardedFunction.c_str());
}
} else {
result = (FARPROC)(baseAddr + functionRva);
}
}
}
}
return result;
}
}
FARPROC CustomGetProcAddress::GetProcAddressCustom(HMODULE moduleBase, WORD ordinal) {
return GetProcAddressCustom(moduleBase, (LPCSTR)ordinal);
}
#pragma once
#include <Windows.h>
#include <string>
class CustomGetProcAddress {
private:
struct IMAGE_EXPORT_DIRECTORY_CUSTOM {
DWORD Characteristics;
DWORD TimeDateStamp;
WORD MajorVersion;
WORD MinorVersion;
DWORD Name;
DWORD Base;
DWORD NumberOfFunctions;
DWORD NumberOfNames;
DWORD AddressOfFunctions;
DWORD AddressOfNames;
DWORD AddressOfNameOrdinals;
};
bool IsPE64(BYTE* peData);
bool IsForwardedExport(DWORD functionRva, DWORD exportDirRva, DWORD exportDirSize, BYTE* baseAddr, std::string& forwardedModule, std::string& forwardedFunction);
std::string FixModuleName(const std::string& moduleName);
bool IsValidPointer(BYTE* baseAddr, DWORD size, BYTE* ptr);
public:
CustomGetProcAddress();
~CustomGetProcAddress();
FARPROC GetProcAddressCustom(HMODULE moduleBase, LPCSTR procName);
FARPROC GetProcAddressCustom(HMODULE moduleBase, WORD ordinal);
};
Скрытое содержимоеМожет хуево сделал но чем смог тем помог
сзз:#include "CustomGetProcAddress.h" CustomGetProcAddress::CustomGetProcAddress() {} CustomGetProcAddress::~CustomGetProcAddress() {} DWORD CustomGetProcAddress::RvaToFileOffset(DWORD rva, IMAGE_SECTION_HEADER* sections, WORD numSections, DWORD fileAlignment) { for (WORD i = 0; i < numSections; i++) { if (rva >= sections[i].VirtualAddress && rva < sections[i].VirtualAddress + sections[i].SizeOfRawData) { return (rva - sections[i].VirtualAddress + sections[i].PointerToRawData); } } return rva; } IMAGE_SECTION_HEADER* CustomGetProcAddress::ParseSections(BYTE* peData, DWORD ntHeadersOffset, WORD& numSections) { IMAGE_NT_HEADERS* ntHeaders = (IMAGE_NT_HEADERS*)(peData + ntHeadersOffset); numSections = ntHeaders->FileHeader.NumberOfSections; DWORD sectionsOffset = ntHeadersOffset + sizeof(IMAGE_NT_HEADERS); IMAGE_SECTION_HEADER* sections = new IMAGE_SECTION_HEADER[numSections]; for (WORD i = 0; i < numSections; i++) { memcpy(§ions[i], peData + sectionsOffset + i * sizeof(IMAGE_SECTION_HEADER), sizeof(IMAGE_SECTION_HEADER)); } return sections; } FARPROC CustomGetProcAddress::GetProcAddressCustom(HMODULE moduleBase, LPCSTR procName) { if (!moduleBase) return nullptr; BYTE* baseAddr = (BYTE*)moduleBase; IMAGE_DOS_HEADER* dosHeader = (IMAGE_DOS_HEADER*)baseAddr; if (dosHeader->e_magic != IMAGE_DOS_SIGNATURE) return nullptr; IMAGE_NT_HEADERS* ntHeaders = (IMAGE_NT_HEADERS*)(baseAddr + dosHeader->e_lfanew); if (ntHeaders->Signature != IMAGE_NT_SIGNATURE) return nullptr; WORD numSections; IMAGE_SECTION_HEADER* sections = ParseSections(baseAddr, dosHeader->e_lfanew, numSections); IMAGE_EXPORT_DIRECTORY* exportDir = nullptr; DWORD exportDirRva = ntHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress; if (exportDirRva == 0) { delete[] sections; return nullptr; } DWORD exportDirOffset = RvaToFileOffset(exportDirRva, sections, numSections, ntHeaders->OptionalHeader.FileAlignment); exportDir = (IMAGE_EXPORT_DIRECTORY*)(baseAddr + exportDirOffset); DWORD functionsOffset = RvaToFileOffset(exportDir->AddressOfFunctions, sections, numSections, ntHeaders->OptionalHeader.FileAlignment); DWORD namesOffset = RvaToFileOffset(exportDir->AddressOfNames, sections, numSections, ntHeaders->OptionalHeader.FileAlignment); DWORD ordinalsOffset = RvaToFileOffset(exportDir->AddressOfNameOrdinals, sections, numSections, ntHeaders->OptionalHeader.FileAlignment); DWORD* functions = (DWORD*)(baseAddr + functionsOffset); DWORD* names = (DWORD*)(baseAddr + namesOffset); WORD* ordinals = (WORD*)(baseAddr + ordinalsOffset); FARPROC result = nullptr; if ((ULONG_PTR)procName > 0xFFFF) { for (DWORD i = 0; i < exportDir->NumberOfNames; i++) { char* currentName = (char*)(baseAddr + RvaToFileOffset(names[i], sections, numSections, ntHeaders->OptionalHeader.FileAlignment)); if (strcmp(currentName, procName) == 0) { WORD ordinal = ordinals[i]; if (ordinal < exportDir->NumberOfFunctions) { DWORD functionRva = functions[ordinal]; if (functionRva != 0) { result = (FARPROC)(baseAddr + functionRva); } } break; } } } else { WORD ordinal = LOWORD(procName) - exportDir->Base; if (ordinal < exportDir->NumberOfFunctions) { DWORD functionRva = functions[ordinal]; if (functionRva != 0) { result = (FARPROC)(baseAddr + functionRva); } } } delete[] sections; return result; } FARPROC CustomGetProcAddress::GetProcAddressCustom(HMODULE moduleBase, WORD ordinal) { return GetProcAddressCustom(moduleBase, (LPCSTR)ordinal); }
h:#pragma once #include <Windows.h> #include <string> class CustomGetProcAddress { private: struct IMAGE_SECTION_HEADER { char Name[8]; union { DWORD PhysicalAddress; DWORD VirtualSize; } Misc; DWORD VirtualAddress; DWORD SizeOfRawData; DWORD PointerToRawData; DWORD PointerToRelocations; DWORD PointerToLinenumbers; WORD NumberOfRelocations; WORD NumberOfLinenumbers; DWORD Characteristics; }; struct IMAGE_EXPORT_DIRECTORY { DWORD Characteristics; DWORD TimeDateStamp; WORD MajorVersion; WORD MinorVersion; DWORD Name; DWORD Base; DWORD NumberOfFunctions; DWORD NumberOfNames; DWORD AddressOfFunctions; DWORD AddressOfNames; DWORD AddressOfNameOrdinals; }; DWORD RvaToFileOffset(DWORD rva, IMAGE_SECTION_HEADER* sections, WORD numSections, DWORD fileAlignment); IMAGE_SECTION_HEADER* ParseSections(BYTE* peData, DWORD ntHeadersOffset, WORD& numSections); public: CustomGetProcAddress(); ~CustomGetProcAddress(); FARPROC GetProcAddressCustom(HMODULE moduleBase, LPCSTR procName); FARPROC GetProcAddressCustom(HMODULE moduleBase, WORD ordinal); };
пиздецIsValidPointer
ода, c-style касты(BYTE*)
зачем, когда выше ты подключил Windows.h???struct IMAGE_EXPORT_DIRECTORY_CUSTOM {
int StringCompare(const char* s1, const char* s2)
{
while (*s1 && (*s1 == *s2)) {
s1++; s2++;
}
return *(unsigned char*)s1 - *(unsigned char*)s2;
}
PVOID MyGetProcAddress(PVOID moduleBase, const char* funcName)
{
PIMAGE_DOS_HEADER dos = (PIMAGE_DOS_HEADER)moduleBase;
PIMAGE_NT_HEADERS nt = (PIMAGE_NT_HEADERS)((BYTE*)moduleBase + dos->e_lfanew);
IMAGE_DATA_DIRECTORY exportDir = nt->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];
if (exportDir.VirtualAddress == 0) return NULL;
PIMAGE_EXPORT_DIRECTORY exports = (PIMAGE_EXPORT_DIRECTORY)((BYTE*)moduleBase + exportDir.VirtualAddress);
DWORD* nameArray = (DWORD*)((BYTE*)moduleBase + exports->AddressOfNames);
DWORD* funcArray = (DWORD*)((BYTE*)moduleBase + exports->AddressOfFunctions);
WORD* ordinalArray = (WORD*)((BYTE*)moduleBase + exports->AddressOfNameOrdinals);
for (DWORD i = 0; i < exports->NumberOfNames; i++) {
const char* currentName = (const char*)((BYTE*)moduleBase + nameArray[i]);
if (StringCompare(currentName, funcName) == 0) {
WORD ordinal = ordinalArray[i];
DWORD funcRVA = funcArray[ordinal];
return (PVOID)((BYTE*)moduleBase + funcRVA);
}
}
return NULL;
}
Пожалуйста, зарегистрируйтесь или авторизуйтесь, чтобы увидеть содержимое.
EchidnaСкрытое содержимое
хеши просто существуют...strcmp тоже самописная
а зачем по хэшу загружать каждую функцию, ему для динамики нужнохеши просто существуют...
ебать, я в ахуе. теперь хеш это статическяа хуйня, привет програмирование, купить книжку с++ учить бесплатно. что ты мать его такое несешь?ему для динамики нужно
брат от всей души для тебяхеши просто существуют...
1. быстроа зачем по хэшу загружать каждую функцию, ему для динамики нужно
то есть тот факт что он не хочет использовать обычный GetProcAddress тебя не смущает? а ну да всегда пишу свою функцию импорта для любой проги.я уверен человек не пишет малварь или чет подобное
то есть тот факт что он не хочет использовать обычный GetProcAddress тебя не смущает? а ну да всегда пишу свою функцию импорта для любой проги.
я бы поспорил про скоростьбрат от всей души для тебя
Посмотреть вложение 325866
1. быстро
2. строчку не палить
не надо доёбываться до второго пожалуйста, есть ещё первое
ну тебя не наталкивает на мысль тот факт, что edr и av должны быть ещё более защищены от анализа чем вирус или чит? ну блять тип, ну ты хоть подумай прежде чем писать то.если что edr/av тоже может юзать свои индивидуальные функции
это poc для статьи и в ней про это пишетсяну тебя не наталкивает на мысль тот факт, что edr и av должны быть ещё более защищены от анализа чем вирус или чит? ну блять тип, ну ты хоть подумай прежде чем писать то.
В плане?ну тебя не наталкивает на мысль тот факт, что edr и av должны быть ещё более защищены от анализа чем вирус или чит? ну блять тип, ну ты хоть подумай прежде чем писать то.
я читал статью colby57 про реверс малвари с бустиВ плане?
Вызывая функцию по хэшу? Не думаю что это защита. Да и в целом любой малварь-разработчик это в первую очередь школьник с нейросетью под С# и сервером тяп-ляп с кучей уязвимостей
Даже если он грузит функции по хэшу - соотвественно есть определенный алгоритм, который можно детектить типа - ROR13/на M еще начинался какой то, название забыл, но он тоже довольно популярен.
я читал статью colby57 про реверс малвари с бусти
не поверишь, он в иде спустя пару предложений в статье обнаружил загрузку функций по хэшу![]()
твой колби снимает протекторы по типу вмп какими-то своими способами.я читал статью colby57 про реверс малвари с бусти
не поверишь, он в иде спустя пару предложений в статье обнаружил загрузку функций по хэшу
Посмотреть вложение 325869
типа вот…
о какой защите ваще речь идет?
ну да, люмма же ставила наверное обосанный вмп с целью защиты от детектов который детектит почти любой сканертвой колби снимает протекторы по типу вмп какими-то своими способами.
во первых какой далбаеб функцию resolve_api_by_hash не заинлайнил?
во вторых почему ты считаешь что у каждого реализация именно такая? зачем то её еще в константу (.data) сохранять (судя по цвету)
ты можешь вообще ничего не думать, почему то это все равно встречается повсеместно. И очень ахуено ссылатся на алгоритмы по типу ROR13 и по видимому MD5 когда каждый школьник уже 10 тысяч раз создал свою разновидность добавив туда рандомной соли.В плане?
Вызывая функцию по хэшу? Не думаю что это защита. Да и в целом любой малварь-разработчик это в первую очередь школьник с нейросетью под С# и сервером тяп-ляп с кучей уязвимостей
Даже если он грузит функции по хэшу - соотвественно есть определенный алгоритм, который можно детектить типа - ROR13/на M еще начинался какой то, название забыл, но он тоже довольно популярен.
Проект предоставляет различный материал, относящийся к сфере киберспорта, программирования, ПО для игр, а также позволяет его участникам общаться на многие другие темы. Почта для жалоб: admin@yougame.biz