· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.WIN32 —› Self-Deleting Executables for Windows 95,98,ME.

. 1 . 2 . >>

Посл.отвђт Сообщен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

Упс, забыл про 50 кб, лови rar.

17002151__sdp.rar


Дата: Авг 13, 2003 15:31:46

[ Sickle: (по поводу записи в запущенные экзешники)]

Нет, это не запись в запущенные exe'шники, это "удаление самого себя" ;-)


Дата: Авг 13, 2003 15:32:27 · Поправил: Asterix

R4DX

Спасибо!

А ты мог бы скомпилить только этот код, в минимальное приложение,
в обычную, а не debug версию?


Дата: Авг 13, 2003 16:01:15

В смысле release? OK.

1877931498__sdp.exe


Дата: Авг 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 выхода нету, зачем тогда нули на стеке?

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.076