FileToBase64

Тема в разделе "WASM.WIN32", создана пользователем base64, 14 окт 2004.

  1. base64

    base64 New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2004
    Сообщения:
    5
    Адрес:
    Bolivia
    Пытаюсь сделать программу, которая читает файл и сохраняет в кодировке base64, не могу найти ошибку в ниже изложенном листинге...

    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap :none
    4. include \masm32\include\windows.inc
    5. include \masm32\include\kernel32.inc
    6. include \masm32\include\advapi32.inc
    7. includelib \masm32\lib\kernel32.lib        
    8. includelib \masm32\lib\advapi32.lib
    9.  
    10. .data
    11.   b64Attach               dd      0
    12.    b64AttachLen            dd      0
    13.   lpDestFile    db    "file.exe",0
    14.   szSFileName    db    "base64.txt",0
    15.  
    16.  
    17. .code
    18. Base64Encode proc uses esi edi ebx lpSrc, lpDst, dwSrcLen: DWORD
    19.         mov     esi, lpSrc
    20.         mov     edi, lpDst
    21.         mov     ecx, dwSrcLen
    22.  
    23.         xor     ebx, ebx
    24.  
    25. @l:
    26.         jecxz   @b64_ret
    27.  
    28.         lodsb
    29.         shl     eax, 16
    30.         cmp     ecx, 1
    31.         jz      @work
    32.         lodsb
    33.         shl     ax, 8
    34.         cmp     ecx, 2
    35.         jz      @work
    36.         lodsb
    37.  
    38. @work:
    39.         ; Output b64 quad
    40.         mov     edx, eax
    41.         ror     edx, 24
    42.  
    43.         push    ecx
    44.         push    4
    45.         pop     ecx
    46. @l2:
    47.         call    @b64_write
    48.         loop    @l2
    49.         pop     ecx
    50.  
    51.         inc     ebx
    52.         .IF     ebx == 18
    53.                 xor     ebx, ebx
    54.                 mov     ax, 0a0dh
    55.                 stosw
    56.         .ENDIF
    57.  
    58.         sub     ecx, 3
    59.         jns     @l
    60.  
    61.         ; Pad
    62.         neg     ecx
    63.         sub     edi, ecx
    64.         mov     al, '='
    65.         rep stosb
    66.  
    67. @b64_ret:
    68.         ret
    69.  
    70. @b64_write:
    71.         rol     edx, 6
    72.         mov     eax, edx
    73.         and     al, 00111111b
    74.         cmp     al, 62
    75.         jae     @write_spec
    76.  
    77.         cmp     al, 52
    78.         jae     @write_number
    79.  
    80.         ; Uppercase
    81.         add     al, 'A'
    82.         cmp     al, 'A'+26
    83.         jb      @write
    84.         ; Lowercase
    85.         add     al, 6
    86.         jmp     @write
    87.         ; Number
    88. @write_number:
    89.         add     al, '0'-52
    90.         jmp     @write
    91.         ; Special: +/
    92. @write_spec:
    93.         sub     al, 62
    94.         shl     al, 2
    95.         add     al, 43        
    96. @write:
    97.         stosb
    98.                
    99.         retn
    100. Base64Encode endp
    101.  
    102. FileToBase64 proc uses ebx edi lpDestFileName, outMem, outLen: DWORD
    103.         LOCAL   hFile, dwFileSize: DWORD
    104.  
    105.         xor     edi, edi
    106.  
    107.         invoke  CreateFile, lpDestFileName, GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0
    108.         mov     hFile, eax
    109.         inc     eax
    110.         jz      @file_open_error
    111.        
    112.         invoke  GetFileSize, hFile, 0
    113.         mov     dwFileSize, eax
    114.         inc     eax
    115.         jz      @file_open_close
    116.  
    117.         invoke  CreateFileMapping, hFile, NULL, PAGE_READONLY, 0, 0, NULL
    118.         .IF     eax
    119.                 mov     ebx, eax
    120.                 invoke  MapViewOfFile, eax, FILE_MAP_READ, 0, 0, 0
    121.                 .IF     eax
    122.                         push    eax
    123.  
    124.                         mov     eax, dwFileSize
    125.  
    126.                         shl     eax, 1
    127.                         invoke  GlobalAlloc, GPTR, eax
    128.                         mov     edx, outMem
    129.                         mov     [edx], eax
    130.                         mov     edx, [esp]
    131.  
    132.                         invoke  Base64Encode, edx, eax, dwFileSize
    133.                         mov     edx, outMem
    134.                         invoke  lstrlen, [edx]
    135.  
    136.  
    137.                         mov     edx, outLen
    138.                         mov     [edx], eax
    139.  
    140.                         call    UnmapViewOfFile
    141.  
    142.                         inc     edi
    143.                 .ENDIF
    144.                 invoke  CloseHandle, ebx
    145.         .ENDIF
    146.  
    147. @file_open_close:
    148.         invoke  CloseHandle, hFile
    149.  
    150. @file_open_error:
    151.         mov     eax, edi
    152.         ret
    153. FileToBase64 endp
    154.  
    155. Save2file proc lpMailMessage: DWORD
    156.     LOCAL   hFile, bWritten: DWORD
    157.     invoke  CreateFile, offset szSFileName, GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, 0, 0
    158.         mov     hFile, eax
    159.         inc     eax
    160.         jz      @end
    161.  
    162.         invoke  lstrlen, lpMailMessage
    163.         mov     edx, eax
    164.         invoke  WriteFile, hFile, lpMailMessage, edx, addr bWritten, NULL
    165.  
    166.         invoke  CloseHandle, hFile
    167. @end:
    168.         mov     eax, 1
    169.         ret
    170. Save2file endp
    171.  
    172. start:
    173. invoke  FileToBase64, lpDestFile, offset b64Attach, offset b64AttachLen
    174. invoke Save2file,b64Attach
    175. invoke ExitProcess, 0
    176. end start
     
  2. Stub

    Stub New Member

    Публикаций:
    0
    Регистрация:
    11 май 2004
    Сообщения:
    311
    Адрес:
    Siberia
    Ты забыл, что должно передавать указатель на строчку "file.exe",0 :), т.е.:
    Код (Text):
    1.  
    2. start:
    3. invoke  FileToBase64,[b]offset lpDestFile[/b], offset b64Attach, offset b64AttachLen
    4. invoke Save2file,b64Attach
    5. invoke ExitProcess, 0
    6. end start
     
  3. Stub

    Stub New Member

    Публикаций:
    0
    Регистрация:
    11 май 2004
    Сообщения:
    311
    Адрес:
    Siberia
    вот сам код, который уже работает :). А на будущее совет: юзай иногда отладчик, в подобных ситуациях очень быстро помогает найти подобного рода ошибки :)))



    [​IMG] 2124934240__build.zip
     
  4. base64

    base64 New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2004
    Сообщения:
    5
    Адрес:
    Bolivia
    лол =))))