Шустрый

Профиль
Группа: Участник
Сообщений: 57
Регистрация: 6.4.2009
Репутация: нет Всего: 1
|
вот код для fasm-a. возле exe-шника лежит input.txt. Собственно вопрос почему выдает ошибку "error CryptAcquireContextA". Какие параметры я не правильно передал CryptAcquireContextA? смотрел в отладчике GetLastError возвращает - 0x80090016 Код | format PE console entry start
include 'include/win32w.inc'
section '.data' data readable writeable
handle dd ? ; хэндл процесса hInput dd ? ; хэндл входного файла hOutput dd ? ; хэндл выходного файла hService dd ? ; хэндл служебного файла hStdOut dd ? ; хэндл вывода на консоль hStdIn dd ? ; хэндл ввода c консоли
hHeap dd ? ; хэндл нашей кучи
input db 'input.txt',0 output db 'output.txt',0 service db 'service.txt',0 pass db 'mypass',0 passlen dd ?
fsize dd ? ; размер входного файла csize dd ? ; размер шифротекста buffer dd ? ; адрес буфера
temp dd ?
hCryptProvFile dd 0 ; хэндл криптовайдера шифрующего файл (RC2) и хеш (MD5) hCryptProvKey dd 0 ; хэндл криптовайдера шифрующего мастер-ключ (DES)
hKeyFile dd ? ; хэндл ключа на котором шифруется файл hKeyKey dd ? ; хэндл ключа на котором шифруется мастер ключ hHash dd ? ; хэндл хэш-объекта (MD5)
encKeyPointer dd ? ; указатель на блоб зашифрованного ключа encKeySize dd ? ; размер блоба зашифрованного ключа
MS_ENHANCED_PROV db 'Microsoft Enhanced Cryptographic Provider v1.0',0,0 ;"Microsoft Strong Cryptographic Provider v1.0",0 PROV_RSA_FULL = 1 ;(RC2,MD5) PROV_RSA_SCHANNEL = 12 ;(DES)
section '.code' code readable executable
start: invoke GetModuleHandle,0 ; получим стандартные хендлы mov [handle], eax invoke GetStdHandle, STD_INPUT_HANDLE mov [hStdIn], eax invoke GetStdHandle, STD_OUTPUT_HANDLE mov [hStdOut], eax
invoke CreateFileA, input,\ ; откроем файл для чтения 1,\ NULL,\ NULL,\ OPEN_EXISTING,\ FILE_ATTRIBUTE_NORMAL,\ NULL cmp eax, INVALID_HANDLE_VALUE jz errorOpenFile mov [hInput], eax
invoke GetFileSize, eax, temp ; узнали размер mov [fsize], eax
invoke GetProcessHeap ; берем "нашу" кучу mov [hHeap], eax mov eax, [fsize] add eax, 128 ; на всякий выделим на 128 байт больше (1024 бит) invoke HeapAlloc, [hHeap], NULL, eax ; и выделяем в ней память под весь файл cmp eax, 0 jz errorAllocMemory mov [buffer], eax
invoke ReadFile, [hInput], [buffer], [fsize], temp, NULL ;читаем весь файл
invoke CryptAcquireContextA, hCryptProvFile, 0, MS_ENHANCED_PROV, PROV_RSA_FULL, 0 cmp eax, 0 je errorCryptProv
invoke GetLastError invoke CryptAcquireContextA, hCryptProvKey, 0, MS_ENHANCED_PROV, PROV_RSA_SCHANNEL, 0
; magic number ~ RC2 invoke CryptGenKey, [hCryptProvFile], 0x00006602, 0x00000001 or 0x00800000, hKeyFile
;шифруем нашим ключом, без хэша, шифруем все за раз invoke CryptEncrypt, [hKeyFile], 0, TRUE, 0, [buffer], csize, [fsize] ;и сразу пишем в выходной файл invoke CreateFileA, output,2,0,0,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,0 ; создаем файл для записи mov [hOutput], eax invoke WriteFile, eax, [buffer], [csize], temp, NULL ; и пишем сразу всё
invoke CryptCreateHash, [hCryptProvFile], 0x00008003, 0, 0, hHash ; создаем хэш-объект invoke CryptHashData, [hHash], pass, [passlen], 0 ; добавляем пасс к хэшу invoke CryptDeriveKey, [hCryptProvKey], 0x00006601, [hHash], 0x00800000, hKeyKey invoke CryptExportKey, [hKeyFile], [hKeyKey], 1, 0, 0, encKeySize ; узнаем размер зашифрованного ключа invoke HeapAlloc, [hHeap], 0, [encKeySize] mov [encKeyPointer], eax invoke CryptExportKey, [hKeyFile], [hKeyKey], 1, 0, eax, encKeySize ;шифруем и экспортируем мастер-кей invoke CreateFile, service,2,0,0,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0 ; создаем служебный файл mov [hService], eax invoke WriteFile, eax, [encKeyPointer], [encKeySize], temp, 0 ; и пишем в него E(master-key) invoke ExitProcess,0
errorOpenFile: invoke WriteFile, [hStdOut], .error, .len, temp, NULL invoke ExitProcess,0 .error db 'error open file!' .len = $ - .error errorAllocMemory: invoke WriteFile, [hStdOut], .error, .len, temp, NULL invoke ExitProcess,0 .error db 'error memory alloc!' .len = $ - .error
error: invoke WriteFile, [hStdOut], .error, .len, temp, NULL invoke ExitProcess,0 .error db 'error!' .len = $ - .error errorCryptProv: invoke WriteFile, [hStdOut], .error, .len, temp, NULL invoke ExitProcess,0 .error db 'error CryptAcquireContextA' .len = $ - .error
section '.idata' import data readable writeable
library kernel32,'KERNEL32.DLL',\ user32,'USER32.DLL',\ advapi32,'ADVAPI32.DLL'
include 'include/api/kernel32.inc' include 'include/api/user32.inc' include 'include/api/advapi32.inc'
|
|