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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление исполняемого файла самим приложением, Реально ли такое из самого приложения? 
V
    Опции темы
null56
Дата 28.1.2010, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Всем привет
Возникла задача, чтобы по истечению работы приложения, удалялся бы исполняемый файл самого приложения. Как известно, операционка помечает файлы, которые используются в данный момент и стандартным способом не получится
Код

DeleteFile(argv[0]);

Я порыл в интернете нашел 1,5 способа:
1) создание bat файла в процессе работы программы, который бы в бесконечном цикле пытался удалить нужный файл, а потом закрывался (или сам себя тоже удалял, я так и не понял)
http://sources.ru/cpp/faqs/47.htm

2) Второй способ, который я нашел, связан с использованием функции
Код

MoveFileEx

но я так и не понял, можно ли выполнить с помощью неё задуманное

Вопрос: существует ли способ (алтернативный от создания вспомогательных файлов на жестком диске) удаления, в процессе выполнения, собственного исполняемого файла? если есть, подскажите пожалуйста

Заранее благодарен всем откликнувшимся
ЗЫ: вариант через временные файлы может решить мою проблему?
PM MAIL   Вверх
GremlinProg
Дата 28.1.2010, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



используй MoveFileEx с флагом MOVEFILE_DELAY_UNTIL_REBOOT и путем назначения NULL
Цитата(MoveFileEx Function @  MSDN)

If dwFlags specifies MOVEFILE_DELAY_UNTIL_REBOOT and lpNewFileName is NULL, MoveFileEx registers the lpExistingFileName file to be deleted when the system restarts. If lpExistingFileName refers to a directory, the system removes the directory at restart only if the directory is empty.

это нормальная операция, когда удалить файл больше некому,
не надо мусорить батниками


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
null56
Дата 28.1.2010, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Создание нового процесса не решит эту проблему?
1) Создаю новый процесс
2) Тут же завершаю текущий
3) Удаляю из нового процесса файл
... кажется вряд ли (

Добавлено через 46 секунд
GremlinProg, да, я тоже к этому склоняюсь
PM MAIL   Вверх
null56
Дата 28.1.2010, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Немного не в ту степь....
Раз под вындой нет fork, то реально ли сэмитировать его собственноручно?
В смысле:
1) Создать область памяти
2) Загрузить туда исполняемый код
3) Передать указатель на эту область
4) Завершить первоначальный процесс

или пускай не через память, а через какие - нибудь "временные файлы", которые бы находились на на жестком диске, а в памяти, которые можно было бы заполнить и запустить, а позже они бы почистились?
нет ли ничего подобного в винде?
PM MAIL   Вверх
GoldFinch
Дата 28.1.2010, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



null56, инжектом в другой процесс)

но вообще, наверное можно создать скрипт wsh (.vbs, .js) который сам себя удалит

Добавлено через 3 минуты и 8 секунд
вообще в идее с инжектом чтото есть.
можно взять любой .exe, например notepad.exe, запустить его замороженным (SUSPENEDED) заменить в памяти код на нужный тебе, который в конце делает ExitProcess()

тогда у этой запускаемой программы выполнение не дойдет даже до ее точки входа и загрузки ее длл, фактически от нее будет просто позаимствован файл.
PM MAIL ICQ   Вверх
null56
Дата 28.1.2010, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



GoldFinch, а ты реализовывал подмену кода другого процесса? я нет. подсказать можешь куда смотреть?
PM MAIL   Вверх
GoldFinch
Дата 28.1.2010, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Такая задача  весьма нетривиальная и занимательная.
Здесь есть несколько нюансов - в дочерний процесс надо писать шеллкод, а С++ и шеллкоды - вещи малосовместимые, поэтому шеллкод проще написать на асме, благо он короткий.
Само собой если писать 32-разрядный шеллкод, его надо внедрять в 32-разрядный процесс, для 64-разрядного- 64-разрядный процесс.

Собственно вот код:
Код

#include <Windows.h>

#pragma comment(linker,"/entry:main") // добавлено для более удобной отладки в OllyDbg

static int ReportError( const wchar_t* title )
{    
    const int buf_size = 1024;
    wchar_t errorMsgBuf[buf_size];
    FormatMessageW( FORMAT_MESSAGE_FROM_SYSTEM+FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL,GetLastError(),NULL,errorMsgBuf,buf_size,NULL );
    MessageBoxW( 0,errorMsgBuf,title,0 );
    return 0;
}

