получается вот как я делал Code: .386 .model flat, stdcall option casemap:none include include\windows.inc include include\kernel32.inc include include\user32.inc include include\advapi32.inc include include\msvcrt.inc include include\urlmon.inc includelib lib\urlmon.lib includelib lib\advapi32.lib includelib lib\user32.lib includelib lib\kernel32.lib includelib lib\msvcrt.lib CryptXor PROTO :DWORD,:DWORD,:DWORD .data strng1 db "123)",0 strng2 db "456",0 strng3 db "789",0 strng4 db "abc)",0 strng5 db "def)",0 crlf db 0dh,0ah,0 hFile HANDLE ? fn db "123.dat",0 htemp dd ? .code start: CryptXor proc src:DWORD,sz:DWORD,xkey:DWORD pusha mov esi,src mov edi,src mov ecx,sz xor eax,eax CryptXor_m1: lodsb xor eax,xkey stosb loop CryptXor_m1 popa ret CryptXor endp invoke CreateFile,addr fn,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0 mov hFile,eax mov eax,sizeof strng1 dec eax invoke CryptXor,addr strng1,eax,44d invoke WriteFile,hFile,addr strng1,50,addr htemp,0 invoke WriteFile,hFile,addr crlf,2,addr htemp,NULL invoke WriteFile,hFile,addr strng2,10,addr htemp,0 invoke WriteFile,hFile,addr crlf,2,addr htemp,NULL invoke WriteFile,hFile,addr strng3,10,addr htemp,0 invoke WriteFile,hFile,addr crlf,2,addr htemp,NULL invoke WriteFile,hFile,addr strng4,40,addr htemp,0 invoke WriteFile,hFile,addr crlf,2,addr htemp,NULL invoke WriteFile,hFile,addr strng5,46,addr htemp,0 invoke ExitProcess,0 end start сдесь я ток для 1-й строки делал,ну те строки аналогично о стоп.там перед вызовом процедуры в eax кладется хэндл файла,походу сдесь ошибка..
1. Функцию CryptXor нужно разместить после invoke ExitProcess,0 Потому что как только начинается выполнение программы, она сразу выполняет CryptXor, которому еще не были переданы никакие параметры. В итоге получаем исключение. 2. В функции CreateFile шестой параметр, там разрыв - лишний пробел. FILE_ATTRIBUTE_NORMAL Размещай исходники в тегах CODE, потому что при копировании получаются дефекты из-за смайликов.
та на граматику не обращай внимание,счас попробую поместить в конец,блин,че я сразу так не сделал?блин извини нубскую ошибку допустил,я ж забыл что в асме так можно с процедурамитерь все пашет!СПАСИБООО!
а теперь чтоб расшифровать повторить ту же процедуру?и еще,зачем все в стэке сохранять?типо безопасность?
Да. Xor - обратимая операция. Т.е. работает в обе стороны. Передавать параметры через стек - это стандарт, который называется stdcall. Можно конечно и передавать через регистры, но тогда количество параметров будет ограничено, т.к. регистров не много. В то время, как при помощи стека можно передать фактически сколько угодно. Стандарт передачи параметров функции через регистры называется fastcall. Применяется он очень редко в совсем крохотных функциях, почти не требующих входных параметров. Добавлено: Если ты про pusha/popa, то для того, что бы после выполнения функции все регистры остались без изменения не тронутыми.
Будет. Но в процессе выполнения функции, используются регистры esi, edi, ecx, которые после выполнения будут содержать совсем другие значение, чем до выполнения. А если они мне понадобятся в будущем? А функция возьмет их, и затрет. Потому предварительно они сохраняются. Затем после восстанавливаются.
ну я так и думал,тут уже надо все аспекты учитывать,хотя сделать pusha просто прощеСпасибо за пояснения,буду еще спрашивать если что,ты не против?
DooD, тебе реально лучше шифровать весь буфер строк сразу ибо 1 вызов процедуры шифрования (а лучше не процедуры, конечно если у тебя она больше нигде не юзается) и 1 вызов записи в файл -> лютая оптимизация (по сравнению с твоим кодом) Вот так можно определить общий размер буфера Code: strng1 db "123)",0 strng2 db "456",0 strng3 db "789",0 strng4 db "abc)",0 strng5 db "def)",0 size_strings dd $-strng1 ; размер данных начиная от смещения strng1
Gar|k дело говорит. size_strings - общее количество прогона тела цикла. Делаешь проверку на нулевой байт, что бы не затереть конец ASCIIZ строки. Все это дело будет выглядеть приблизительно вот так: Code: mov esi,offset strng1 mov edi,offset strng1 mov ecx,size_strings xor eax,eax m1: lodsb test al,al ;либо cmp al,0h jz m2 xor al,33d m2: stosb loop m1 В итоге ты получишь зашифрованные строки, к которым можно нормально обращаться.
все работает спасибо.Такой вопрос,алгоритм действий с файлом таков: создать файл-записать строки(заксореные)-закрыть файл при запуске файла надо расшифровывать файл,после запуска опять зашифровывать.как ето делать? readfile?или другой способ?
CreateFile- открыл файл. GetFileSize - узнал размер файла. ReadFile - прочитал файл в буффер, указав в параметре количество байт для чтения, размер файла. CryptXor - расшифровал данные. WriteFile - записал в файл расшифрованные данные. CloseHandle - закрыл файл.
все.вроде все понял/разобрался.Кому интересно накатал небольшой пример Code: .386 .model flat, stdcall option casemap:none include include\windows.inc include include\kernel32.inc include include\user32.inc includelib lib\user32.lib includelib lib\kernel32.lib CryptXor PROTO :DWORD,:DWORD,:DWORD .data strng1 db "FUCK THE SYSTEM!",0 .code start: invoke MessageBox,0,addr strng1,0,0 mov eax,sizeof strng1 dec eax invoke CryptXor,addr strng1,eax,01d invoke MessageBox,0,addr strng1,0,0 invoke ExitProcess,0 CryptXor proc src:DWORD,sz:DWORD,xkey:DWORD pusha mov esi,src mov edi,src mov ecx,sz xor eax,eax CryptXor_m1: lodsb xor eax,xkey stosb loop CryptXor_m1 popa ret CryptXor endp end start Рез-ат работы проги:
и еще вопрос,напишу уже в этой теме.Допустим есть длл-ка которая вызывает MessageBox.как на масме написать прогу для длл-ки чтобы оттуда мона было вызвать эту функцию?пробовал по icezelion'у чет не выходит...,может в дэф файле еще чето не верно пишу
В def фаеле пишутся имена функций, которые данная длл впоследствии будет экспортировать, то есть их можно будет легко вызвать из другого модуля Небольшой пример вызова функции динамически загружая длл и находя функцию с помощью GetProcAddress и статически добавляя имя длл и вызываемой в коде функции в таблицу импорта вызывающего модуля. МАСМ32 http://zalil.ru/30634152