![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| BaDP1nG |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 12.11.2007 Репутация: нет Всего: нет |
Проблема в том, что код, вроде бы, корректен, но, как это, зачастую, бывает- не работает =( Помогите исправить, будьте добры. Варианты с бат-файлами и подобное- не предлагать!
|
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: нет Всего: 91 |
ret берет адрес возврата из стека, там находится UnmapViewOfFile, который вызывается с параметром равным адресу API функции в hDeleteFile (видимо хотелось передать базовый адрес на модуль вместо него), далее управление из UnmapViewOfFile передается на содержимое в module (хэндл Kernel32), на этом этапе скорее всего должен появится AV, если нет, то вызывается тупо ExitProcess.
Видимо должно быть как-то так:
|
|||
|
||||
| BaDP1nG |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 12.11.2007 Репутация: нет Всего: нет |
Ну тоже что-то эффекта не приносит, хотя поправка здравая, вроде бы. Спасибо!
|
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: нет Всего: 91 |
Проверь работоспособность программы сначала без __asm вставки. |
|||
|
||||
| dumb |
|
||||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 27 Всего: 158 |
вообще, код должен выглядеть примерно так:
нет. после ret'а на UnmapViewOfFile, адрес DeleteFile'а будет на верхушке, т.е. адресом возврата из UnmapViewOfFile. в асм-вставке все осталось без изменений(т.е. правильным), так, как и писал Gary Nebbett. а вот в сишном коде косяки. да и как бы там ни было, этот код работает только в NT/2000. начиная с XP DeleteFile(кстати, в XP'шном kernel'е нет такой функции. есть DeleteFileA/W) возвращает ошибку(access denied). |
||||
|
|||||
| SABROG |
|
||||||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: нет Всего: 91 |
У UnmapViewOfFile есть параметр, в том то и дело, что DeleteFile будет на верхушке, а именно на том месте где в стеке должен быть параметр для UnmapViewOfFile. Если помнишь, то параметры тоже через стек передаются. Про DeleteFileA/W верно подметил, этот момент я как-то упустил, потому и написал, чтобы сначала без извращений проверил код. Раскручивание стека идет в обратном порядке, например:
В стеке будет:
т.е.
Это сообщение отредактировал(а) SABROG - 22.7.2008, 22:49 |
||||||||
|
|||||||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 27 Всего: 158 |
||||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: нет Всего: 91 |
Верно, запутался немного. Ассемблерный код менять не надо. |
|||
|
||||
| Draeden |
|
||||||||||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 7.7.2008 Репутация: нет Всего: нет |
Вы хотите удалить файл образа во время выполнения последнего ?
Вот, что вы делаете для этого:
Если kernel32.dll присутствует в адресном пространстве вашего процесса, то вы получите её базовый адрес. Если этой библиотеки там нет, то вы ничего не получите.
Не лишено смысла, но это только в том случае, если kernel32.dll была загружена ранее. Далее идёт некий код на ассемблере, вероятно в целях сомнительной оптимизации, а также в попытке запутать читателя. Вот, что делает этот код:
Эта функция убирает страницы из адресного простарнства вызывающего процесса. Во первых их там может и не быть, а во вторых это ничего не даст, кроме ошибок доступа. Похоже на попытку заменить пару функций LoadLibrary/FreeLibrary.
Функция CreateProcess, а также ей подобные, загружают файлы образы в память с помощью механизма отображения в память. При отображении файла в память, исполнительная система Windows держит дескриптор этого файла до тех пор, пока не будет закрыт последний объект "раздел" для этого файла. Сам факт того, что ваша программа выполняется, говорит о том, что есть по крайней мере один объект "раздел" для этого файла образа и хранится он в исполнительной системе. Раз есть открытый дескриптор для файла, то удалить его нельзя. Более того, предудщим действием вы "удалили" kernel32.dll из виртуальной памяти процесса, а теперь вы вызываете функцию из этой библиотеки - DeleteFileA. Вам гарантировано #PF и выгрузка из памяти.
Тоже самое, что и для предыдущего действия - вызов функции из выгруженной библиотеки. Вы пишете вирус ? Это сообщение отредактировал(а) Draeden - 28.7.2008, 14:13 |
||||||||||
|
|||||||||||
| lemax |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 90 Регистрация: 14.10.2007 Репутация: нет Всего: 1 |
Что за колдовство?!
http://www.catch22.net/tuts/selfdel.asp
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 |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |