
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[MIME.ASM]ÄÄÄ
; MIME attachment encoder.

                .386
		.MODEL  FLAT
                .DATA

EXTRN           ExitProcess:PROC
EXTRN           CreateFileA:PROC
EXTRN           CloseHandle:PROC
EXTRN           ReadFile:PROC
EXTRN           WriteFile:PROC
EXTRN           GetFileSize:PROC

OPEN_EXISTING           EQU     00000003h
CREATE_ALWAYS           EQU     00000002h
FILE_ATTRIBUTE_NORMAL   EQU     00000080h
GENERIC_READ            EQU     80000000h
GENERIC_WRITE           EQU     40000000h

START:
                XOR     EBX, EBX

                PUSH    EBX
		PUSH    FILE_ATTRIBUTE_NORMAL
		PUSH    OPEN_EXISTING
                PUSH    EBX
                PUSH    EBX
                PUSH    GENERIC_READ
                CALL    @1
                DB      'INPUT.BIN', 0          ; Binary you want to encode.
@1:             CALL    CreateFileA

                MOV     [Input_Handle], EAX

                PUSH    EBX
		PUSH    FILE_ATTRIBUTE_NORMAL
                PUSH    CREATE_ALWAYS
                PUSH    EBX
                PUSH    EBX
                PUSH    GENERIC_WRITE
                CALL    @2
                DB      'OUTPUT.EML', 0
@2:             CALL    CreateFileA

                MOV     [Output_Handle], EAX

                PUSH    EBX
                PUSH    OFFSET IO_Bytes_Count
                PUSH    (@4-@3)
                CALL    @4
@3:             DB      'MIME-Version: 1.0', 0Dh, 0Ah
                DB      'Content-Type: multipart/mixed; boundary=ir', 0Dh, 0Ah
                DB      0Dh, 0Ah
                DB      '--ir', 0Dh, 0Ah
                DB      0Dh, 0Ah
                DB      'this is plain text', 0Dh, 0Ah
                DB      '--ir', 0Dh, 0Ah
                DB      'Content-Type: application; name=binary.exe', 0Dh, 0Ah
                DB      'Content-Transfer-Encoding: base64', 0Dh, 0Ah
                DB      0Dh, 0Ah
@4:             PUSH    [Output_Handle]
                CALL    WriteFile

                PUSH    EBX
                PUSH    [Input_Handle]
                CALL    GetFileSize

                CDQ
                MOV     ECX, (76/4)*3
                DIV     ECX

                DEC     EDX
                JS      No_Round

                INC     EAX

No_Round:       XCHG    ECX, EAX

Encode_Line:    PUSH    ECX

                MOV     ESI, OFFSET Input_Buffer

                PUSH    0
                PUSH    OFFSET IO_Bytes_Count
                PUSH    (76/4)*3
                PUSH    ESI
                PUSH    [Input_Handle]
                CALL    ReadFile

                MOV     EDI, OFFSET Output_Buffer

                PUSH    EDI

                PUSH    76/4
                POP     ECX

Encode_Packet:  PUSH    ECX

                MOV     CL, 8

                LODSB
                SHL     EAX, CL

                LODSB
                SHL     EAX, CL

                LODSB
                SHL     EAX, CL

                MOV     EBX, OFFSET Encoding_Table

                MOV     CL, 4

Encode_Byte:    SHR     EAX, 2

                ROL     EAX, 8

                XLAT
                STOSB

                LOOP    Encode_Byte

                POP     ECX

                LOOP    Encode_Packet

                MOV     WORD PTR [EDI], 0A0Dh   ; <CRLF>.

                POP     EAX

                PUSH    0
                PUSH    OFFSET IO_Bytes_Count
                PUSH    78
                PUSH    EAX
                PUSH    [Output_Handle]
                CALL    WriteFile

                POP     ECX

                LOOP    Encode_Line

                PUSH    0
                CALL    @5
IO_Bytes_Count  DD      0
@5:             PUSH    (@7-@6)
                CALL    @7
@6:             DB      '--ir--', 0Dh, 0Ah
@7:             PUSH    [Output_Handle]
                CALL    WriteFile

                PUSH    12345678h
Output_Handle   =       DWORD PTR $-4
                CALL    CloseHandle

                PUSH    12345678h
Input_Handle    =       DWORD PTR $-4
                CALL    CloseHandle

Exit:           PUSH    0
		CALL    ExitProcess

Encoding_Table: DB      'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
                DB      'abcdefghijklmnopqrstuvwxyz'
                DB      '0123456789+/'

