Привет всем.В общем такое дело: есть текстовый файл, в нем 1 строка текста. если открыть етот файл в блокноте, то там будут квадратики, а в notepad ++ просто nul(только в некоторых местах). так вот,мне надо читать этот файл и nul заменять на пробел, но как обозначить просто пустоту?ведь считываемый символ по идее будет находится в младшем байте регистра eax и размером в 1 байт.в общем что то не доходит до меня,кто может подскажите.(на masm)
надумал в общем идею, делать замену в хексе nul это 00 пробел это 20 просто читать файл и заменять данные в хексе.попробую.
в общем чето у меня не получается, строки мне еще доучивать надо,ну вот пример как я пытался сделать,подскажите че не так? 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
Первая и самая главная ошибка- функции Рид/ВрайтФайл где надо передавать адреса параметров передавались значения и наоборот- на мсдн. Далее размер буфера как будто бы сохранялся в е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 вроде так примерно
зачем вам вообще ассемблер если у вас нет оллидбг или что нибудь из той оперы? ПС: попробую предположить, что в вашем текстовом файле нет нулевых байтов. Ну и еще первая инструкция там в коде xor ebx,ebx
olly есть,но не в этом суть. даже если не заменять ноль-байты , я пробовал с простыми символами,не пашет.мне кажется я как то не так процедуру проверки составил,может там место mov al,00h-cmp al,00h ? з.ы. в моем коде нету обнуления ebx
Вам оллидбг нужен потому что у него ярлычок красивый в виде кровавой лепешки, а также олли какойто непонятный ассемблер показывает или для чего то еще? Вы в соседнем топе целую ИДЕ пишете, а в этом не знаете как в текстовых файлах заканчиваются строки и как трассировать программу в отладчике.. Замените в своей процедуре mov al,00 на mov al,0dh и mov b,[edi-1],020h на mov w,[edi-1],02020h может что получится
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
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 байт, что будет? Переполнение будет, а голова нам на что? журнал Хакер читать да... ой я маме твой все расскажу, ой расскажу.