Ассемблер.Криптография.

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by DooD, 28 Feb 2011.

  1. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    получается вот как я делал

    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 кладется хэндл файла,походу сдесь ошибка..
     
    #21 DooD, 1 Mar 2011
    Last edited: 1 Mar 2011
  2. Sams

    Sams Member

    Joined:
    18 Apr 2009
    Messages:
    247
    Likes Received:
    70
    Reputations:
    17
    1. Функцию CryptXor нужно разместить после invoke ExitProcess,0 Потому что как только начинается выполнение программы, она сразу выполняет CryptXor, которому еще не были переданы никакие параметры. В итоге получаем исключение.
    2. В функции CreateFile шестой параметр, там разрыв - лишний пробел. FILE_ATTRIBUTE_NORMAL

    Размещай исходники в тегах CODE, потому что при копировании получаются дефекты из-за смайликов.
     
    #22 Sams, 1 Mar 2011
    Last edited: 1 Mar 2011
  3. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    та на граматику не обращай внимание,счас попробую поместить в конец,блин,че я сразу так не сделал?:)блин извини нубскую ошибку допустил,я ж забыл что в асме так можно с процедурами:)терь все пашет!СПАСИБООО!
     
    #23 DooD, 1 Mar 2011
    Last edited: 1 Mar 2011
  4. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    а теперь чтоб расшифровать повторить ту же процедуру?и еще,зачем все в стэке сохранять?типо безопасность?
     
    #24 DooD, 1 Mar 2011
    Last edited: 1 Mar 2011
  5. Sams

    Sams Member

    Joined:
    18 Apr 2009
    Messages:
    247
    Likes Received:
    70
    Reputations:
    17
    Да. Xor - обратимая операция. Т.е. работает в обе стороны.

    Передавать параметры через стек - это стандарт, который называется stdcall. Можно конечно и передавать через регистры, но тогда количество параметров будет ограничено, т.к. регистров не много. В то время, как при помощи стека можно передать фактически сколько угодно. Стандарт передачи параметров функции через регистры называется fastcall. Применяется он очень редко в совсем крохотных функциях, почти не требующих входных параметров.

    Добавлено:
    Если ты про pusha/popa, то для того, что бы после выполнения функции все регистры остались без изменения не тронутыми.
     
    #25 Sams, 1 Mar 2011
    Last edited: 1 Mar 2011
  6. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    а если pusha не применить,что разве не будет работать?
     
  7. Sams

    Sams Member

    Joined:
    18 Apr 2009
    Messages:
    247
    Likes Received:
    70
    Reputations:
    17
    Будет. Но в процессе выполнения функции, используются регистры esi, edi, ecx, которые после выполнения будут содержать совсем другие значение, чем до выполнения. А если они мне понадобятся в будущем? А функция возьмет их, и затрет. Потому предварительно они сохраняются. Затем после восстанавливаются.
     
  8. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    ну я так и думал,тут уже надо все аспекты учитывать,хотя сделать pusha просто проще:)Спасибо за пояснения,буду еще спрашивать если что,ты не против?
     
    #28 DooD, 1 Mar 2011
    Last edited: 1 Mar 2011
  9. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    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
    
     
    _________________________
    1 person likes this.
  10. Sams

    Sams Member

    Joined:
    18 Apr 2009
    Messages:
    247
    Likes Received:
    70
    Reputations:
    17
    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
    В итоге ты получишь зашифрованные строки, к которым можно нормально обращаться.
     
    #30 Sams, 3 Mar 2011
    Last edited: 3 Mar 2011
  11. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    спасибо за совет,испробую:)
     
  12. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    все работает спасибо.Такой вопрос,алгоритм действий с файлом таков:
    создать файл-записать строки(заксореные)-закрыть файл
    при запуске файла надо расшифровывать файл,после запуска опять зашифровывать.как ето делать? readfile?или другой способ?
     
  13. Sams

    Sams Member

    Joined:
    18 Apr 2009
    Messages:
    247
    Likes Received:
    70
    Reputations:
    17
    CreateFile- открыл файл.
    GetFileSize - узнал размер файла.
    ReadFile - прочитал файл в буффер, указав в параметре количество байт для чтения, размер файла.
    CryptXor - расшифровал данные.
    WriteFile - записал в файл расшифрованные данные.
    CloseHandle - закрыл файл.
     
    #33 Sams, 4 Mar 2011
    Last edited: 4 Mar 2011
  14. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    ну readfile значит.я та и собирался делать
     
  15. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    все.вроде все понял/разобрался.Кому интересно накатал небольшой пример

    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
    
    Рез-ат работы проги:
    [​IMG]
     
    #35 DooD, 6 Mar 2011
    Last edited: 6 Mar 2011
  16. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    и еще вопрос,напишу уже в этой теме.Допустим есть длл-ка которая вызывает MessageBox.как на масме написать прогу для длл-ки чтобы оттуда мона было вызвать эту функцию?пробовал по icezelion'у чет не выходит...,может в дэф файле еще чето не верно пишу
     
  17. yuran666666

    yuran666666 Member

    Joined:
    18 Jan 2009
    Messages:
    84
    Likes Received:
    19
    Reputations:
    11
    В def фаеле пишутся имена функций, которые данная длл впоследствии будет экспортировать, то есть их можно будет легко вызвать из другого модуля
    Небольшой пример вызова функции динамически загружая длл и находя функцию с помощью GetProcAddress и статически добавляя имя длл и вызываемой в коде функции в таблицу импорта вызывающего модуля. МАСМ32
    http://zalil.ru/30634152
     
  18. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    да уже разобрался спасибо.
     
  19. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    а можно ету функцию (cryptxor) засунуть в dll и вызывать потом из нее?
     
  20. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66
    Да можно.