Случайная последовательность байт и xor - Assembler
Формулировка задачи:
всем привет. подскажите пожалуйста как на fasm'e сделать следующее: есть handle файла, необходимо с помощью функции функции GetFileSize получить его размер (с использованием второго параметра, то есть чтобы с файлами размером более 4гб тоже работало), затем сгенерировать рандом последовательность байт точно такого же размера как размер файла (тут в инете нашел различные способы, можете посоветовать какой-то минималистичный но в то же время эффективный способ?) и затем необходимо проксорить файл этой рандом последовательностью и перезаписать файл, а так же сохранить ключ. буду благодарен за подсказки и примеры...
Решение задачи: «Случайная последовательность байт и xor»
textual
Листинг программы
format PE GUI 4.0 entry start include 'win32a.inc' section '.data' data readable writeable class db 'FASMWIN32',0 title db 'Xor Crypt',0 classe db 'EDIT',0 classs db 'STATIC',0 errtxt db 'Ошибка',0 errcount db 'Вы должны перетащить в область окна 1 или 2 файла.',0 startmes db 'Перетащите в область окна файл для зашифровки, либо 2 файла (ключ и зашифрованный файл) для создания расшифрованного файла.',0 startmes2 db '',0 hwnd dd ? hwndtext dd ? ; handle текстовой области hwndtextinfo dd ? ; handle текстовой области files_count dd ? ; количество файлов, с которыми работаем filename rb 1024 ; буфер для имени файла hfile dd ? nSize dd ? lpBytesRead dd ? lpBuffer rb 8192 wc WNDCLASS 0,WindowProc,0,0,0,0,0,COLOR_BTNFACE+1,0,class msg MSG section '.code' code readable executable start: invoke GetModuleHandle,0 mov [wc.hInstance],eax invoke LoadIcon,0,IDI_APPLICATION mov [wc.hIcon],eax invoke LoadCursor,0,IDC_ARROW mov [wc.hCursor],eax invoke RegisterClass,wc cmp eax,0 je error invoke CreateWindowEx,WS_EX_ACCEPTFILES,class,title, WS_VISIBLE+WS_SYSMENU,128,128,300,250,0,0,[wc.hInstance],0 cmp eax,0 je error mov [hwnd],eax msg_loop: invoke GetMessage,msg,0,0,0 cmp eax,0 je end_loop invoke IsDialogMessage,[hwnd],msg cmp eax,0 jne msg_loop invoke TranslateMessage,msg invoke DispatchMessage,msg jmp msg_loop error: invoke MessageBox,0,errtxt,0,MB_ICONERROR+MB_OK end_loop: invoke ExitProcess,[msg.wParam] proc WindowProc hwnd,wmsg,wparam,lparam push ebx esi edi cmp [wmsg],WM_CREATE je .wmcreate cmp [wmsg],WM_COMMAND je .wmcommand cmp [wmsg],WM_DESTROY je .wmdestroy cmp [wmsg],WM_DROPFILES je .drop .defwndproc: invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam] jmp .finish .wmcreate: invoke CreateWindowEx,0,classs,startmes,WS_VISIBLE+WS_CHILD,10,10,300,50,[hwnd],1006,[wc.hInstance],0 mov [hwndtext],eax invoke CreateWindowEx,0,classs,startmes2,WS_VISIBLE+WS_CHILD,10,70,300,190,[hwnd],1007,[wc.hInstance],0 mov [hwndtextinfo],eax jmp .finish .wmcommand: jmp .finish .drop: invoke DragQueryFile,[wparam],-1,filename,1024 ; с параметром -1 в eax пишется кол-во файлов cmp eax,1 je .one_file cmp eax,2 je .two_files jmp .error_count ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .one_file: ; создаем ключ с расширением .key и зашифровываем этот файл с помощью этого ключа, меняем расширение на .encrypted invoke DragQueryFile,[wparam],0,filename,1024 ; получаем имя файла invoke CreateFile, filename, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 ; Открываем файл (чтобы получить его handle) mov [hFile], eax ; Сохраняем handle файла в hFile invoke GetFileSize, [hFile], 0 ; Определяем размер файла. Так, нужно добавить второй параметр, чтобы можно было более 4гб файлы шифровать mov [nSize], eax ; ; to be continued... invoke CloseHandle, [hFile] jmp .finish ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .two_files: ; ключем расшифровываем файл, удаляем ключ и сохраняем расшифрованный файл без расширения .encrypted ; to be continued... jmp .finish ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .error_count: invoke SendMessage,[hwndtextinfo],WM_SETTEXT,0,errcount jmp .finish ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .wmdestroy: invoke PostQuitMessage,0 mov eax,0 .finish: pop edi esi ebx ret endp section '.idata' import data readable writeable library kernel32,'KERNEL32.DLL',\ shell32,'SHELL32.DLL',\ user32,'USER32.DLL' include 'api\kernel32.inc' include 'api\shell32.inc' include 'api\user32.inc'
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д