Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 8 мая!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Давно заметил, что всё-таки языки С/C++ это не самый лучший вариант программирования под Windows. Сейчас появилась масса более современных и удобных языков, например тот же Python - кроссплатформенный язык, очень легок в изучение. Я его изучил буквально за несколько дней по этому курсу - ссылка. Автор постарался, там видеоуроки на удивление легкие и понятные.
Как удалить прогу из самой себя
A: (Yura Nev)
Оригинальная ссылка: нету

Суть в следующем. Пока библиотека загружена в память хоть одним процессом,
писать в нее или удалить не получится, поскольку файл открыт.
Следовательно, его надо закрыть. Для этого используем FreeLibrary, но она
(насколько я понимаю) перед выходом проверяет адрес возврата
(на входе это dword ptr [esp]) на валидность (что-нибудь вроде IsBadCodePtr)
и если адрес плохой, завершает весь процесс.
Eсли просто написать
FreeLibarary(GetModuleHandle(0));
 
 RETADDR:
 
 DeleteFile();
 
 
то адресом возврата будет RETADDR, который находится как раз в нашем файле,
а поскольку мы его выгрузили из процесса, то к нему обратиться нельзя и
FreeLibrary завершит процесс, и все что после RETADDR не выполнится.
Поэтому адресом возврата из FreeLibrary мы делаем DeleteFile, а оттуда
- ExitProcess.

// File "Suicide.cpp" by YuraN
 
 
 
 #ifndef _INC_WINDOWS
 
 #include <windows.h> //Требуется Виндовс.аш
 
 #endif
 
 
 
 void __fastcall Suicide(UINT);
 
 
 
 void __declspec(naked) __fastcall Suicide(UINT exitcode)
 
 {
 
     __asm{
 
     mov ebp,esp     // char name[127];
 
     sub esp,127-4   //   4 байта это адрес возврата, он нам не нужен
 
 
 
     xor ebx,ebx     // ebx = 0
 
 
 
     push 127        // 127              // nSize
 
     push ebp        // dword ptr [name] // lpFilename
 
     push ebx        // 0                // hModule
 
     call dword ptr [GetModuleFileName]  // GetModuleFileName(0,m,127);
 
 
 
     push ecx        // exitcode         // Параметр uExitCode для ExitProcess
 
     push ebx        // 0                // Адрес выхода из ExitProcess (он не используется системой)
 
     push ebp        // dword ptr [name] // Параметр lpFileName для DeleteFile
 
     push dword ptr [ExitProcess]        // Адрес выхода из DeleteFile
 
     push ebx        // 0                // Параметр lpModuleName для GetModuleHandle
 
     call dword ptr [GetModuleHandle]    // GetModuleHandle(0) как
 
     push eax        // HMODULE          // Параметр hLibModule для FreeLibrary
 
     push dword ptr [DeleteFile]         // Адрес выхода из FreeLibrary
 
     jmp  dword ptr [FreeLibrary]        // Вместо call используем jmp
 
     }
 
 }
В этом коде делается следующее:
Первые две строки - выделяем в стеке 127 байт для name
Третья - для оптимизации :)
Следующие четыре - GetModuleFileName(0,name,127);
Остальные -
FreeLibrary(GetModuleHandle(0));
DeleteFile(name);
ExitProcess(0);
- не передавая управление в наш модуль.


<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS