ошибка после криптования MZ-crypt

Тема в разделе "WASM.BEGINNERS", создана пользователем Nicholas_F, 22 май 2010.

  1. Nicholas_F

    Nicholas_F New Member

    Публикаций:
    0
    Регистрация:
    8 апр 2010
    Сообщения:
    29
    После компиляции MZ-crypt (пример криптера из папки "исходники") нашел ошибку, там переменные не в том месте были объявлены, но программа все равно криптует неправильно - после применения, подопытный exe говорит что в нем ошибка и предлагает отправить отчет. Никак не могу определить вторую ошибку... посмотрите кто может
     
  2. Nicholas_F

    Nicholas_F New Member

    Публикаций:
    0
    Регистрация:
    8 апр 2010
    Сообщения:
    29
    Или это только под 7 не правильно работает... проверьте пожалуйста у кого XP стоит?
     
  3. Nicholas_F

    Nicholas_F New Member

    Публикаций:
    0
    Регистрация:
    8 апр 2010
    Сообщения:
    29
    ошибка возникает 100% в этой части кода...

    Код (Text):
    1.   pushad
    2.     invoke GetTickCount
    3.     invoke nseed, eax
    4.     invoke nrandom, 255
    5.     mov dwCryptKey, al
    6.     mov esi, pFileHeader
    7.     assume esi:ptr IMAGE_FILE_HEADER
    8.     mov cx,[esi].NumberOfSections
    9.     mov edi, pSectionTable
    10.     assume edi:ptr IMAGE_SECTION_HEADER
    11.     .while cx != 0
    12.         invoke CanCrypt, pPE, edi
    13.         test eax,eax
    14.         jnz @F
    15.         or [edi].Characteristics, 80000000h ;ìîæåì çàïèñàòü
    16.         lea ebx,[edi].PointerToLinenumbers
    17.         mov word ptr [ebx], Sign
    18.         mov edx,[edi].PointerToRawData
    19.         add edx, hMap
    20.         xor eax, eax
    21.         .while eax <= [edi].SizeOfRawData
    22.             push eax
    23.             mov ah, dwCryptKey
    24.             xor byte ptr [edx], ah
    25.             pop eax
    26.             inc eax
    27.             inc edx
    28.         .endw
    29. @@:
    30.         add edi, sizeof IMAGE_SECTION_HEADER
    31.         dec cx
    32.     .endw
    33.     popad
     
  4. Nicholas_F

    Nicholas_F New Member

    Публикаций:
    0
    Регистрация:
    8 апр 2010
    Сообщения:
    29
    т.е. в той части, которая шифрует секции
     
  5. Nicholas_F

    Nicholas_F New Member

    Публикаций:
    0
    Регистрация:
    8 апр 2010
    Сообщения:
    29
    даже, вероятнее всего, в этом цикле:

    Код (Text):
    1.               .while eax <= [edi].SizeOfRawData
    2.             push eax
    3.             mov ah, dwCryptKey
    4.             xor byte ptr [edx], ah
    5.             pop eax
    6.             inc eax
    7.             inc edx
    8.         .endw
     
  6. Korn

    Korn New Member

    Публикаций:
    0
    Регистрация:
    11 ноя 2008
    Сообщения:
    4
    На Windows XP работает, _но_ перед запуском обработанного файла, нужно выставить флаг секции кода - Writeable (кстати, это указано в комментариях). На Windows 7 не работает, почему? just-in-time debugger в помощь. Скорее всего проблема _не_ в коде.
     
  7. Nicholas_F

    Nicholas_F New Member

    Публикаций:
    0
    Регистрация:
    8 апр 2010
    Сообщения:
    29
    Да, под JIT уже второй час сижу... На XP точно работает? Вы компилили этот код или просто exe из архива автора запустили? Последний и в 7 работает, а вот скомпилированный код...
     
  8. Nicholas_F

    Nicholas_F New Member

    Публикаций:
    0
    Регистрация:
    8 апр 2010
    Сообщения:
    29
    Ууфф.. ольга при JIT отладке встает на строке
    xor byte ptr [edx], ah
    Код (Text):
    1.  
    Весь код до этой части облазил.. ниче не пойму, где же косяк
     
  9. Korn

    Korn New Member

    Публикаций:
    0
    Регистрация:
    11 ноя 2008
    Сообщения:
    4
    Давайте по порядку:
    1.Код не выставляет атрибут секции как Writeable (IMAGE_SECTION_HEADER.Characteristics|IMAGE_SCN_MEM_WRITE) то есть, _перед_ запуском файла, нужно выставить этот флажок, для каждой секции которая "зашифрована" (используя например PETools), как узнать, а зашифрована ли? Посмотреть структуру секции IMAGE_SECTION_HEADER.PointerToLinenumbers, Mz-crypt выставляет это поле в '7'.
    2. В коде есть бага, собственно здесь:

    Код (Text):
    1. .while cx != 0
    2.         invoke CanCrypt,pPE,edi
    3.         test eax,eax
    4.         jnz @F
    5.         or [edi].characteristics,80000000h  ;can write
    6.         lea ebx,[edi].PointerToLinenumbers
    7.         mov word ptr [ebx],Sign
    8.         mov edx,[edi].PointerToRawData
    9.         add edx,hMap
    10.         xor eax,eax
    11.         .while eax <= [edi].SizeOfRawData
    12.             push eax
    13.             mov ah,dwCryptKey
    14.             xor byte ptr [edx],ah
    15.             pop eax
    16.             inc eax
    17.             inc edx
    18.         .endw
    19. @@:
    20.         add edi,sizeof IMAGE_SECTION_HEADER
    21.         dec cx
    22.     .endw
    23.     popad
    24.     ;!!Хоть одна секция зашифрована? нет - завершение.
    25.     ;//////////////////////////////////
    26.     ;// Write Code       //
    27.     ;//////////////////////////////////
    28.     mov eax,SizeOfStub
    функция CanCrypt проверяет, не содержит ли секция какой-небудь директории, если нет - тогда ксорит, но дело в том, что если каждая секция содержит директорию в конце цикла _должен_ бить выход с программы (ну и уведомление о неудавшийся роботе), но она просто пишет стаб в программу, выставляет точку входа, etc.
    Открывайте mz-crypt OllyDbg/WinDbg и пошагово смотрите, что он делает с файлом, также внимательно - куда собственно он пишет стаб, что в конкретном файле в этом месте. После записи, откройте файл (обработанный) в WinDbg например, bp ntdll!__RtlUserThreadStart, и отсюда к передачи управления на "загрузчик", нужно проверить атрибуты памяти (где загрузчик). Много чего может бить, но скорее всего - неправильная обработка таблиц директорий (Import/Export/Bound/etc). Бегло просмотрел код, наверное есть еще баги.

    P.S. Использовал исходник с сайта.
     
  10. Nicholas_F

    Nicholas_F New Member

    Публикаций:
    0
    Регистрация:
    8 апр 2010
    Сообщения:
    29
    Надо лучше разобраться в коде..
    Не совсем понятно, как CanCrypt проверяет наличие директории в секции. Правильно ли я понимаю, что

    assume esi:ptr IMAGE_SECTION_HEADER
    ...
    .if [edi].OptionalHeader.DataDirectory[sizeof IMAGE_DATA_DIRECTORY * ecx].VirtualAddress != 0
    mov edx,[edi].OptionalHeader.DataDirectory[sizeof IMAGE_DATA_DIRECTORY * ecx].VirtualAddress
    .if edx >= [esi].VirtualAddress

    тут просматривается каждый из 14 массивов DataDirectory, проверяется его RVA в памяти, и если этот RVA > RVA IMAGE_SECTION_HEADER, то это значит, что секция присутствует(??)
     
  11. Korn

    Korn New Member

    Публикаций:
    0
    Регистрация:
    11 ноя 2008
    Сообщения:
    4
    Да

    Код (Text):
    1.     .while ecx != 0
    2.         .if [edi].OptionalHeader.DataDirectory[sizeof IMAGE_DATA_DIRECTORY * ecx].VirtualAddress != 0
    3.             mov edx,[edi].OptionalHeader.DataDirectory[sizeof IMAGE_DATA_DIRECTORY * ecx].VirtualAddress
    4.             .if edx >= [esi].VirtualAddress         ;Если вирт. адрес директории больше вирт. адреса начала секции
    5.                 mov ebx,[esi].Misc.VirtualSize  
    6.                 add ebx,[esi].VirtualAddress    ;Начало секции в памяти + размер секции
    7.                 .if edx <= ebx                  ;если адрес директории попадает в эти границы, тогда директория находиться в этой секции,
    8.                                 ;крипт не возможен.
    9.                     mov eax,1
    10.                     jmp __ret
    11.                 .endif
    12.             .endif
    13.         .endif
    14.         dec ecx
    15.     .endw
    16.     @@:
    17.     mov eax,0
    18.     __ret:
    19. ret
    20. CanCrypt endp
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Nicholas_F
    Выкинь эту херь и напиши сам.
     
  13. Nicholas_F

    Nicholas_F New Member

    Публикаций:
    0
    Регистрация:
    8 апр 2010
    Сообщения:
    29
    Так и хочу. Но надо же понять вероятные ошибки. Эту тоже какой-то человек писал - но ведь не работает. Интересно все-таки почему
     
  14. Nicholas_F

    Nicholas_F New Member

    Публикаций:
    0
    Регистрация:
    8 апр 2010
    Сообщения:
    29
    Clerk, а почему "это геррь"? т.е. на что обратить внимание, что бы не получилось подобия этому но не слишком сложно?