Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Косяк с самоуничтожающимся файлом!

367
07 декабря 2006 года
Meatcoins
303 / / 18.01.2006
Внизу несложная программка! Почему-то она не хочет сама себя уничтожать? А очень бы хотелось... В чём дело???
Пояснение:
В переменной buffer хранится путь к исполняемому файлу, затем открываем на чтение и запись и пытаемся записать 32 нуля туда, но получается ошибка - не записывает почему-то, а если ради эксперимента поставить push buffer2, то всё работает - создаётся файл firo4.txt размером 32 байта!
Вопрос:
Как в общем случае исполняемому файлу модифицировать свой текст, например, очень хочется что-то сохранить в своём коде в ПЗУ на диск???

.386
.model flat, stdcall
option casemap :none
include windows.inc
include kernel32.inc
include user32.inc
includelib kernel32.lib
includelib user32.lib
.const
my_title db "Message...",0
.data
data_to_file db 20h dup(0)
length_of_data_to_file dd 20h
buffer2 db "firo4.txt",0
.data?
buffer db 400h dup(?)
errorcode db 4h dup(?)
.code
_start:
push 400h
push offset buffer
push eax
call GetModuleFileName

push 0
push FILE_ATTRIBUTE_NORMAL or FILE_FLAG_WRITE_THROUGH
push CREATE_ALWAYS
push 0
push 0
push GENERIC_READ or GENERIC_WRITE
push offset buffer
call CreateFile
mov ebx,eax

push 0
push offset length_of_data_to_file
push size data_to_file
push offset data_to_file
push ebx
call WriteFile
add eax,41h
mov esi,offset errorcode
mov dword ptr ds:[esi],eax

push 0
push offset my_title
push offset errorcode
push 0
call MessageBox

push ebx
call CloseHandle


push 0
push offset my_title
push offset buffer
push 0
call MessageBox

push 0
call ExitProcess
261
07 декабря 2006 года
ahilles
1.5K / / 03.11.2005
ты никак не сможешь изменить свой собственный исполняемый файл
но невозможное возможно............
367
07 декабря 2006 года
Meatcoins
303 / / 18.01.2006
А если очень хочется, то как???
И как же сделать это "невозможное"???
Ведь есть же такая штука - это точно!!!
Например, когда программка DEINSTAL'руется!!!
По сути исполняемый файл сам себя удаляет!!!
Вот и я такую же штуку хочу сделать!!!
334
07 декабря 2006 года
HexEdit
809 / / 27.07.2006
Что касается деинсталлирования, то как правило - программа удаления использует вспомогательные программы. Но есть такая прога - Unlocker, с помощью которой можно удалить файлы, которые держит система. Так что теоретически это возможно.

PS. Думаю если во время выполнения удалить текущий исполняемый файл, могут быть косяки...
3
07 декабря 2006 года
Green
4.8K / / 20.01.2000
Цитата: HexEdit
Что касается деинсталлирования, то как правило - программа удаления использует вспомогательные программы. Но есть такая прога - Unlocker, с помощью которой можно удалить файлы, которые держит система. Так что теоретически это возможно.

PS. Думаю если во время выполнения удалить текущий исполняемый файл, могут быть косяки...



Если грамотно (а по другому и не получится) удалить, то косяков не будет.

334
07 декабря 2006 года
HexEdit
809 / / 27.07.2006
Ну скажем так удалять лучше перед самым завершением.
А проблемы могут быть с данными или секциями, имеющими атрибут DISCARDABLE
3
07 декабря 2006 года
Green
4.8K / / 20.01.2000
Цитата: HexEdit
Ну скажем так удалять лучше перед самым завершением.


Не обязательно.
Например, в моей программе, это наоборот первое действие. :)

Цитата: HexEdit

А проблемы могут быть с данными или секциями, имеющими атрибут DISCARDABLE


По секрету: не будет никаких секций и данных связаныых с файлом PE... :)

367
08 декабря 2006 года
Meatcoins
303 / / 18.01.2006
Цитата:
Например, в моей программе, это наоборот первое действие.


А можно этот пример написать? А то все рассуждают-рассуждают можно-нельзя, косяки-некосяки, возможно-невозможно... а конкретно как это сделать никто не пишет!

Цитата:
Но есть такая прога - Unlocker, с помощью которой можно удалить файлы, которые держит система.


А эта прога в составе каждого Windows'а идёт? И идёт ли вообще? Мне её что, перед завершением своей проги вызвать надо? Или свою прогу впендюривать в каждый Windows (куда-нибудь в папку system32), которая будет создаваться деинсталируемой прогой, а потом ею вызываться?
Что-то мудрёно как-то... А проще можно? Примерчик бы...

334
08 декабря 2006 года
HexEdit
809 / / 27.07.2006
[quote=Meatcoins]А эта прога в составе каждого Windows'а идёт? И идёт ли вообще?[/quote]
Нет, эта прога отдельная, ее можно в инете скачать (не помню точно где), а насчет вызывать - нет. Я просто имел ввиду что такое (удаление блокируемого файла) впринципе возможно.

PS. Если бы эта прога была в составе Windows, нафиг тогда параметр dwShareFlags функции CreateFile??? :)
3
08 декабря 2006 года
Green
4.8K / / 20.01.2000
Цитата: Meatcoins
А можно этот пример написать? А то все рассуждают-рассуждают можно-нельзя, косяки-некосяки, возможно-невозможно... а конкретно как это сделать никто не пишет!



Рассказываю, как сделать конкретно.
Для того, чтобы удалить файл, надо чтобы система его разблокировала. Для этого надо размапить образ с помощью функции из ntdll.dll

 
Код:
LONG NTAPI ZwUnmapViewOfSection(HANDLE hProcess, PVOID pvAddress)

Т.к. после этого никаких секций PE-файла в памяти не останется, предварительно необходимо завести где-нибудь в пямяти автономный код, который собственно и удалит файл с диска.

Т.о. по шагам:
1) выделяем динамически память (new, malloc, VirtualAlloc и т.п.);
2) копируем в эту память автономный код удаления файла;
3) вызываем ZwUnmapViewOfSection;
4) передаем управление автономному коду.

Пункты 3) и 4) могут быть поменены местами.
334
08 декабря 2006 года
HexEdit
809 / / 27.07.2006
Цитата:
предварительно необходимо завести где-нибудь в пямяти автономный код, который собственно и удалит файл с диска.


А проблем с Data Execution Prevention не будет? Просто не пробовал, хотелось бы чтобы не было, если знаешь...
И еще: этот автономный код будет относиться к текущему процессу или он будет полностью независим?

3
08 декабря 2006 года
Green
4.8K / / 20.01.2000
Цитата: HexEdit
А проблем с Data Execution Prevention не будет? Просто не пробовал, хотелось бы чтобы не было, если знаешь...


Не будет. В крайнем случае поставь соотв. аттрибуты на эту область памяти.

Цитата: HexEdit

И еще: этот автономный код будет относиться к текущему процессу или он будет полностью независим?


К текущему, конечно же.

334
09 декабря 2006 года
HexEdit
809 / / 27.07.2006
Да ясно, спс. Про это (автономный код) я как то не думал. Какнить попрактикуюсь)))
7
16 декабря 2006 года
@pixo $oft
3.4K / / 20.09.2006
А вы не пробовали сделать так
1.Пишем в батник
@Echo Off
:Chk
Del <имя exe'шника>
If Exist <имя exe'шника> GoTo Chk
Del <имя батника>

2.Запускаем его:WinExec(<имя батника>,SW_Hide)
Примчания:
1)<имя exe'шника> должно быть полным путём к файлу(если батник в папке с exe'шником,то это необязательно
2)при создании батника надо быть осторожным-проверять,не создаётся ли он в папке только для чтения
3)то же самое с exe'шником-не лежит ли он в такой папке
В крайнем случае можно создать ещё они exe'шник в папке Temp(или ещё где-нибудь) с заковыристым именем и расширением,который будет удалять то,что надо(его придётся запускать с помощью CreateProcess)
334
16 декабря 2006 года
HexEdit
809 / / 27.07.2006
ИМХО, еще большее извращение, да и дольше....
кстати первое что хотел предложить, но передумал...
7
16 декабря 2006 года
@pixo $oft
3.4K / / 20.09.2006
Почему извращение и дольше-нормально
367
14 января 2007 года
Meatcoins
303 / / 18.01.2006
Пробую осуществить следующую технологию:
[quote=Green]
Рассказываю, как сделать конкретно.
Для того, чтобы удалить файл, надо чтобы система его разблокировала. Для этого надо размапить образ с помощью функции из ntdll.dll

Код:
LONG NTAPI ZwUnmapViewOfSection(HANDLE hProcess, PVOID pvAddress)
Т.к. после этого никаких секций PE-файла в памяти не останется, предварительно необходимо завести где-нибудь в пямяти автономный код, который собственно и удалит файл с диска.