/***********************************************
;исходный текст шеллкода, удаляющего файл родительского процесса
;синтаксис - fasm

macro print_shellcode_dw_patch name {  display "*(DWORD*)(shellcode+", ($-4)/10+'0', ($-4)mod 10+'0', ")=", name, ";",13,10 }

    use32

    ;jmp $ ; debug!!!
    mov eax,eax ; nodebug!!!

    ;получаем базу kernel32
    mov eax, [fs:30h]
    mov eax, [eax+0ch]
    mov eax, [eax+1ch]
    mov eax, [eax+0]
    mov ebx, [eax+08h]

    jmp loo
;---------------------------

back:
    lea eax,[ebx+0xAAAAAAAA]
    print_shellcode_dw_patch "rvaDeleteFileA"
    call eax
    test eax,eax
    jz  loo
    ;вызываем ExitProcess(0)
    push 0
    lea eax,[ebx+0xAAAAAAAA]
    print_shellcode_dw_patch "rvaExitProcess"
    call eax
;--------------------------

loo:
    ;вызываем Sleep(500)
    push 500
    lea eax,[ebx+0xAAAAAAAA]
    print_shellcode_dw_patch "rvaSleep"
    call eax
    ;вызываем DeleteFile("...")
    call back
    ;тут будут байты пути к файлу
    display "GetModuleFileNameA( 0, (char*)shellcode+", $/10+'0', $ mod 10+'0', ", MAX_PATH );",13,10
    ;...........

***********************************************/

unsigned char shellcode[61+MAX_PATH] = {
    0x89, 0xC0, 0x64, 0xA1, 0x30, 0x00, 0x00, 0x00, 0x8B, 0x40, 0x0C, 0x8B, 0x40, 0x1C, 0x8B, 0x00, 
    0x8B, 0x58, 0x08, 0xEB, 0x16, 0x8D, 0x83, 0xAA, 0xAA, 0xAA, 0xAA, 0xFF, 0xD0, 0x85, 0xC0, 0x74, 
    0x0A, 0x6A, 0x00, 0x8D, 0x83, 0xAA, 0xAA, 0xAA, 0xAA, 0xFF, 0xD0, 0x68, 0xF4, 0x01, 0x00, 0x00, 
    0x8D, 0x83, 0xAA, 0xAA, 0xAA, 0xAA, 0xFF, 0xD0, 0xE8, 0xD8, 0xFF, 0xFF, 0xFF
};

int main()
{
    HMODULE localKernel32Base = GetModuleHandleA( "kernel32.dll" );
    DWORD rvaSleep = (DWORD)GetProcAddress( localKernel32Base, "Sleep" ) - (DWORD)localKernel32Base;
    DWORD rvaDeleteFileA = (DWORD)GetProcAddress( localKernel32Base, "DeleteFileA" ) - (DWORD)localKernel32Base;
    DWORD rvaExitProcess = (DWORD)GetProcAddress( localKernel32Base, "ExitProcess" ) - (DWORD)localKernel32Base;
    
    char child_path[MAX_PATH];
    GetSystemDirectoryA( child_path, MAX_PATH );
    strcat_s( child_path, MAX_PATH, "\\notepad.exe" );
    
    PROCESS_INFORMATION processInformation;
    STARTUPINFOA startupInfo = {0};
    if( !CreateProcessA( child_path, NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &startupInfo, &processInformation) )
        return ReportError(L"Ошибка CreateProcessA");

    *(DWORD*)(shellcode+23)=rvaDeleteFileA;
    *(DWORD*)(shellcode+37)=rvaExitProcess;
    *(DWORD*)(shellcode+50)=rvaSleep;
    GetModuleFileNameA( 0, (char*)shellcode+61, MAX_PATH );

    LPVOID injectedBase = VirtualAllocEx(processInformation.hProcess,NULL,sizeof(shellcode),MEM_COMMIT,PAGE_READWRITE);
    if( !injectedBase )
        return ReportError(L"Ошибка VirtualAllocEx");

    if( !WriteProcessMemory(processInformation.hProcess,injectedBase,shellcode,sizeof(shellcode),NULL ) )
        return ReportError(L"Ошибка WriteProcessMemory");

    CONTEXT context;
    context.ContextFlags = CONTEXT_CONTROL;
    if( !GetThreadContext( processInformation.hThread, &context ) )
        return ReportError(L"Ошибка GetThreadContext");

    context.Eip = (DWORD)injectedBase;
    if( !SetThreadContext( processInformation.hThread, &context ) )
        return ReportError(L"Ошибка SetThreadContext");

    ResumeThread( processInformation.hThread );
}

тестировал на 32рязрядной winXP, 
при этом заметил что если запускать калькулятор - шеллкод не срабатывает, и ollydbg почему-то не может приаттачиться к калькулятору (не видит его в списке процессов), а с блокнотом и другими программами все работает.

Это сообщение отредактировал(а) GoldFinch - 28.1.2010, 21:23
PM MAIL ICQ   Вверх
GremlinProg
Дата 29.1.2010, 06:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



GoldFinch, ты это под каким антивирусом запускал?


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
GoldFinch
Дата 29.1.2010, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



