|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Авг 13, 2003 13:41:18 Нашёл такой исходник Self-Deleting Executables for Windows 95,98,ME. Но что-то не получается транслировать его под masm32, никак не хочет работать. Может кто-нибудь скомпилить его в С и проверить под win98, может он вообще не пашет, киньте потом, пожалуста, дизассемблированный листинг в топик. Thanks. int main(int argc, char *argv[])
{
char buf[MAX_PATH];
HMODULE module;
module = GetModuleHandle(0);
GetModuleFileName(module, buf, MAX_PATH);
__asm
{
lea eax, buf
push 0
push 0
push eax
push ExitProcess
push module
push DeleteFile
push FreeLibrary
ret
}
return 0;
}
|
|
|
Дата: Авг 13, 2003 14:14:41 Если интересует тема, зайди на z0mbie.host.sk там этот вопрос рассматривается (по поводу записи в запущенные экзешники) |
|
|
Дата: Авг 13, 2003 15:23:59 Мля, ведь работает 8). Чего-то не пойму как... 2Asterix: У меня ida под рукой нет, но я в аттач кинул ехешник. Скомпилирован VC6.0, пробовал под ME. Не объяснишь принцип работы, а то чего-то не пойму причем тут стек? |
|
|
Дата: Авг 13, 2003 15:25:23 |
|
|
Дата: Авг 13, 2003 15:31:46 [ Sickle: (по поводу записи в запущенные экзешники)] Нет, это не запись в запущенные exe'шники, это "удаление самого себя" ;-) |
|
|
Дата: Авг 13, 2003 15:32:27 · Поправил: Asterix R4DX Спасибо! А ты мог бы скомпилить только этот код, в минимальное приложение, в обычную, а не debug версию? |
|
|
Дата: Авг 13, 2003 16:01:15 |
|
|
Дата: Авг 13, 2003 16:14:44 Уже разобрался, вот вариант на masm'е: ;#####################################################################
.386
.model flat, stdcall
option casemap: none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
.data
.data?
hModule dd ?
.code
invoke GetModuleHandle,NULL
mov hModule,eax
start proc
option EPILOGUE:NONE
local buffer[MAX_PATH]:CHAR
invoke GetModuleHandle,NULL
mov hModule,eax
invoke GetModuleFileName,hModule,addr buffer,MAX_PATH
lea eax,buffer
push 0
push 0
push eax
push ExitProcess
push hModule
push DeleteFile
push FreeLibrary
ret
start endp
end start
;##################################################################### |
|
|
Дата: Авг 13, 2003 16:24:18 Мля, ведь работает 8). Чего-то не пойму как... Тут фишка видимо в том, что buf выделяется на стеке. Наверное FreeLibrary освобождает сегмент кода/данных а стек не трогает, а по ретурну выполняется вызов всех процедур без возврата в сегмент кода. Может быть будет работать и так: module = GetModuleHandle(0); GetModuleFileName(module, buf, MAX_PATH); FreeLibrary(module) DeleteFile(buf) ExitProcess(0) Только в асмовском коде остается лишний ноль на стеке. 98-й нету, проверить не могу |
|
|
Дата: Авг 13, 2003 16:48:12 Вот здесь http://www.catch22.org.uk/tuts/selfdel.asp в разделе "The Ultimate Self-Deleting Executable" есть и оригинал вышеприведенного кода и вариант для НТ, который не работает в XP и выше, там проблемы с CloseHandle((HANDLE)4) Припоминаю, давненько на реверсинге был разговор по этому поводу - чего-то там в XP поменяли :( |
|
|
Дата: Авг 13, 2003 17:09:57 Спасибо за ссылку, довольно интересная тема... |
|
|
Дата: Авг 13, 2003 17:14:40 Может быть будет работать и так: Неа, не будет - FreeLibrary нельзя на себя вызывать, вроде - об этом Рихтер писал. |
|
|
Дата: Авг 13, 2003 17:33:00 Так в асмовском коде как раз и идет вызов на себя - вызывается FreeLibrary с module = GetModuleHandle(0). Разница только в том, что в асмовском коде не будет возврата управления в сегмент кода. |
|
|
Дата: Авг 13, 2003 19:02:48 [ Max: чего-то там в XP поменяли :( ] До ХР самый первый хендл в таблице хендлов процесса был хендлом секции екзешника создавшего процесс. Т.е. он всегда равнялся 4 (0-вого хендла не существует - это место зарезервировано). CloseHandle(4) как раз и закрывает этот самый хендл. В структуре EPROCESS даже поле такое есть SectionHandle. Начиная с ХР эту дыру убрали. У секции теперь нет предопределенного значения хендла. А SectionHandle стало SectionObject и получить к нему доступ теперь можно только из ядра. |
|
|
Дата: Авг 13, 2003 19:29:20 Я вот только не понял, для чего делается два раза push 0? Насколько я помню, в мануалах говорится что из ExitProcess выхода нету, зачем тогда нули на стеке? |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.076 |