Т.о. по шагам:
1) выделяем динамически память (new, malloc, VirtualAlloc и т.п.);
2) копируем в эту память автономный код удаления файла;
3) вызываем ZwUnmapViewOfSection;
4) передаем управление автономному коду.

Пункты 3) и 4) могут быть поменены местами.
[/quote]
И теперь защёл в ТУПИК!
Вот моя программа:
Код:
.386
            .model flat, stdcall
             option casemap :none
             include E:\masm32\include\windows.inc
             include E:\masm32\include\kernel32.inc
             include E:\masm32\include\user32.inc
             include E:\masm32\include\advapi32.inc
             includelib E:\masm32\lib\kernel32.lib
             includelib E:\masm32\lib\user32.lib
             includelib E:\masm32\lib\advapi32.lib

    .data
er db "No error!!!",0
er1 db "1-st error!",0
er2 db "2-nd error!",0
er3 db "3-rd error!",0
er4 db "4-th error!",0
erstr db "String error!!!",0
waiting db "Waiting!!!",0
file db "2.txt",0

comment @
data db 68h,00h,01h,00h,00h,6Ah,40h,0E8h,08h,00h,00h,00h,0C3h,6Ah,00h,0E8h
db 06h,00h,00h,00h,0FFh,25h,04h,20h,40h,00h,0FFh,25h,00h,20h,40h,00h
db 0FFh,25h,0Ch,20h,40h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h
db 00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h
end_of_data db 0h
@

data db 0C3h,00h
end_of_data db 0h

    .data?
memory_handle dd ?
memory_address dd ?
               
    .code
_start:



invoke VirtualAlloc,0h,100h,MEM_COMMIT,PAGE_EXECUTE_READWRITE
cmp eax,0h
jne go
invoke MessageBox,0h,offset er1,offset er1,MB_OK
jmp endy
go:

mov esi,offset memory_address
mov dword ptr ds:[esi],eax

invoke VirtualLock,eax,100h
cmp eax,0h
jne go2
invoke MessageBox,0h,offset er2,offset er2,MB_OK
jmp endy
go2:



; This version is not working!!!
mov ecx,offset end_of_data-offset data
mov ecx,2h
invoke lstrcpyn,offset memory_address,offset data,ecx
cmp eax,0h
jne gogo2
invoke MessageBox,0h,offset erstr,offset erstr,MB_OK
jmp endy
gogo2:

mov esi,offset memory_address
mov eax,dword ptr ds:[esi]
;call eax




comment @
;This version is working!!!
mov esi,offset memory_address
mov eax,dword ptr ds:[esi]
mov esi,eax
mov edx,000000C3h
mov dword ptr ds:[esi],edx
call eax
@







mov esi,offset memory_address
mov eax,dword ptr ds:[esi]
invoke VirtualUnlock,eax,100h

comment @
push eax
call GetLastError
cmp eax,NO_ERROR
jne gogo
invoke MessageBox,0h,offset er,offset er,MB_OK
gogo:
pop eax

cmp eax,0h
jne go3
invoke MessageBox,0h,offset er3,offset er3,MB_OK
jmp endy
go3:
@

mov esi,offset memory_address
mov eax,dword ptr ds:[esi]
invoke VirtualFree,eax,100h,MEM_DECOMMIT
cmp eax,0h
jne go4
invoke MessageBox,0h,offset er4,offset er4,MB_OK
jmp endy
go4:



;invoke DeleteFile,offset file
endy:

;invoke MessageBox,0h,offset waiting,offset waiting,MB_OK

invoke ExitProcess,0h



end _start

В переменной data содержится вспомогательный файл, а точнее только его исполнительная часть в шестнадцатиричном виде (чтобы пока не мучаться с open file и read file):
Код:
.386
            .model flat, stdcall
             option casemap :none
             include E:\masm32\include\windows.inc
             include E:\masm32\include\kernel32.inc
             include E:\masm32\include\user32.inc
             include E:\masm32\include\advapi32.inc
             includelib E:\masm32\lib\kernel32.lib
             includelib E:\masm32\lib\user32.lib
             includelib E:\masm32\lib\advapi32.lib

    .data


    .data?
   
               
    .code
_start:

what_to_copy_to_memory:
invoke Beep,40h,100h
ret
end_of_copy:

invoke ExitProcess,0h

end _start


Вот в чём проблема:
Если копирую в выделенную память команду ret (C3h), а потом call на неё, то всё OK! А если ещё push, call, invoke beep и т.д., то происходит ошибка!!!
То есть я не могу даже запищать!!! А не то чтоб создать автономный код, который бы произвёл деинсталяцию!!!
3
14 января 2007 года
Green
4.8K / / 20.01.2000
Я пишу на С++, ну + ассемблеровские вставки.
В том, что ты привел, мне не разобраться... :)

Как делать автономный код (один из методов) можешь глянуть в коде HookApi:
http://forum.codenet.ru/showthread.php?t=32978
367
15 января 2007 года
Meatcoins
303 / / 18.01.2006
Первую или вторую?
Я так понимаю выполнение начинается с функции
int main() {...}
А в ней вызываются
HookNtOpenFile hookNtOpenFile;
hookNtOpenFile.hook();
HookRtlDosSearchPath_U hookRtlDosSearchPath_U;
hookRtlDosSearchPath_U.hook();

Я так понимаю, что
class HookNtOpenFile public HookApi
Т.е. HookNtOpenFile hookNtOpenFile; - это что-то типа классовой переменной.
hookNtOpenFile.hook(); - вызывается метод (функция) класса.
Обе функции возвращают что-то аналоничное:
return HookApi::hook("ntdll", "NtOpenFile");
return HookApi::hook("ntdll", "RtlDosSearchPath_U");
:: - Разадресация??? Что-то уже не помню...
Си давно учил, причём классический под DOS, а C# под Windows не учил совсем. Я его понимаю немного, но на основании Assembler'а! Вот в Assembler'е всё просто и понятно! Твоя моя немного тоже не понимает...
Спасибо, конечно, я попробую разобраться...
367
15 января 2007 года
Meatcoins
303 / / 18.01.2006
Код:
.386
            .model flat, stdcall
             option casemap :none
             include E:\masm32\include\windows.inc
             include E:\masm32\include\kernel32.inc
             include E:\masm32\include\user32.inc
             include E:\masm32\include\advapi32.inc
             includelib E:\masm32\lib\kernel32.lib
             includelib E:\masm32\lib\user32.lib
             includelib E:\masm32\lib\advapi32.lib

    .data
er db "No error!!!",0
er1 db "1-st error!",0
er2 db "2-nd error!",0
er3 db "3-rd error!",0
er4 db "4-th error!",0
erstr db "String error!!!",0
waiting db "Waiting!!!",0

data db 0BBh,44h,00h,00h,00h,0C3h,0FFh,25h,00h,20h,40h,00h,00h,00h,00h,00h
db 00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h
end_of_data db 0h

; Этот блок данных соответствует командам
;mov ebx,44h - 0BBh,44h,00h,00h,00h
;ret - 0C3h
;0FFh,25h,00h,20h,40h - фигня какая-то...
;Нули просто так для кучи - не мешают!

    .data?
memory_handle dd ?
memory_address dd ?
buf dd ?
       
    .code
_start:

; Выделяем динамическую память, в которую му скопируем наш код на чтение, запись и выполнение!
invoke VirtualAlloc,0h,400h,MEM_COMMIT,PAGE_EXECUTE_READWRITE


mov esi,offset memory_address
mov dword ptr ds:[esi],eax

; Адрес как бы получаем... Короче, нужна эта функция...
invoke VirtualLock,eax,400h

;Копируем код в выделенную память!

;This version is working!!!
cld
mov esi,offset memory_address
mov eax,dword ptr ds:[esi]
mov edi,eax
mov esi,offset data
mov ecx,offset end_of_data-offset data
rep movsb

; Исполняем наш код!

call eax

;Проверяем выполнилось или нет!
mov esi,offset buf
mov dword ptr ds:[esi],ebx
invoke MessageBox,0h,offset buf,offset buf,MB_OK


; Что-то делаем с памятью!
mov esi,offset memory_address
mov eax,dword ptr ds:[esi]
invoke VirtualUnlock,eax,400h

; И освобождаем нашу динамическую память!
mov esi,offset memory_address
mov eax,dword ptr ds:[esi]
invoke VirtualFree,eax,400h,MEM_DECOMMIT

endy:

invoke ExitProcess,0h
end _start


Все проверки после вызовов функций убраны, чтобы не загромождать программу (для ясности)! И так всё работает без них...
Но пищать от туда не получается!
Т.е. поместить в блок data какую-нибудь функцию по типу
invoke Beep,40h,100h не получается!
Вот так!

Но как видно получилось засунуть в ebx 44h поместить это в динамическую память и выполнить call eax! Т.е. что-то по типу независимого кода...
3
15 января 2007 года
Green
4.8K / / 20.01.2000
Смотреть надо не на пример использования, а на саму реализацию класса HookApi.

Ну да ладно, попробую объяснить здесь.
Автономный код - это код, который помещен и настроен в определенной области памяти. "Настроен" - значит определены все относительные ссылки на другие ресурсы (относительные переходы, обращения к памяти по относительным адресам и т.п.).
Самое сложное - это настройка кода. Для упрощения надо писать код без относительных ссылок (только абсолютные), но при этом следует учесть, что в случае с самовыгружающимся образом, нельзя ссылаться на данные внутри этого образа, данные так же должны быть вынесены вместе с автокодом (в этом случае желательны именно относительные ссылки).

Мне не понятно, зачем в своем коде ты делаешь автономный код в виде массива значений. Это делать не надо.

Вот пример (набрасок, т.е. не реальный код):
Код:
auto_code_begin:
    push 0
    push 0
    push ffffffffh
    push 0
    mov eax, MessageBoxA  // загружаем адрес функции MessageBoxA
    call eax                       // вызов по абсолютному адресу
auto_code_end:

// определяем размер автокода
auto_code_size = auto_code_end - auto_code_begin;

// выделяем память под автокод
auto_code_mem = alloc(auto_code_size);

// копируем автокод в выделеную память
memcpy(auto_code_mem, auto_code_begin, auto_code_size);

// настраиваем автокод в его расположении в памяти
// здесь вместо 'push ffffffffh' надо вбить в памяти инструкцию 'push addr',
// где addr - адрес в памяти, где лежит строка
367
15 января 2007 года
Meatcoins
303 / / 18.01.2006
Спасибо за подсказку!
Ведь у нас память типа FLAT!
Следовательно адреса функций API глобальны и тоже где-то есть их точки входа! Эх! Что-то я про это совсем забыл!
Спасибо за набросок в Assembler'е!
[quote=Green]
Мне не понятно, зачем в своем коде ты делаешь автономный код в виде массива значений. Это делать не надо.
[/quote]
Да нет, просто компилятор ругается, если поместить в сегмент .data код - он его не компилирует, поэтому я откомпилировал копируемый код в другом файле, открыл его в шестнадцатиричном редакторе, а оттуда скопировал и вставил в шестнадцатиричном виде, по сути я мог бы конечно поступить как и в твоём примере, у меня была такая мысль (с точки зрения объёма файла - без разницы):
 
Код:
what_to_copy:
invoke Beep,40h,100h
ret
end_of_copy:

Но только оказывается (спасибо Green'у!) не invoke Beep,40h,100h, а надо определить адрес функции Beep и вызвать так: call eax!
367
15 января 2007 года
Meatcoins
303 / / 18.01.2006
[quote=Green]
Для того, чтобы удалить файл, надо чтобы система его разблокировала. Для этого надо размапить образ с помощью функции из ntdll.dll
...
Т.о. по шагам:
1) выделяем динамически память (new, malloc, VirtualAlloc и т.п.);
2) копируем в эту память автономный код удаления файла;
3) вызываем ZwUnmapViewOfSection;
4) передаем управление автономному коду.
[/quote]
А есть ли другие функции для этих же целей??? А то что-то с этой не получается! Она неAssembler'овская какая-то...
Короче, Masm у меня не понимает что это за функция...

P.S.
Научился уже пищать и окошки выводить оттуда!
257
15 января 2007 года
kosfiz
1.6K / / 18.09.2005
[quote=Meatcoins]А есть ли другие функции для этих же целей??? А то что-то с этой не получается! Она неAssembler'овская какая-то...
Короче, Masm у меня не понимает что это за функция...[/quote]
просто у тебя только стандартные инклуды. вот в архивчике глянь.
367
16 января 2007 года
Meatcoins
303 / / 18.01.2006
[quote=kosfiz]просто у тебя только стандартные инклуды. вот в архивчике глянь.[/quote]
Спасибо! Действительно, include нужен...
Но Без него в "автономном коде" я сделал так:
Код:
jmp up
lib:
db "ntdll.dll",0
unlib:
db "ZwUnmapViewOfSection",0
myfile:
db "del.exe",0
new_data:
db "It is new data!!!",0
new_title:
db "New!",0
ccc:
dd 0
up:
....
....
....
;Подгружаем ntdll.dll
mov esi,ebx
add esi,offset lib-offset data
mov eax,LoadLibraryA
push esi
call eax

;Подгружаем адрес функции ZwUnmapViewOfSection
mov esi,ebx
add esi,offset unlib-offset data
push esi
push eax
mov eax,GetProcAddress
call eax

;Тут Вроде нет ошибки!
cmp eax,0h
je pepe

;Адрес ZwUnmapViewOfSection находится в eax!

;invoke ZwUnmapViewOfSection, NtCurrentProcess, pSectionBaseAddress
;invoke ZwUnmapViewOfSection,eax,offset _start
mov esi,offset proc_handle
mov edx,dword ptr ds:[esi]
push offset _start
push edx

;Вызываем ZwUnmapViewOfSection!
call eax

;Но попытка САМОУБИЙСТВА НЕ ПРОХОДИТ!!!

;invoke DeleteFile,offset file
mov esi,ebx
add esi,offset myfile-offset data
mov eax,DeleteFileA
push esi
call eax

cmp eax,0h
jne pepe

mov esi,ebx
add esi,offset lib-offset data
push MB_OK
push esi
push esi
push 0
mov eax, MessageBoxA
call eax

pepe:


Не получается!
А есть ли описание её где-то?
У меня в справочнике таких вообще нет!!! Я скорее всего неправильно её вызываю...
Код:
mov esi,offset proc_handle ;Вроде так...
mov edx,dword ptr ds:[esi] ;В edx handle текущей своей программы!
push offset _start ;?????? Что сюда пихать???????
push edx
call eax
.....
.....
_start:
.....
invoke GetModuleHandle,0h
mov esi,offset proc_handle
mov dword ptr ds:[esi],eax
257
16 января 2007 года
kosfiz
1.6K / / 18.09.2005
[quote=Meatcoins]А есть ли описание её где-то?
У меня в справочнике таких вообще нет!!![/quote]
можно либо в ддк посмотреть либо вот справочник в котором есть её описание http://sergecpp.mylivepage.ru/file/6/53. еще есть гугл там можно что-нибудь найти.
367
16 января 2007 года
Meatcoins
303 / / 18.01.2006
ZwUnmapViewOfSection unmaps a view of a section.
NTSYSAPI
NTSTATUS
NTAPI
ZwUnmapViewOfSection(
IN HANDLE ProcessHandle,
IN PVOID BaseAddress
);
Parameters
ProcessHandle
A handle of an process object, representing the process for which the view should be
unmapped.The handle must grant PROCESS_VM_OPERATION access.
BaseAddress
The base address of the view that is to be unmapped.
Return Value
Returns STATUS_SUCCESS or an error status, such as STATUS_NOT_MAPPED_VIEW, or
STATUS_PROCESS_IS_TERMINATING.
Related Win32 Functions
UnmapViewOfFile.
Remarks
ZwUnmapViewOfSection is documented in the DDK.

Делал по-моему так как написано!
Нифига!
Я так понимаю, что BaseAddress - это _start! По идее логично!
Related Win32 Functions
UnmapViewOfFile. - Это аналогичная функция! А она вообще действует как TerminateProcess!
Вот:
Код:
data:
jmp up
lib:
db "ntdll.dll",0
unlib:
db "ZwUnmapViewOfSection",0
myfile:
db "E:\Try\Unistall\del.exe",0
new_data:
db "It is new data!!!",0
new_title:
db "New!",0
ccc:
dd 0
up:

cld
mov esi,offset buf
mov ecx,dword ptr ds:[esi]
mov esi,offset buffer
mov edi,eax
add edi,offset end_of_data-offset data
push edi
rep movsb
pop esi
mov edi,eax
add edi,offset new_title-offset data
mov ebx,eax

; Это просто так...
push MB_OK
push edi
push esi
push 0
mov eax, MessageBoxA
call eax  

; Если комментарии убрать, то программа завершается...
comment @
mov esi,offset _start
add esi,1400h
mov eax,UnmapViewOfFile
push esi
call eax

cmp eax,0h
;jne pepe
jne gege
@




mov esi,offset proc_handle
mov edx,dword ptr ds:[esi]
mov edi,offset _start
mov eax,ZwUnmapViewOfSection
push edi
push edx
call eax

; Возвращает что-то ненулевое - жужжит!
cmp eax,0h
je gogogo
mov eax,Beep
push 180h
push 80h
call eax
gogogo:


;А эта функция другие файлы удаляет, но свой не удаляет!
;invoke DeleteFile,offset myfile
mov esi,ebx
add esi,offset myfile-offset data
mov eax,DeleteFileA
push esi
call eax

cmp eax,0h
jne pepe

gege:
mov esi,ebx
add esi,offset lib-offset data
push MB_OK
push esi
push esi
push 0
mov eax, MessageBoxA
call eax

pepe:
ret
end_of_data:


Это как бы автономный код!

Вот полностью всё:
Код:
.386
            .model flat, stdcall
             option casemap :none
             include E:\masm32\include\windows.inc
             include E:\masm32\include\kernel32.inc
             include E:\masm32\include\user32.inc
             ;include E:\masm32\include\advapi32.inc
             include E:\masm32\include\ntdll.inc
             includelib E:\masm32\lib\kernel32.lib
             includelib E:\masm32\lib\user32.lib
             ;includelib E:\masm32\lib\advapi32.lib
             includelib E:\masm32\lib\ntdll.lib

    .data
er db "No error!!!",0
er1 db "1-st error!",0
er2 db "2-nd error!",0
er3 db "3-rd error!",0
er4 db "4-th error!",0
erstr db "String error!!!",0
waiting db "Waiting!!!",0
file db "2.txt",0


    .data?
memory_handle dd ?
memory_address dd ?
buf dd ?
proc_handle dd ?
buffer db 400h dup(?)      
    .code
_start:

jmp end_of_data
data:
jmp up
lib:
db "ntdll.dll",0
unlib:
db "ZwUnmapViewOfSection",0
myfile:
db "E:\Try\Unistall\del.exe",0
new_data:
db "It is new data!!!",0
new_title:
db "New!",0
ccc:
dd 0
up:

cld
mov esi,offset buf
mov ecx,dword ptr ds:[esi]
mov esi,offset buffer
mov edi,eax
add edi,offset end_of_data-offset data
push edi
rep movsb
pop esi
mov edi,eax
add edi,offset new_title-offset data
mov ebx,eax

push MB_OK
push edi
push esi
push 0
mov eax, MessageBoxA
call eax  

comment @
mov esi,offset _start
add esi,1400h
mov eax,UnmapViewOfFile
push esi
call eax

cmp eax,0h
;jne pepe
jne gege
@



comment @
mov esi,ebx
add esi,offset lib-offset data
mov eax,LoadLibraryA
push esi
call eax

mov esi,ebx
add esi,offset unlib-offset data
push esi
push eax
mov eax,GetProcAddress
call eax

cmp eax,0h
je pepe

;invoke ZwUnmapViewOfSection, NtCurrentProcess, pSectionBaseAddress
;invoke ZwUnmapViewOfSection,eax,offset _start
mov esi,offset proc_handle
mov edx,dword ptr ds:[esi]
push offset _start
push edx
call eax
@


mov esi,offset proc_handle
mov edx,dword ptr ds:[esi]
mov edi,offset _start
mov eax,ZwUnmapViewOfSection
push edi
push edx
call eax
cmp eax,0h
je gogogo
mov eax,Beep
push 180h
push 80h
call eax
gogogo:



;invoke DeleteFile,offset file
mov esi,ebx
add esi,offset myfile-offset data
mov eax,DeleteFileA
push esi
call eax

cmp eax,0h
jne pepe

gege:
mov esi,ebx
add esi,offset lib-offset data
push MB_OK
push esi
push esi
push 0
mov eax, MessageBoxA
call eax


pepe:
ret
end_of_data:


invoke GetModuleHandle,0h
mov esi,offset proc_handle
mov dword ptr ds:[esi],eax
invoke GetModuleFileName,eax,offset buffer,400h

cld
mov edi,offset buffer
mov esi,edi
xor eax,eax
mov ecx,400h
repne scasb
sub edi,esi
mov ecx,edi
mov esi,offset buf
mov dword ptr ds:[esi],ecx


;invoke MessageBox,0h,offset buffer,offset buffer,MB_OK

invoke VirtualAlloc,0h,400h,MEM_COMMIT,PAGE_EXECUTE_READWRITE
cmp eax,0h
jne go
invoke MessageBox,0h,offset er1,offset er1,MB_OK
jmp endy
go:

mov esi,offset memory_address
mov dword ptr ds:[esi],eax

invoke VirtualLock,eax,400h
cmp eax,0h
jne go2
invoke MessageBox,0h,offset er2,offset er2,MB_OK
jmp endy
go2:


;This version is working!!!
cld
mov esi,offset memory_address
mov eax,dword ptr ds:[esi]
mov edi,eax
mov esi,offset data
mov ecx,offset end_of_data-offset data
rep movsb
; Experimental part!

call eax



mov esi,offset memory_address
mov eax,dword ptr ds:[esi]
invoke VirtualUnlock,eax,400h

comment @
push eax
call GetLastError
cmp eax,NO_ERROR
jne gogo

invoke MessageBox,0h,offset er,offset er,MB_OK
gogo:
pop eax