Input_Buffer    DB      200 DUP(0)
Output_Buffer   DB      200 DUP(0)


                END     START
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[MIME.ASM]ÄÄÄ
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[UUENCODE.ASM]ÄÄÄ
; UUENCODE attachment encoder.

                .386
		.MODEL  FLAT
                .DATA

EXTRN           ExitProcess:PROC
EXTRN           CreateFileA:PROC
EXTRN           CloseHandle:PROC
EXTRN           ReadFile:PROC
EXTRN           WriteFile:PROC
EXTRN           GetFileSize:PROC

OPEN_EXISTING           EQU     00000003h
CREATE_ALWAYS           EQU     00000002h
FILE_ATTRIBUTE_NORMAL   EQU     00000080h
GENERIC_READ            EQU     80000000h
GENERIC_WRITE           EQU     40000000h

START:
                XOR     EBX, EBX

                PUSH    EBX
		PUSH    FILE_ATTRIBUTE_NORMAL
		PUSH    OPEN_EXISTING
                PUSH    EBX
                PUSH    EBX
                PUSH    GENERIC_READ
                CALL    @1
                DB      'INPUT.BIN', 0
@1:             CALL    CreateFileA

                MOV     [Input_Handle], EAX

                PUSH    EBX
		PUSH    FILE_ATTRIBUTE_NORMAL
                PUSH    CREATE_ALWAYS
                PUSH    EBX
                PUSH    EBX
                PUSH    GENERIC_WRITE
                CALL    @2
                DB      'OUTPUT.UUE', 0
@2:             CALL    CreateFileA

                MOV     [Output_Handle], EAX

                PUSH    EBX
                PUSH    OFFSET IO_Bytes_Count
                PUSH    22
                CALL    @3
                DB      'begin 644 binary.exe', 0Dh, 0Ah
@3:             PUSH    [Output_Handle]
                CALL    WriteFile

                PUSH    EBX
                PUSH    [Input_Handle]
                CALL    GetFileSize

                XOR     EDX, EDX
                MOV     ECX, 45
                DIV     ECX

                DEC     EDX
                JS      No_Round

                INC     EAX

No_Round:       XCHG    ECX, EAX

Encode_Line:    PUSH    ECX

                MOV     ESI, OFFSET Input_Buffer

                PUSH    0
                PUSH    OFFSET IO_Bytes_Count
                PUSH    45
                PUSH    ESI
                PUSH    [Input_Handle]
                CALL    ReadFile

                MOV     EDI, OFFSET Output_Buffer

                CLD

                MOV     AL, (45 + 20h)          ; Decoded length of 45 bytes.
                STOSB

                PUSH    (45 / 3)                ; Process 45 bytes.
                POP     ECX

Encode_DWORD:   LODSD
                DEC     ESI

                SHL     EAX, 8

                MOV     BH, AH

                ROL     EAX, 8

                XCHG    AL, BH

                ROR     EAX, 8

                MOV     AH, BH

                PUSH    ECX

                PUSH    4
                POP     ECX

Encode_Byte:    SHR     EAX, 2

                ROR     EAX, 3*8

                ADD     AL, 20h

                CMP     AL, 20h                 ; It's a space?
                JNE     Store_Encoded

                MOV     AL, 60h
Store_Encoded:  STOSB

                ROL     EAX, 3*8

                SHL     EAX, 8

                LOOP    Encode_Byte

                POP     ECX

                LOOP    Encode_DWORD

                MOV     AX, 0A0Dh               ; Store <CR> & <LF>.
                STOSW

                PUSH    0
                PUSH    OFFSET IO_Bytes_Count
                PUSH    63
                PUSH    OFFSET Output_Buffer
                PUSH    [Output_Handle]
                CALL    WriteFile

                POP     ECX

                LOOP    Encode_Line

                PUSH    ECX
                CALL    @4
IO_Bytes_Count  DD      0
@4:             PUSH    8
                CALL    @5
                DB      '`', 0Dh, 0Ah, 'end', 0Dh, 0Ah
@5:             PUSH    [Output_Handle]
                CALL    WriteFile

                PUSH    12345678h
Output_Handle   =       DWORD PTR $-4
                CALL    CloseHandle

                PUSH    12345678h
Input_Handle    =       DWORD PTR $-4
                CALL    CloseHandle

Exit:           PUSH    0
		CALL    ExitProcess

Input_Buffer    DB      45 DUP(0)
Output_Buffer   DB      63 DUP(0)

                END     START
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[UUENCODE.ASM]ÄÄÄ
