- 13
- 37
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Позволяет сначала выгрузить свой модуль а затем и удалить не прибегая к подгрузке других плагинов.
Автор: ntharbinger
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();
Последнее редактирование: