Batch Index du Forum
S’enregistrerRechercherFAQMembresGroupesConnexion
Répondre au sujet Page 1 sur 1
[Expérimental] tcs_o - Tiny Console Server (Output) - TSnake
Auteur Message
Répondre en citant
Message [Expérimental] tcs_o - Tiny Console Server (Output) - TSnake 
Bonjour, je viens ici vous présenter un travail expérimental (c'est plus une preuve de concept).
C'est une commande externe en assembleur reprenant le concept de serveur de darkbox.
En réalité, faire une telle commande n'est pas facile du tout, car il faut réussir à mettre en place un tel concept en assembleur, et comment dire, bah, des bugs, j'en ai eu des tonnes Laughing.

La commande est un peu un mélange de darkbox et batbox, car on reprends le concept de darkbox (serveur) et la technologie de batbox (fasm, astuces pour faire des switch avec fasm).

Sinon, partons sur la commande :
- taille très faible (1.5ko)
- vitesse comparable à darkbox

Cependant, il y a quelques limitations :
- nombre assez limité de commandes
- pas de gestion de l'entrée console (considérez darkbox_i ou batbox ou encore le serveur d'entrée console de darkbox pour ça)
- chaînes de caractères limités à 256 octets (vs 1024 par defaut pour darkbox) (déjà pas mal tout de même)

La syntaxe de cette commande est la même que celle de darkbox, SAUF que le concept de factorisation des commandes ou de multiples commandes n'est pas supporté et que seul le '-' est accepté.

Commandes supportés :
    * -c color : Changer la couleur
    * -a n : Affiche le caractère ASCII n
    * -d text : Affiche "text"
    * -n : Va à la ligne suivante
    * -q : Quitte correctement tcs_o
    * -s : Efface l'écran
    * -w t : Attends internalement t milisecondes


Code:
@Echo off
if defined __ goto :nuancier
set __=.
call %0 %* | tcs_o
set __=
pause>NUL
goto :eof

:nuancier
setlocal enabledelayedexpansion
for %%A in (0 1 2 3 4 5 6 7 8 9 A B C D E F) do (
    for %%B in (0 1 2 3 4 5 6 7 8 9 A B C D E F) do (
        echo -c 0x%%A%%B -d tcs_o
    )
    echo -n
)
echo -c 0x07
echo -q
goto :eof

Assembleur fasm x86 pour win32, le même que batbox Mr. Green
Code:
[lang=asm]; TCS Output - A tiny graphical server-based command for Windows batch.
; Output Server
; Copyright (c) 2017 Teddy ASTIE (TSnake41)
;
; All rights reserved.
; Redistribution and use in source and binary forms, with or without
; modification, are permitted provided that the following conditions are met:
;
; * Redistributions of source code must retain the above copyright
;   notice, this list of conditions and the following disclaimer.
; * Redistributions in binary form must reproduce the above copyright
;   notice, this list of conditions and the following disclaimer in the
;   documentation and/or other materials provided with the distribution.
; * Neither the name of the name of Teddy ASTIE (TSnake41) nor the
;   names of its contributors may be used to endorse or promote products
;   derived from this software without specific prior written permission.
;
; THIS SOFTWARE IS PROVIDED BY ROMAIN GARBI AND CONTRIBUTORS ``AS IS'' AND ANY
; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
; DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

format PE CONSOLE 4.0

include 'win32a.inc'

struc db [data]
{
   common
   . db data
   .size = $ - .
}

NULL = 0
EOF = -1

; Entry point
; Get hOut
invoke GetStdHandle, STD_OUTPUT_HANDLE
mov [hOut],eax

loop_:
call near read_char_

cmp eax,EOF
    ; No more characters to read.
    je near quit_

cmp eax,'-'
    jne near loop_

; Get command char
call near read_char_

; Search char (eax) in jump_chr
mov ecx,jump_chr.size
; Clear edi
mov edi,0

label_loop_:
    cmp al,[jump_chr + edi]
        je near label_found_

    inc edi
    dec ecx

    test ecx,ecx
        ; Label not found
        jz near loop_

    jmp near label_loop_