GremlinProg, nod32

Вобщем-то если процесс создает дочерний процесс, то он имеет право делать с дочерним чтоугодно, так что антивирусы не должны этому мешать. Другое дело инжект уже в работающий процесс.
PM MAIL ICQ   Вверх
GremlinProg
Дата 29.1.2010, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(GoldFinch @  29.1.2010,  11:10 Найти цитируемый пост)
Вобщем-то если процесс создает дочерний процесс, то он имеет право делать с дочерним чтоугодно, так что антивирусы не должны этому мешать.

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

выбери более правдоподобный ответ
Цитата(GoldFinch @  29.1.2010,  11:10 Найти цитируемый пост)
 nod32

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

null56, если еще не понятно, GoldFinch, тебе предлагает полагаться на то, что пользователь твоего софта ничего не знает об антивирусах (в принципе, большинство советов GoldFinch в этом разделе предполагают именно такой расклад), если это не так - сам делай выводы что использовать разумнее


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
GoldFinch
Дата 29.1.2010, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(GremlinProg @  29.1.2010,  09:37 Найти цитируемый пост)
т.е. ты считаешь, что если ты запускаешь чужой софт из своего,
значит антивирус считает тебя добропорядочным юзером и спокойно смотрит на твои в нем ковыряния?

Есть куча программ которые запускают другие программы, например TotalCommander, если ты не знал, программы можно запускать не только через ярлычок или через эксплорер.
Антивирус (и фаервол) никуда не смотрит и ничего не считает, там есть проактивка которая перехватывает часть функций АПИ ОС, и проверяет опасность тех или иных действий. Например фаерфол может запрещать инжект в процесс который добавлен в настройки фаервола как приложение которому разрешено работать с сетью. Но он не будет запрещать любой инжект как таковой, т.к. это вполне легальное действие.

"антивирус считает тебя добропорядочным юзером и спокойно смотрит на твои в нем ковыряния"
при чем тут юзер? в чем ковыряния? в антивирусе? пиши грамотно, по русски, а то я ничего не понимаю.

Это сообщение отредактировал(а) GoldFinch - 29.1.2010, 11:16
PM MAIL ICQ   Вверх
GremlinProg
Дата 29.1.2010, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(GoldFinch @  29.1.2010,  13:16 Найти цитируемый пост)
Есть куча программ которые запускают другие программы, например TotalCommander, если ты не знал, программы можно запускать не только через ярлычок или через эксплорер.

не надо путать редьку с хреном
Цитата(GoldFinch @  29.1.2010,  13:16 Найти цитируемый пост)
Антивирус (и фаервол) никуда не смотрит и ничего не считает, там есть проактивка которая перехватывает часть функций АПИ ОС, и проверяет опасность тех или иных действий

smile надо же, а я думал антивирусы обычно орехи колят
Цитата(GoldFinch @  29.1.2010,  13:16 Найти цитируемый пост)
Но он не будет запрещать любой инжект как таковой, т.к. это вполне легальное действие

на счет его легальности мы уже давно все выяснили, "НЕ ЛЕГАЛЬНО", безтолку не спорь, все доказано документально

а вот на счет "не будет запрещать любой инжект",
ну давай, пускай на тройке более-менее популярных антивирусов свой инжект в калькулятор, нодпад и т.п. софт ))
кто первый пропустит?

только вот если хоть один не пропустит, любой дальнейший выпад на эту тему будешь обсуждать с остальными,
кто не осилил почитать учебник по информатике


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
GoldFinch
Дата 29.1.2010, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(GremlinProg @  29.1.2010,  11:39 Найти цитируемый пост)
"НЕ ЛЕГАЛЬНО", безтолку не спорь, все доказано документально

пруфлинк давай
Цитата(GremlinProg @  29.1.2010,  11:39 Найти цитируемый пост)
ну давай, пускай на тройке более-менее популярных антивирусов свой инжект в калькулятор, нодпад и т.п. софт ))
кто первый пропустит?

тебе охота проверить - вот и займись.
PM MAIL ICQ   Вверх
null56
Дата 29.1.2010, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



не ссортесь, ребята...
на счет легитимности способа GoldFinch я сам особо не уверен надо проверять на различных антивирях и смотреть как они себя ведут.
По своей сути я попросил GoldFinch показать мне метод инжекции, как его можно реализовать в винде, с другой стороны стоит палево со стороны антивирусов... сейчас стоит задача найти компромисс методами проверок...
спасибо вам обоим за участие

PM MAIL   Вверх
GremlinProg
Дата 29.1.2010, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(GoldFinch @  29.1.2010,  13:54 Найти цитируемый пост)
пруфлинк давай

http://forum.vingrad.ru/forum/topic-269823...t/view-all.html


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

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


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

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


 




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


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

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