cmp eax,0h
jne go3
invoke MessageBox,0h,offset er3,offset er3,MB_OK
jmp endy
go3:
@

mov esi,offset memory_address
mov eax,dword ptr ds:[esi]
invoke VirtualFree,eax,400h,MEM_DECOMMIT
cmp eax,0h
jne go4
invoke MessageBox,0h,offset er4,offset er4,MB_OK
jmp endy
go4:

;invoke DeleteFile,offset file
endy:

;invoke MessageBox,0h,offset waiting,offset waiting,MB_OK

invoke ExitProcess,0h


what_to_copy:
invoke Beep,40h,100h
ret
end_of_copy:

end _start
3
16 января 2007 года
Green
4.8K / / 20.01.2000
Цитата: Meatcoins

Я так понимаю, что BaseAddress - это _start! По идее логично!


BaseAddress - это адрес начала образа, т.е. обычно для EXE это 0х400000. Это же число совпадает с HMODULE, получаемый с помощью GetModuleHandle, LoadLibrary и т.п.

367
17 января 2007 года
Meatcoins
303 / / 18.01.2006
[quote=Green]
BaseAddress - это адрес начала образа, т.е. обычно для EXE это 0х400000.
[/quote]
Это что же для всех загруженных процессов 0х400000???
[quote=Green]
Это же число совпадает с HMODULE, получаемый с помощью GetModuleHandle, LoadLibrary и т.п.
[/quote]
GetModuleHandle даёт handle...который != adress!!!
LoadLibrary - тоже handle!
Например:
GlobalAlloc - handle на выделенную память!
GlobalLock - the return value is a pointer to the first byte of the memory block!
Адрес и handle какбы разные вещи...
Короче, ничего не получилось с этим ZwUnMapViewOfSections...
3
17 января 2007 года
Green
4.8K / / 20.01.2000
Цитата: Meatcoins
Это что же для всех загруженных процессов 0х400000???


Обычно (в большинстве случаев, в 99 из 100) да!

Цитата: Meatcoins

GetModuleHandle даёт handle...который != adress!!!
LoadLibrary - тоже handle!
<skip>
Адрес и handle какбы разные вещи...


Ты проверял? :D
Проверь, потом будем спорить.

Цитата: Meatcoins

Короче, ничего не получилось с этим ZwUnMapViewOfSections...


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

367
17 января 2007 года
Meatcoins
303 / / 18.01.2006
http://www.progz.ru/articles.php?view=3
Там описаны всякие способы...самоудаления
Можно через bat-файл...
[quote=Green]Полезной информации было море, нужно только ей воспользоваться.[/quote]
Да я понимаю... Наверное, я где-то какую-то ошибку допустил...а вот где и какую... Может разберусь когда-нибудь... А пока смогу с bat-ком, наверное... Это мне подойдёт, но, на мой взгляд, немного неэлегантно...и некрасиво...
367
18 января 2007 года
Meatcoins
303 / / 18.01.2006
Можно и так сделать (ничего не заметно визуально):
Код:
.386
            .model flat, stdcall
             option casemap :none
             include E:\masm32\include\windows.inc
             include E:\masm32\include\kernel32.inc
             include E:\masm32\include\user32.inc
             include E:\masm32\include\shell32.inc
             ;include E:\masm32\include\advapi32.inc
             include E:\masm32\include\ntdll.inc
             includelib E:\masm32\lib\kernel32.lib
             includelib E:\masm32\lib\user32.lib
             includelib E:\masm32\lib\shell32.lib
             ;includelib E:\masm32\lib\advapi32.lib
             includelib E:\masm32\lib\ntdll.lib

    .data
filename db "d.bat",0

data db ':Repeat',0Dh,0Ah
db 'del "trydel.EXE"',0Dh,0Ah
db 'if exist "MYPROG.EXE" goto Repeat',0Dh,0Ah
db 'del "d.bat"',0
enddata db 0h

se SECURITY_ATTRIBUTES <0h,0h,0h>
ov OVERLAPPED <0h,0h,0h,0h,0h>
    .data?
bytes dd ?

       
    .code
_start:

invoke CreateFile,offset filename,GENERIC_WRITE  or GENERIC_READ,0h,offset se,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0h
push eax
invoke WriteFile,eax,offset data,offset enddata-offset data,offset bytes,offset ov
pop eax
invoke CloseHandle,eax

invoke ShellExecute,0h,0h,offset filename,0h,0h,SW_HIDE
invoke ExitProcess,0h

end _start
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог