Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Вопрос Самописная функция GetProcAdress

Пожалуйста, зарегистрируйтесь или авторизуйтесь, чтобы увидеть содержимое.

Может хуево сделал но чем смог тем помог

сзз:
Expand Collapse Copy
#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(&sections[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:
Expand Collapse Copy
#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);
};
 
Переделал прошлое не очень было

cpp:
Expand Collapse Copy
#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);
}





C++:
Expand Collapse Copy
#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);
};
 
Скрытое содержимоеМожет хуево сделал но чем смог тем помог

сзз:
Expand Collapse Copy
#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(&sections[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:
Expand Collapse Copy
#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);
};
пиздец
ода, c-style касты
struct IMAGE_EXPORT_DIRECTORY_CUSTOM {
зачем, когда выше ты подключил Windows.h???
 
у меня есть, сразу говорю, strcmp тоже самописная, думаю тебе понятно будет, это даже плюс будто
1769453829515.png

f:
Expand Collapse Copy
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;
}

1769454076723.png
 
хеши просто существуют...
а зачем по хэшу загружать каждую функцию, ему для динамики нужно
я уверен человек не пишет малварь или чет подобное, чувак расслабься чил
IMG_2197.jpeg
 
ему для динамики нужно
ебать, я в ахуе. теперь хеш это статическяа хуйня, привет програмирование, купить книжку с++ учить бесплатно. что ты мать его такое несешь?
вообще что бы это значило для динамики?
 
хеши просто существуют...
брат от всей души для тебя
1769459604083.png


а зачем по хэшу загружать каждую функцию, ему для динамики нужно
1. быстро
2. строчку не палить

не надо доёбываться до второго пожалуйста, есть ещё первое
 
я уверен человек не пишет малварь или чет подобное
то есть тот факт что он не хочет использовать обычный GetProcAddress тебя не смущает? а ну да всегда пишу свою функцию импорта для любой проги.
 
то есть тот факт что он не хочет использовать обычный GetProcAddress тебя не смущает? а ну да всегда пишу свою функцию импорта для любой проги.

IMG_2201.png

если что edr/av тоже может юзать свои индивидуальные функции
брат от всей души для тебя
Посмотреть вложение 325866


1. быстро
2. строчку не палить

не надо доёбываться до второго пожалуйста, есть ещё первое
я бы поспорил про скорость
 
если что edr/av тоже может юзать свои индивидуальные функции
ну тебя не наталкивает на мысль тот факт, что edr и av должны быть ещё более защищены от анализа чем вирус или чит? ну блять тип, ну ты хоть подумай прежде чем писать то.
 
ну тебя не наталкивает на мысль тот факт, что edr и av должны быть ещё более защищены от анализа чем вирус или чит? ну блять тип, ну ты хоть подумай прежде чем писать то.
это poc для статьи и в ней про это пишется
 
ну тебя не наталкивает на мысль тот факт, что edr и av должны быть ещё более защищены от анализа чем вирус или чит? ну блять тип, ну ты хоть подумай прежде чем писать то.
В плане?
Вызывая функцию по хэшу? Не думаю что это защита. Да и в целом любой малварь-разработчик это в первую очередь школьник с нейросетью под С# и сервером тяп-ляп с кучей уязвимостей

Даже если он грузит функции по хэшу - соотвественно есть определенный алгоритм, который можно детектить типа - ROR13/на M еще начинался какой то, название забыл, но он тоже довольно популярен.
 
В плане?
Вызывая функцию по хэшу? Не думаю что это защита. Да и в целом любой малварь-разработчик это в первую очередь школьник с нейросетью под С# и сервером тяп-ляп с кучей уязвимостей

Даже если он грузит функции по хэшу - соотвественно есть определенный алгоритм, который можно детектить типа - ROR13/на M еще начинался какой то, название забыл, но он тоже довольно популярен.
я читал статью colby57 про реверс малвари с бусти
не поверишь, он в иде спустя пару предложений в статье обнаружил загрузку функций по хэшу😳
я читал статью colby57 про реверс малвари с бусти
не поверишь, он в иде спустя пару предложений в статье обнаружил загрузку функций по хэшу😳
IMG_2202.png

типа вот…
о какой защите ваще речь идет?
 
я читал статью colby57 про реверс малвари с бусти
не поверишь, он в иде спустя пару предложений в статье обнаружил загрузку функций по хэшу😳

Посмотреть вложение 325869
типа вот…
о какой защите ваще речь идет?
твой колби снимает протекторы по типу вмп какими-то своими способами.
во первых какой далбаеб функцию resolve_api_by_hash не заинлайнил?
во вторых почему ты считаешь что у каждого реализация именно такая? зачем то её еще в константу (.data) сохранять (судя по цвету)
 
твой колби снимает протекторы по типу вмп какими-то своими способами.
во первых какой далбаеб функцию resolve_api_by_hash не заинлайнил?
во вторых почему ты считаешь что у каждого реализация именно такая? зачем то её еще в константу (.data) сохранять (судя по цвету)
ну да, люмма же ставила наверное обосанный вмп с целью защиты от детектов который детектит почти любой сканер
 
В плане?
Вызывая функцию по хэшу? Не думаю что это защита. Да и в целом любой малварь-разработчик это в первую очередь школьник с нейросетью под С# и сервером тяп-ляп с кучей уязвимостей

Даже если он грузит функции по хэшу - соотвественно есть определенный алгоритм, который можно детектить типа - ROR13/на M еще начинался какой то, название забыл, но он тоже довольно популярен.
ты можешь вообще ничего не думать, почему то это все равно встречается повсеместно. И очень ахуено ссылатся на алгоритмы по типу ROR13 и по видимому MD5 когда каждый школьник уже 10 тысяч раз создал свою разновидность добавив туда рандомной соли.
Давай я скажу, что любое хеширование бесполезно, ведь его можно детектить(а что тебе это даст? ты собрался брут форсить хеш???)
 
Назад
Сверху Снизу