Исходник [C++] x86 - Выгрузка + самоудаление

ntharbinger

Потрачен
Автор темы
13
36
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Позволяет сначала выгрузить свой модуль а затем и удалить не прибегая к подгрузке других плагинов.
C++:
PVOID strq = nullptr;
HMODULE hMDL = nullptr;
DWORD __stdcall SafeUnload()
{
    __asm
    {
        pusha
        pushad
        pushfd
        push hMDL
        call FreeLibrary
        lea eax, strq
        push eax
        call DeleteFileA
        popfd
        popad
        popa
    }
    return 0;
}
DWORD __stdcall UnloadEnd() { return 0; } // WARNING: Эта функция должна находится строго под SafeUnload иначе вам не правильно определит размер кода.
void __stdcall UnloadMeAndDelete()
{
   
    DWORD unload_size = ((DWORD)UnloadEnd - (DWORD)SafeUnload);
    PVOID unloader = VirtualAlloc(0, unload_size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
    memcpy(unloader, SafeUnload, unload_size); byte call = 0xE8;
    memcpy((void*)((DWORD)unloader + 29), &call, 1);
    auto FindDelta = [](DWORD DestinyAddress, DWORD SourceAddress, size_t InstructionLength) -> unsigned int
    {
        return DestinyAddress - (SourceAddress + InstructionLength);
    };
    DWORD addr = FindDelta((DWORD)&DeleteFileA, ((DWORD)unloader + 29), 5);
    memcpy((void*)((DWORD)unloader + 30), &addr, 4);
    byte nop = 0x90; memcpy((void*)((DWORD)unloader + 34), &nop, 1);
    PVOID dllPath = VirtualAlloc(0, 256, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
    DWORD pathAddr = (DWORD)dllPath; memcpy((void*)((DWORD)unloader + 24), &pathAddr, 4);
    CHAR FileName[MAX_PATH + 1]; GetModuleFileNameA(hMDL, FileName, MAX_PATH + 1);
    memcpy(dllPath, FileName, strlen(FileName));
    typedef DWORD(__stdcall *UnloadMe)(); UnloadMe UnloadIt = (UnloadMe)unloader;
    CreateThread(0, 0, (LPTHREAD_START_ROUTINE)UnloadIt, 0, 0, 0);
}
// В dllmain`e где у вас PROCESS_ATTACH вставляем
hMDL = hModule;
// Пример использования
UnloadMeAndDelete();
Автор: ntharbinger
 
Последнее редактирование:

SiTrak

Известный
193
251
Не забывайте, что при выгрузке надо снимать хуки