Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Программа удаляет себя 
:(
    Опции темы
BaDP1nG
Дата 21.7.2008, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 12.11.2007

Репутация: нет
Всего: нет



Проблема в том, что код, вроде бы, корректен, но, как это, зачастую, бывает- не работает =( Помогите исправить, будьте добры. Варианты с бат-файлами и подобное- не предлагать!
Код

char buf[MAX_PATH];
HMODULE module;
module = GetModuleHandle("Kernel32");
GetModuleFileName(module, buf, MAX_PATH);
DWORD hExitProcess =(DWORD) GetProcAddress(module, "ExitProcess");
DWORD hDeleteFile =(DWORD) GetProcAddress(module, "DeleteFile");
DWORD hUnmapViewOfFile =(DWORD) GetProcAddress(module, "UnmapViewOfFile");
        __asm
        {
        lea eax, buf
        push 0
        push 0
        push eax
        push hExitProcess
        push module
        push hDeleteFile
        push hUnmapViewOfFile
        ret
        }

PM MAIL   Вверх
SABROG
Дата 22.7.2008, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: нет
Всего: 91



ret берет адрес возврата из стека, там находится UnmapViewOfFile, который вызывается с параметром равным адресу API функции в hDeleteFile (видимо хотелось передать базовый адрес на модуль вместо него), далее управление из UnmapViewOfFile передается на содержимое в module (хэндл Kernel32), на этом этапе скорее всего должен появится AV, если нет, то вызывается тупо ExitProcess.

Видимо должно быть как-то так:

Код

char buf[MAX_PATH];
HMODULE module;
module = GetModuleHandle("Kernel32");
GetModuleFileName(module, buf, MAX_PATH);
DWORD hExitProcess =(DWORD) GetProcAddress(module, "ExitProcess");
DWORD hDeleteFile =(DWORD) GetProcAddress(module, "DeleteFile");
DWORD hUnmapViewOfFile =(DWORD) GetProcAddress(module, "UnmapViewOfFile");
        __asm
        {
        push 0
        push hExitProcess
        lea eax, buf
        push eax
        push hDeleteFile
        push базовый_адрес_выгружаемого_модуля
        push hUnmapViewOfFile
        ret
        }



--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
BaDP1nG
Дата 22.7.2008, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 12.11.2007

Репутация: нет
Всего: нет



Ну тоже что-то эффекта не приносит, хотя поправка здравая, вроде бы. Спасибо!
PM MAIL   Вверх
SABROG
Дата 22.7.2008, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: нет
Всего: 91



Цитата(BaDP1nG @ 22.7.2008,  13:13)
Ну тоже что-то эффекта не приносит, хотя поправка здравая, вроде бы. Спасибо!

Проверь работоспособность программы сначала без __asm вставки.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
dumb
Дата 22.7.2008, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



вообще, код должен выглядеть примерно так:
Код

char buf[MAX_PATH];
HMODULE module = GetModuleHandle("Kernel32");
DWORD hExitProcess =(DWORD) GetProcAddress(module, "ExitProcess");
DWORD hDeleteFile =(DWORD) GetProcAddress(module, "DeleteFile");
DWORD hUnmapViewOfFile =(DWORD) GetProcAddress(module, "UnmapViewOfFile");

GetModuleFileName(0, buf, MAX_PATH);
module = GetModuleHandle(0);
CloseHandle((HANDLE)4);
        __asm
        {
        lea eax, buf
        push 0
        push 0
        push eax
        push hExitProcess
        push module
        push hDeleteFile
        push hUnmapViewOfFile
        ret
        }


Цитата(SABROG @  22.7.2008,  13:46 Найти цитируемый пост)
ret берет адрес возврата из стека, там находится UnmapViewOfFile, который вызывается с параметром равным адресу API функции в hDeleteFile

нет. после ret'а на UnmapViewOfFile, адрес DeleteFile'а будет на верхушке, т.е. адресом возврата из UnmapViewOfFile. в асм-вставке все осталось без изменений(т.е. правильным), так, как и писал Gary Nebbett. а вот в сишном коде косяки.

да и как бы там ни было, этот код работает только в NT/2000. начиная с XP DeleteFile(кстати, в XP'шном kernel'е нет такой функции. есть DeleteFileA/W) возвращает ошибку(access denied).

PM MAIL   Вверх
SABROG
Дата 22.7.2008, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: нет
Всего: 91



Цитата(dumb @  22.7.2008,  22:28 Найти цитируемый пост)
нет. после ret'а на UnmapViewOfFile, адрес DeleteFile'а будет на верхушке


У UnmapViewOfFile есть параметр, в том то и дело, что DeleteFile будет на верхушке, а именно на том месте где в стеке должен быть параметр для UnmapViewOfFile. Если помнишь, то параметры тоже через стек передаются. Про DeleteFileA/W верно подметил, этот момент я как-то упустил, потому и написал, чтобы сначала без извращений проверил код.

Раскручивание стека идет в обратном порядке, например:

Код

UnmapViewOfFile(mem);
DeleteFileA("file.ext");
ExitProcess(NULL);


В стеке будет:

Код

UnMapViewOfFile - вершина стека, она же адрес возврата для ret
mem - параметр к функции
DeleteFileA - адрес возврата из UnMapViewOfFile
"file.ext" - параметр к DeleteFileA
ExitProcess - адрес возврата из DeleteFileA
NULL - параметр для ExitProcess


т.е.

Код

pushd NULL
pushd ExitProcess
pushd "file.ext"
pushd DeleteFileA
pushd mem
pushd UnMapViewOfFile


Это сообщение отредактировал(а) SABROG - 22.7.2008, 22:49


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
dumb
Дата 22.7.2008, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



Цитата(SABROG @  22.7.2008,  23:41 Найти цитируемый пост)
DeleteFile будет на верхушке, а именно на том месте где в стеке должен быть параметр

при входе в функцию(до выполнения какого-либо стаб-кода) первый параметр находится не на верхушке, а на esp+4.
PM MAIL   Вверх
SABROG
Дата 23.7.2008, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: нет
Всего: 91



Цитата(dumb @ 22.7.2008,  23:59)
Цитата(SABROG @  22.7.2008,  23:41 Найти цитируемый пост)
DeleteFile будет на верхушке, а именно на том месте где в стеке должен быть параметр

при входе в функцию(до выполнения какого-либо стаб-кода) первый параметр находится не на верхушке, а на esp+4.

Верно, запутался немного. Ассемблерный код менять не надо.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Draeden
Дата 28.7.2008, 07:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 7.7.2008

Репутация: нет
Всего: нет



Вы хотите удалить файл образа во время выполнения последнего ?
Вот, что вы делаете для этого:

Код

HMODULE module = GetModuleHandle("Kernel32");


Если kernel32.dll присутствует в адресном пространстве вашего процесса, то вы получите её базовый адрес.
Если этой библиотеки там нет, то вы ничего не получите.

Код

DWORD hExitProcess =(DWORD) GetProcAddress(module, "ExitProcess");
DWORD hDeleteFile =(DWORD) GetProcAddress(module, "DeleteFile");
DWORD hUnmapViewOfFile =(DWORD) GetProcAddress(module, "UnmapViewOfFile");


Не лишено смысла, но это только в том случае, если kernel32.dll была загружена ранее.

Далее идёт некий код на ассемблере, вероятно в целях сомнительной оптимизации, а также в попытке запутать читателя.
Вот, что делает этот код:

Код

UnmapViewOfFile ( <базовый адрес для kernel32.dll> );


Эта функция убирает страницы из адресного простарнства вызывающего процесса.
Во первых их там может и не быть, а во вторых это ничего не даст, кроме ошибок доступа.
Похоже на попытку заменить пару функций LoadLibrary/FreeLibrary.

Код

DeleteFileA ( <имя файла образа> );


Функция CreateProcess, а также ей подобные, загружают файлы образы в память с помощью механизма отображения в память.
При отображении файла в память, исполнительная система Windows держит дескриптор этого файла до тех пор,
пока не будет закрыт последний объект "раздел" для этого файла. Сам факт того, что ваша программа выполняется, говорит о том,
что есть по крайней мере один объект "раздел" для этого файла образа и хранится он в исполнительной системе.
Раз есть открытый дескриптор для файла, то удалить его нельзя.
Более того, предудщим действием вы "удалили" kernel32.dll из виртуальной памяти процесса, а теперь вы вызываете
функцию из этой библиотеки - DeleteFileA. Вам гарантировано #PF и выгрузка из памяти.

Код

ExitProcess ( 0 );


Тоже самое, что и для предыдущего действия - вызов функции из выгруженной библиотеки.

Вы пишете вирус ? smile

Это сообщение отредактировал(а) Draeden - 28.7.2008, 14:13
PM MAIL   Вверх
lemax
Дата 17.8.2008, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 14.10.2007

Репутация: нет
Всего: 1



Что за колдовство?!
http://www.catch22.net/tuts/selfdel.asp

Код

#include <windows.h>

int main(int argc, char *argv[])
{
    char    buf[MAX_PATH];
    HMODULE module;
    
    module = GetModuleHandle(0);
    GetModuleFileName(module, buf, MAX_PATH);
    CloseHandle((HANDLE)4);
    
    __asm 
    {
      lea     eax, buf
      push    0
      push    0
      push    eax
      push    ExitProcess
      push    module
      push    DeleteFile
      push    UnmapViewOfFile
      ret
    }
     
    return 0;
}

This snippet ONLY works under Windows NT and 2000. As soon as you compile and run the above program, it just disappears from disk! It works because under NT and 2000 the OS keeps a usermode HANDLE reference to the memory-mapped file which backs the executable image on disk. This HANDLE always has a value of "4" under these OSs.

Unfortunately this gem only works under NT/2000, not XP or .NET Server. This is because these OSs no longer maintain a usermode HANDLE to the executable's memory-mapped file - this section object is only accessible in kernel using a pointer reference. So although this technique is incredibly slick (it is the only true self-deleting method) it is no longer as-is.

Перевод: работает только под r Windows NT и 2000. не работает под  XP или .NET Server...
Про "CloseHandle((HANDLE)4);" сказанно 4 есть указатель на открытий exe-фаил 

Это сообщение отредактировал(а) lemax - 17.8.2008, 14:09
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0584 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.