base64 trouble

Тема в разделе "WASM.BEGINNERS", создана пользователем Ragnar, 7 фев 2009.

  1. Ragnar

    Ragnar New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2009
    Сообщения:
    13
    Пытаюсь на фасме считать файл, закодировать в бейз64 и передать на сервер
    Проблема в том что правильно кодируются лишь первые n байт (26 получилось у меня)
    саму процу бейз64 взял из пинча

    Код (Text):
    1. proc Base64Encode, lpSrc, lpDst, dwSrcLen
    2.         mov     esi, [lpSrc]
    3.         mov     edi, [lpDst]
    4.         mov     ecx, [dwSrcLen]
    5.  
    6.         xor     ebx, ebx
    7.  
    8. @l:
    9.         jecxz   @b64_ret
    10.  
    11.         lodsb
    12.         shl     eax, 16
    13.         cmp     ecx, 1
    14.         jz      @work
    15.         lodsb
    16.         shl     ax, 8
    17.         cmp     ecx, 2
    18.         jz      @work
    19.         lodsb
    20.  
    21. @work:
    22.         ; Output b64 quad
    23.         mov     edx, eax
    24.         ror     edx, 24
    25.  
    26.         push    ecx
    27.         push    4
    28.         pop     ecx
    29. @l2:
    30.         call    @b64_write
    31.         loop    @l2
    32.         pop     ecx
    33.  
    34.         inc     ebx
    35.    cmp ebx, 18
    36.    jne endif
    37.                 xor     ebx, ebx
    38.                 mov     ax, 0a0dh
    39.                 stosw
    40.   endif:
    41.  
    42.         sub     ecx, 3
    43.         jns     @l
    44.  
    45.         ; Pad
    46.         neg     ecx
    47.         sub     edi, ecx
    48.         mov     al, '='
    49.         rep stosb
    50.  
    51. @b64_ret:
    52.              ret
    53.         nop
    54.         ret
    55.  
    56. @b64_write:
    57.         rol     edx, 6
    58.         mov     eax, edx
    59.         and     al, 00111111b
    60.         cmp     al, 62
    61.         jae     @write_spec
    62.  
    63.         cmp     al, 52
    64.         jae     @write_number
    65.  
    66.         ; Uppercase
    67.         add     al, 'A'
    68.         cmp     al, 'A'+26
    69.         jb      @write
    70.         ; Lowercase
    71.         add     al, 6
    72.         jmp     @write
    73.         ; Number
    74. @write_number:
    75.         add     al, '0'-52
    76.         jmp     @write
    77.         ; Special: +/
    78. @write_spec:
    79.         sub     al, 62
    80.         shl     al, 2
    81.         add     al, 43        
    82. @write:
    83.         stosb
    84.                
    85.         retn
    86. endp
    2 буффера размером 65535 байт, число символов беру как SizeReadWrite из
    считанного файла
    Прямо из ольки копирую буффер, перевожу и файлы не совпадают, также у моего
    меньший размер
    Никто не сталкивался с подобным?
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    т.е. ты хочешь, чтобы мы глянули на сорцы пинча и сказали, чем твоя собственная функция отличается, при этом ее код ты не показываешь???
     
  3. Ragnar

    Ragnar New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2009
    Сообщения:
    13
    MSoft, ok

    Код (Text):
    1. format PE GUI 5.0
    2. include '%fasminc%\win32ax.inc'
    3. section  '.code' code writeable readable executable
    4.  
    5. hFile dd ?
    6. hMemory dd ?
    7. hMemory2 dd ?
    8. pMemory dd ?
    9. pMemory2 dd ?
    10. SizeReadWrite dd ?
    11. filename  db 'C:\file.rar',0
    12.  
    13. entry $
    14.  
    15.  invoke CreateFile,  filename,GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE,\
    16.                      NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL
    17. mov [hFile],eax
    18.  
    19.  invoke GlobalAlloc,GMEM_MOVEABLE or GMEM_ZEROINIT,65535
    20.   mov  [hMemory],eax
    21. invoke GlobalLock,eax
    22.   mov [pMemory],eax          
    23.  
    24. invoke ReadFile,[hFile], [pMemory], 65534, SizeReadWrite,NULL
    25. invoke CloseHandle,[hFile]
    26.  
    27.   invoke GlobalAlloc,GMEM_MOVEABLE or GMEM_ZEROINIT,65535
    28.   mov  [hMemory2],eax
    29.  invoke GlobalLock,eax
    30.   mov [pMemory2],eax
    31.  
    32.   push  [SizeReadWrite]
    33.   push  [pMemory2]
    34.   push  [pMemory]
    35.   call  Base64Encode
    36.  
    37.  invoke  ExitProcess, 0
    38.  
    39. proc Base64Encode, lpSrc, lpDst, dwSrcLen
    40.         mov     esi, [lpSrc]
    41.         mov     edi, [lpDst]
    42.         mov     ecx, [dwSrcLen]
    43.  
    44.         xor     ebx, ebx
    45.  
    46. @l:
    47.         jecxz   @b64_ret
    48.  
    49.         lodsb
    50.         shl     eax, 16
    51.         cmp     ecx, 1
    52.         jz      @work
    53.         lodsb
    54.         shl     ax, 8
    55.         cmp     ecx, 2
    56.         jz      @work
    57.         lodsb
    58.  
    59. @work:
    60.         ; Output b64 quad
    61.         mov     edx, eax
    62.         ror     edx, 24
    63.  
    64.         push    ecx
    65.         push    4
    66.         pop     ecx
    67. @l2:
    68.         call    @b64_write
    69.         loop    @l2
    70.         pop     ecx
    71.  
    72.         inc     ebx
    73.    cmp ebx, 18
    74.    jne endif
    75.                 xor     ebx, ebx
    76.                 mov     ax, 0a0dh
    77.                 stosw
    78.   endif:
    79.  
    80.         sub     ecx, 3
    81.         jns     @l
    82.  
    83.         ; Pad
    84.         neg     ecx
    85.         sub     edi, ecx
    86.         mov     al, '='
    87.         rep stosb
    88.  
    89. @b64_ret:
    90.              ret
    91.         nop
    92.         ret
    93.  
    94. @b64_write:
    95.         rol     edx, 6
    96.         mov     eax, edx
    97.         and     al, 00111111b
    98.         cmp     al, 62
    99.         jae     @write_spec
    100.  
    101.         cmp     al, 52
    102.         jae     @write_number
    103.  
    104.         ; Uppercase
    105.         add     al, 'A'
    106.         cmp     al, 'A'+26
    107.         jb      @write
    108.         ; Lowercase
    109.         add     al, 6
    110.         jmp     @write
    111.         ; Number
    112. @write_number:
    113.         add     al, '0'-52
    114.         jmp     @write
    115.         ; Special: +/
    116. @write_spec:
    117.         sub     al, 62
    118.         shl     al, 2
    119.         add     al, 43        
    120. @write:
    121.         stosb
    122.                
    123.         retn
    124. endp
    125.  
    126. section '.import' import readable writable
    127.  
    128. library kernel32,'KERNEL32.DLL',\
    129.   user32,'USER32.DLL'      
    130.     include '%fasminc%\API\kernel32.inc'
    131.     include '%fasminc%\API\user32.inc'
     
  4. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
  5. Ragnar

    Ragnar New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2009
    Сообщения:
    13
    asmfan не понял намека? )
    неправильно реализована сама функция?
    все дело в том что какая то часть всеже кодируется
    правильно и мне кажется косяк всетки гдето у меня...
    А офф доку всеже прочту
     
  6. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Ragnar
    скачай либу cryptohash тут на сайте и не мучайся
     
  7. Ragnar

    Ragnar New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2009
    Сообщения:
    13
    2FED, спасибо, но уже выяснил что не так:
    дело в самой реализации алго
    посему решил забить на бейз и сделал в гексе