Случайная последовательность байт и 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'

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.111 из 5
Похожие ответы