трабл с файлом

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by DooD, 23 Apr 2011.

  1. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    Привет всем.В общем такое дело:
    есть текстовый файл, в нем 1 строка текста.
    если открыть етот файл в блокноте, то там будут квадратики, а в notepad ++ просто nul(только в некоторых местах).
    так вот,мне надо читать этот файл и nul заменять на пробел, но как обозначить просто пустоту?ведь считываемый символ по идее будет находится в младшем байте регистра eax и размером в 1 байт.в общем что то не доходит до меня,кто может подскажите.(на masm)
     
    #1 DooD, 23 Apr 2011
    Last edited: 23 Apr 2011
  2. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    надумал в общем идею, делать замену в хексе nul это 00 пробел это 20 просто читать файл и заменять данные в хексе.попробую.
     
    #2 DooD, 23 Apr 2011
    Last edited: 24 Apr 2011
  3. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    все.моя мысль подошла.проблема решена.
     
  4. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    сам спросил, сам ответил, сам себя по благодарил. ))
     
  5. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    в общем чето у меня не получается, строки мне еще доучивать надо,ну вот пример как я пытался сделать,подскажите че не так?
    Code:
    .386
    .model flat, stdcall
    option casemap : none
    
    include include\windows.inc
    include include\user32.inc
    include include\kernel32.inc
    
    includelib lib\kernel32.lib
    includelib lib\user32.lib
    
    
    .data
    
    file   db '123.txt',0
    
    .data?
    hFile dd ?
    dwFileSize    dd     ?
    dwBytesRead   dd     ?
    Buffer        db     512 dup (?)
    
    .code
    start:
    
     invoke CreateFile, addr file, GENERIC_READ or GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL
    mov    hFile, eax ;открыли файл
    
     invoke GetFileSize, hFile, NULL;получаем размер файла
           mov    dwFileSize, eax
    
    invoke ReadFile, hFile, addr Buffer,addr dwFileSize,addr dwBytesRead, NULL  ;читаем
    invoke CloseHandle,hFile ;закрываем
    
    call CheckSymbol    
    
    invoke CreateFile, addr file, GENERIC_READ or GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL
    mov    hFile, eax       ;открываем
    
    invoke WriteFile,hFile,addr Buffer,addr dwFileSize,dwBytesRead,NULL ;записуем
    invoke CloseHandle,hFile
    
    invoke ExitProcess,0
    
    
    CheckSymbol proc
            push edi
            mov al,00h
            mov ecx,edi 
            inc ecx
            mov edi,offset Buffer 
    loop_check:
            repne scasb 
            test ecx,ecx
            jz end_check    
            mov byte ptr [edi-1],20h
           
            jmp loop_check  
    end_check:
            pop edi
            ret
    CheckSymbol endp
    
    
    
    end     start 
    
     
  6. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    мне кажется ошибка где то в процедуре замены,кажется я там что то с буфером намутил...
     
  7. yuran666666

    yuran666666 Member

    Joined:
    18 Jan 2009
    Messages:
    84
    Likes Received:
    19
    Reputations:
    11
    Первая и самая главная ошибка- функции Рид/ВрайтФайл где надо передавать адреса параметров передавались значения и наоборот- на мсдн. Далее размер буфера как будто бы сохранялся в еdi, хотя никто его там не сохранял. Ну и буфер надо бы динамически выделять под читаемый файл.
    Кстати, в текстовом файле конец строки это не 00h, а 0dh,0ah, так что если вы работаете с текстом- исправляйте.
    Code:
    .386
    .model flat, stdcall
    option casemap : none
    include include\windows.inc
    include include\user32.inc
    include include\kernel32.inc
    includelib lib\kernel32.lib
    includelib lib\user32.lib
    .data
    file   db '123.txt',0
    .data?
    dwBytesRead   dd     ?
    Buffer        db     512 dup (?)
    .code
    start:
    xor ebx
     invoke CreateFile, addr file, GENERIC_READ or GENERIC_WRITE,ebx,ebx, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,ebx
    push eax
    invoke GetFileSize,eax, ebx;получаем размер файла
    xchg    edi, eax ;
    invoke ReadFile,dword ptr[esp+10], addr Buffer,edi,addr dwBytesRead,ebx  ;читаем
    call CloseHandle ;закрываем
    call CheckSymbol    
    invoke CreateFile, addr file,GENERIC_READ or GENERIC_WRITE,ebx,ebx, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,ebx
    push eax       ;открываем
    invoke WriteFile,eax,addr Buffer,edi,addr dwBytesRead,0 ;записуем
    call CloseHandle
    invoke ExitProcess,ebx
    
    CheckSymbol:
            push edi
            mov al,00h
            mov ecx,edi 
            inc ecx
            mov edi,offset Buffer 
    loop_check:
            repne scasb 
            jecxz end_check   
            mov byte ptr [edi-1],20h
    jmp loop_check  
    end_check:
            pop edi
            ret
    end     start 
    
    вроде так примерно
     
  8. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    Хм,попробую Ваш код,отпишусь.
     
  9. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    не работает:(.вообще ничего не происходит...блин,что ж не так то?
     
  10. yuran666666

    yuran666666 Member

    Joined:
    18 Jan 2009
    Messages:
    84
    Likes Received:
    19
    Reputations:
    11
    зачем вам вообще ассемблер если у вас нет оллидбг или что нибудь из той оперы?
    ПС: попробую предположить, что в вашем текстовом файле нет нулевых байтов. Ну и еще первая инструкция там в коде xor ebx,ebx
     
    #10 yuran666666, 30 Apr 2011
    Last edited: 30 Apr 2011
  11. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    olly есть,но не в этом суть.
    даже если не заменять ноль-байты , я пробовал с простыми символами,не пашет.мне кажется я как то не так процедуру проверки составил,может там место mov al,00h-cmp al,00h ?
    з.ы. в моем коде нету обнуления ebx
     
  12. yuran666666

    yuran666666 Member

    Joined:
    18 Jan 2009
    Messages:
    84
    Likes Received:
    19
    Reputations:
    11
    Вам оллидбг нужен потому что у него ярлычок красивый в виде кровавой лепешки, а также олли какойто непонятный ассемблер показывает или для чего то еще?
    Вы в соседнем топе целую ИДЕ пишете, а в этом не знаете как в текстовых файлах заканчиваются строки и как трассировать программу в отладчике..
    Замените в своей процедуре mov al,00 на mov al,0dh и mov b,[edi-1],020h на mov w,[edi-1],02020h может что получится
     
  13. yuran666666

    yuran666666 Member

    Joined:
    18 Jan 2009
    Messages:
    84
    Likes Received:
    19
    Reputations:
    11
    Code:
    .386
    .model flat, stdcall
    option casemap : none
    include include\windows.inc
    include include\user32.inc
    include include\kernel32.inc
    includelib lib\kernel32.lib
    includelib lib\user32.lib
    .data
    file   db '123.txt',0
    .data?
    dwBytesRead   dd     ?
    Buffer        db     512 dup (?)
    .code
    start:
    xor ebx,ebx
     invoke CreateFile, addr file, GENERIC_READ or GENERIC_WRITE,ebx,ebx, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,ebx
    push eax
    invoke GetFileSize,eax, ebx
    .if eax>sizeof Buffer
     mov ebx,[ebx]
    .endif
    xchg    edi, eax
    invoke ReadFile,dword ptr[esp+10], addr Buffer,edi,addr dwBytesRead,ebx
    call CloseHandle 
    push edi
     mov al,0dh
     mov ecx,edi 
     mov edi,offset Buffer 
     loop_check:
     repne scasb 
     jecxz end_check
     cmp byte ptr,[edi],0ah
     jnz@f   
      mov word ptr [edi-1],2020h
     @@: 
    jmp loop_check  
     end_check:
    pop edi
    invoke CreateFile, addr file,GENERIC_READ or GENERIC_WRITE,ebx,ebx, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,ebx
    push eax       
    invoke WriteFile,eax,addr Buffer,edi,addr dwBytesRead,0 
    call CloseHandle
    invoke ExitProcess,ebx
    end     start 
    
     
    #13 yuran666666, 30 Apr 2011
    Last edited: 30 Apr 2011
  14. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    причем тут 0dh? 00h и 20h это данные которые надо заменить в хексе....ппц
     
  15. yuran666666

    yuran666666 Member

    Joined:
    18 Jan 2009
    Messages:
    84
    Likes Received:
    19
    Reputations:
    11
    отлажено. брать любые байты, заменять любыми. не благодари
    http://zalil.ru/30957875
     
  16. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    2 DooD, ну вот опять...
    Code:
    Buffer        db     512 dup (?)
    invoke GetFileSize, hFile, NULL;получаем размер файла
           mov    dwFileSize, eax
    invoke ReadFile, hFile, addr Buffer,addr dwFileSize,addr dwBytesRead, NULL  ;читаем
    
    это что еще такое? а? это кто сделал? кто это сделал? и не стыдно ведь засранцу!
    А если размер 513 байт, что будет? Переполнение будет, а голова нам на что? журнал Хакер читать да... ой я маме твой все расскажу, ой расскажу.
     
    _________________________
  17. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    блин прости:):)
    подскажешь насчет самой процедуры проверки?
     
  18. yuran666666

    yuran666666 Member

    Joined:
    18 Jan 2009
    Messages:
    84
    Likes Received:
    19
    Reputations:
    11
    бога душу скачай по ссылке, за|бал уже
     
  19. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    я тебе благодарствую за код,но копипиздить это уже крайняк
     
  20. yuran666666

    yuran666666 Member

    Joined:
    18 Jan 2009
    Messages:
    84
    Likes Received:
    19
    Reputations:
    11
    там нет копирайтов, пользуйса