label_found_:
    jmp   near [jump_table+edi*4]

ascii_:
    call near read_number_
    invoke putchar,eax
    jmp near loop_

color_:
    call near read_number_
    invoke SetConsoleTextAttribute,[hOut],eax
    jmp near loop_

disp_:
    call near read_str_
    invoke write,1,str_buf,ebx
    jmp near loop_

new_line_:
    invoke putchar,0xA
    jmp near loop_

clear_:
    ; Well
    invoke system,clear_cmd
    jmp near loop_

wait_:
    call near read_number_
    invoke Sleep,eax
    jmp near loop_

quit_:
    invoke exit,0

read_str_:
    ; Skip all spaces
    call read_char_

    call is_space_
        jz near read_str_

    cmp eax,'"'
        je near read_str_quote_

    mov ebx,1 ; Offset in str_buf
    mov byte [str_mode],byte 1 ; Reading mode: space

    mov byte [str_buf],byte al

    read_str_loop_:
        cmp ebx,256
            je near read_str_end_

        call near read_char_

        cmp al,'\'
            je near read_str_escape_

        call read_str_cmp_
            je near read_str_end_

        read_str_escape_end_:
        cmp ebx,256
            je near read_str_end_

        mov byte [str_buf + ebx],byte al
        inc ebx
        jmp near read_str_loop_

    read_str_cmp_:
        cmp byte [str_mode],byte 1
            je near is_space_

        ; Quote mode
        cmp al,'"'
        ret

        is_space_:
            cmp byte al,' ' ; Space
                je near is_space_end_

            cmp byte al,0xA ; LF
                je near is_space_end_

            cmp byte al,0xD ; CR
                je near is_space_end_

            cmp byte al,0x9 ; TAB
                ; Useless jump
                ; je near is_space_end_

            is_space_end_:
                ret

    read_str_escape_:
        ; Read next char (skip "\)"
        call near read_char_
        jmp near read_str_escape_end_

    read_str_quote_:
        mov ebx,0 ; Offset is 0
        mov byte [str_mode],byte 2 ; Reading mode: quote
        jmp near read_str_loop_

    read_str_end_:
        ret

read_number_:
    call near read_str_
    cinvoke strtol, str_buf, 0, 0
    ret

read_char_:
    cinvoke getchar

    cmp eax,EOF
        jz near quit_

    ret

; Constants
jump_chr db 'acdnqsw'
jump_table dd \
    ascii_, color_, disp_, \
    new_line_, quit_, clear_, wait_

clear_cmd db 'cls', 0

; Variables
hOut dd ?
str_mode db ?
str_buf: times 256 db 0

; Imports
data import

library \
    msvcrt, 'MSVCRT.DLL', \
    kernel, 'KERNEL32.DLL'

import msvcrt, \
    exit, 'exit', \
    putchar, 'putchar', \
    getchar, 'getchar', \
    write, '_write', \
    strtol, 'strtol', \
    system, 'system'

import kernel, \
    SetConsoleTextAttribute,'SetConsoleTextAttribute', \
    GetStdHandle, 'GetStdHandle', \
    Sleep, 'Sleep'


end data
Code:
echo using System;using System.IO;class P{static void Main(string[]a){FileStream s=File.OpenWrite(a[0]);byte[]d=Convert.FromBase64String(Console.In.ReadToEnd());s.Write(d,0,d.Length);}}>_.cs
%windir%\Microsoft.NET\Framework\v3.5\csc /out:_.exe  _.cs>nul
set/p =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<nul|_ tcs_o.exe   
del _.*
Voilà, c'est tout, il est possible que j'ajoute le goto dans le futur (car sinon, vous allez me tuer Mort de Rire).




______________________________________________________
Partager permet le savoir. Le savoir permet de partager de nouveau savoirs.
Message Publicité 
PublicitéSupprimer les publicités ?


Montrer les messages depuis:
Répondre au sujet Page 1 sur 1
  



Index | créer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation
Copyright 2008 - 2016 // Batch