ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[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 ; . 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 & . 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]ÄÄÄ