Косяк с самоуничтожающимся файлом!
Пояснение:
В переменной 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
но невозможное возможно............
И как же сделать это "невозможное"???
Ведь есть же такая штука - это точно!!!
Например, когда программка DEINSTAL'руется!!!
По сути исполняемый файл сам себя удаляет!!!
Вот и я такую же штуку хочу сделать!!!
PS. Думаю если во время выполнения удалить текущий исполняемый файл, могут быть косяки...
PS. Думаю если во время выполнения удалить текущий исполняемый файл, могут быть косяки...
Если грамотно (а по другому и не получится) удалить, то косяков не будет.
А проблемы могут быть с данными или секциями, имеющими атрибут DISCARDABLE
Не обязательно.
Например, в моей программе, это наоборот первое действие. :)
А проблемы могут быть с данными или секциями, имеющими атрибут DISCARDABLE
По секрету: не будет никаких секций и данных связаныых с файлом PE... :)
А можно этот пример написать? А то все рассуждают-рассуждают можно-нельзя, косяки-некосяки, возможно-невозможно... а конкретно как это сделать никто не пишет!
А эта прога в составе каждого Windows'а идёт? И идёт ли вообще? Мне её что, перед завершением своей проги вызвать надо? Или свою прогу впендюривать в каждый Windows (куда-нибудь в папку system32), которая будет создаваться деинсталируемой прогой, а потом ею вызываться?
Что-то мудрёно как-то... А проще можно? Примерчик бы...
Нет, эта прога отдельная, ее можно в инете скачать (не помню точно где), а насчет вызывать - нет. Я просто имел ввиду что такое (удаление блокируемого файла) впринципе возможно.
PS. Если бы эта прога была в составе Windows, нафиг тогда параметр dwShareFlags функции CreateFile??? :)
Рассказываю, как сделать конкретно.
Для того, чтобы удалить файл, надо чтобы система его разблокировала. Для этого надо размапить образ с помощью функции из ntdll.dll
Т.к. после этого никаких секций PE-файла в памяти не останется, предварительно необходимо завести где-нибудь в пямяти автономный код, который собственно и удалит файл с диска.
Т.о. по шагам:
1) выделяем динамически память (new, malloc, VirtualAlloc и т.п.);
2) копируем в эту память автономный код удаления файла;
3) вызываем ZwUnmapViewOfSection;
4) передаем управление автономному коду.
Пункты 3) и 4) могут быть поменены местами.
А проблем с Data Execution Prevention не будет? Просто не пробовал, хотелось бы чтобы не было, если знаешь...
И еще: этот автономный код будет относиться к текущему процессу или он будет полностью независим?
Не будет. В крайнем случае поставь соотв. аттрибуты на эту область памяти.
И еще: этот автономный код будет относиться к текущему процессу или он будет полностью независим?
К текущему, конечно же.
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)
кстати первое что хотел предложить, но передумал...
[quote=Green]
Рассказываю, как сделать конкретно.
Для того, чтобы удалить файл, надо чтобы система его разблокировала. Для этого надо размапить образ с помощью функции из ntdll.dll
Код:
LONG NTAPI ZwUnmapViewOfSection(HANDLE hProcess, PVOID pvAddress)
Т.к. после этого никаких секций PE-файла в памяти не останется, предварительно необходимо завести где-нибудь в пямяти автономный код, который собственно и удалит файл с диска.
Т.о. по шагам:
1) выделяем динамически память (new, malloc, VirtualAlloc и т.п.);
2) копируем в эту память автономный код удаления файла;
3) вызываем ZwUnmapViewOfSection;
4) передаем управление автономному коду.
Пункты 3) и 4) могут быть поменены местами.
[/quote]
И теперь защёл в ТУПИК!
Вот моя программа:
.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):
.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 и т.д., то происходит ошибка!!!
То есть я не могу даже запищать!!! А не то чтоб создать автономный код, который бы произвёл деинсталяцию!!!
В том, что ты привел, мне не разобраться... :)
Как делать автономный код (один из методов) можешь глянуть в коде HookApi:
http://forum.codenet.ru/showthread.php?t=32978
Я так понимаю выполнение начинается с функции
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'е всё просто и понятно! Твоя моя немного тоже не понимает...
Спасибо, конечно, я попробую разобраться...
.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! Т.е. что-то по типу независимого кода...
Ну да ладно, попробую объяснить здесь.
Автономный код - это код, который помещен и настроен в определенной области памяти. "Настроен" - значит определены все относительные ссылки на другие ресурсы (относительные переходы, обращения к памяти по относительным адресам и т.п.).
Самое сложное - это настройка кода. Для упрощения надо писать код без относительных ссылок (только абсолютные), но при этом следует учесть, что в случае с самовыгружающимся образом, нельзя ссылаться на данные внутри этого образа, данные так же должны быть вынесены вместе с автокодом (в этом случае желательны именно относительные ссылки).
Мне не понятно, зачем в своем коде ты делаешь автономный код в виде массива значений. Это делать не надо.
Вот пример (набрасок, т.е. не реальный код):
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 - адрес в памяти, где лежит строка
Ведь у нас память типа FLAT!
Следовательно адреса функций API глобальны и тоже где-то есть их точки входа! Эх! Что-то я про это совсем забыл!
Спасибо за набросок в Assembler'е!
[quote=Green]
Мне не понятно, зачем в своем коде ты делаешь автономный код в виде массива значений. Это делать не надо.
[/quote]
Да нет, просто компилятор ругается, если поместить в сегмент .data код - он его не компилирует, поэтому я откомпилировал копируемый код в другом файле, открыл его в шестнадцатиричном редакторе, а оттуда скопировал и вставил в шестнадцатиричном виде, по сути я мог бы конечно поступить как и в твоём примере, у меня была такая мысль (с точки зрения объёма файла - без разницы):
invoke Beep,40h,100h
ret
end_of_copy:
Но только оказывается (спасибо Green'у!) не invoke Beep,40h,100h, а надо определить адрес функции Beep и вызвать так: call eax!
Для того, чтобы удалить файл, надо чтобы система его разблокировала. Для этого надо размапить образ с помощью функции из ntdll.dll
...
Т.о. по шагам:
1) выделяем динамически память (new, malloc, VirtualAlloc и т.п.);
2) копируем в эту память автономный код удаления файла;
3) вызываем ZwUnmapViewOfSection;
4) передаем управление автономному коду.
[/quote]
А есть ли другие функции для этих же целей??? А то что-то с этой не получается! Она неAssembler'овская какая-то...
Короче, Masm у меня не понимает что это за функция...
P.S.
Научился уже пищать и окошки выводить оттуда!
Короче, Masm у меня не понимает что это за функция...[/quote]
просто у тебя только стандартные инклуды. вот в архивчике глянь.
Спасибо! Действительно, include нужен...
Но Без него в "автономном коде" я сделал так:
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 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
У меня в справочнике таких вообще нет!!![/quote]
можно либо в ддк посмотреть либо вот справочник в котором есть её описание http://sergecpp.mylivepage.ru/file/6/53. еще есть гугл там можно что-нибудь найти.
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!
Вот:
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:
Это как бы автономный код!
Вот полностью всё:
.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
Я так понимаю, что BaseAddress - это _start! По идее логично!
BaseAddress - это адрес начала образа, т.е. обычно для EXE это 0х400000. Это же число совпадает с HMODULE, получаемый с помощью GetModuleHandle, LoadLibrary и т.п.
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...
Обычно (в большинстве случаев, в 99 из 100) да!
GetModuleHandle даёт handle...который != adress!!!
LoadLibrary - тоже handle!
<skip>
Адрес и handle какбы разные вещи...
Ты проверял? :D
Проверь, потом будем спорить.
Короче, ничего не получилось с этим ZwUnMapViewOfSections...
Полезной информации было море, нужно только ей воспользоваться.
Там описаны всякие способы...самоудаления
Можно через bat-файл...
[quote=Green]Полезной информации было море, нужно только ей воспользоваться.[/quote]
Да я понимаю... Наверное, я где-то какую-то ошибку допустил...а вот где и какую... Может разберусь когда-нибудь... А пока смогу с bat-ком, наверное... Это мне подойдёт, но, на мой взгляд, немного неэлегантно...и некрасиво...
.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