[ Assembler ] — начинающим: задаем вопросы

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by !_filin_!, 25 May 2007.

  1. w_2k

    w_2k New Member

    Joined:
    23 Jul 2008
    Messages:
    29
    Likes Received:
    1
    Reputations:
    0
    0verbreak, у тебя случаем инфы по перехвату досовский прерываний нет?)
     
  2. iv.

    iv. Elder - Старейшина

    Joined:
    21 Mar 2007
    Messages:
    1,183
    Likes Received:
    438
    Reputations:
    107
    если мне не изменяет память, инфа с примерами есть в книге Абашева "ассемблер в задачах защиты информации". как дома буду - гляну точно, у меня бумажный вариант..
     
  3. Ryu

    Ryu New Member

    Joined:
    13 Jun 2008
    Messages:
    19
    Likes Received:
    3
    Reputations:
    2
    Это не метод криса. Это стандартный метод применяемый в вирусах. Только с той разницей что в вирусах не используется плейн название ф-ций а их хеш 32. Полиномы не стоит пробовать для хеширования новые подбирать - все нормальные уже посчтитали. Почитай статьи билли из 29а, на васме есть в вирмейкинге.
     
  4. 0verbreaK

    0verbreaK Elder - Старейшина

    Joined:
    30 Apr 2008
    Messages:
    318
    Likes Received:
    42
    Reputations:
    -3
    w_2k на сайте калашникова в какомто уроке есть перехват прерывания
     
    #384 0verbreaK, 8 Aug 2008
    Last edited: 8 Aug 2008
  5. w_2k

    w_2k New Member

    Joined:
    23 Jul 2008
    Messages:
    29
    Likes Received:
    1
    Reputations:
    0
    О! Нашёл:) Ток не совсем всё понял)
    Code:
    Init:
    mov ah,35h
    mov al,21h
    int 21h
    mov word ptr Int_21h_vect,bx
    mov word ptr Int_21h_vect+2,es
    mov ax,2521h
    mov dx,offset Int_21h_proc
    int 21h
    mov dx,offset Init
    int 27h
    Это тоже в памяти будет?
    з.ы. Не совсем понял с подменой регистров в основной процедуре,ведь адрес прерывания в переменной, а там регистры в стек/из стека
     
    #385 w_2k, 8 Aug 2008
    Last edited: 8 Aug 2008
  6. 0verbreaK

    0verbreaK Elder - Старейшина

    Joined:
    30 Apr 2008
    Messages:
    318
    Likes Received:
    42
    Reputations:
    -3
    w_2k Справочник Ральфа Брауна + Оля в руки и исследуй )
     
  7. Juda

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

    Joined:
    2 Aug 2008
    Messages:
    48
    Likes Received:
    8
    Reputations:
    0
    Пробовал все что советовали по скрытию апи, всеравно палится антивирями. Вот только руки не дошли до 29а.
    Еще есть способ выташить апи через SEH:

    ----------------------------------
    Code:
    .386
    .model flat,stdcall
    option casemap:none
    
    INCLUDE    \masm32\include\windows.inc
    
    INCLUDE    \masm32\include\comdlg32.inc
    INCLUDELIB \masm32\lib\comdlg32.lib
    
    ; ------ STRUCTS ------
    sSEH STRUCT
      OrgEsp            DD ?
      OrgEbp            DD ?
      SaveEip           DD ?
    sSEH ENDS
    
    ; ------ EQU'S ------
    MIN_KERNEL_SEARCH_BASE    EQU 070000000h
    MAX_API_STRING_LENGTH     EQU 150
    
    ; ------ CONST ------
    .CONST
    szLoadLibrary             DB "LoadLibraryA",0
    szGetProcAddress          DB "GetProcAddress",0
    szExitProcess             DB "ExitProcess",0
    
    szUser32                  DB "user32",0
    szMessageBox              DB "MessageBoxA",0
    szwsprintf                DB "wsprintfA",0
    
    szInfoCap                 DB "- Kernel -",0
    szInfoText                DB "The following information were obtained",13,10
                              DB "without the help of an Import Table !",13,10
                  DB 13,10
                              DB "Kernel32.dll ImageBase:  0x%08lX",13,10
                              DB "User32.dll ImageBase:  0x%08lX",13,10
                  DB 13,10
                              DB "API Addresses:",13,10
                              DB "LoadLibraryA:  0x%08lX",13,10
                              DB "GetProcAddress:  0x%08lX",13,10
                              DB "ExitProcess:  0x%08lX",13,10
                              DB 13,10
                              DB "MessageBoxA:  0x%08lX",13,10
                              DB "wsprintfA:  0x%08lX",0
    
    ; ------ DATA ------
    .DATA
    _LoadLibrary              DD 0
    _GetProcAddress           DD 0
    _ExitProcess              DD 0
    _MessageBox               DD 0
    _wsprintf                 DD 0
    
    cBuff           DB 200 DUP (0)
    SEH                       sSEH <0>
    dwKernelBase              DD 0
    dwUserBase                DD 0
    
    ; ------ CODE ------
    .CODE
    main:
      ASSUME FS : NOTHING
      
      ;INT 3
      
      ;---- GET ImageBase of kernel32.dll ----  
      PUSH [ESP]
      CALL GetKernelBase
      OR   EAX, EAX
      JZ   QUIT
      MOV  dwKernelBase, EAX
      
      ;---- GET SOME KERNEL API ADDRESSES ----
      ;-> LoadLibraryA
      PUSH OFFSET szLoadLibrary
      PUSH dwKernelBase
      CALL GetProcAddr
      OR   EAX, EAX
      JZ   QUIT
      MOV  _LoadLibrary, EAX
      
      ;-> GetProcAddress
      PUSH OFFSET szGetProcAddress
      PUSH dwKernelBase
      CALL GetProcAddr
      OR   EAX, EAX
      JZ   QUIT
      MOV  _GetProcAddress, EAX
      
      ;-> ExitProcess
      PUSH OFFSET szExitProcess
      PUSH dwKernelBase
      CALL GetProcAddr
      OR   EAX, EAX
      JZ   QUIT
      MOV  _ExitProcess, EAX
      
      ;---- LOAD USER32.DLL ----
      PUSH OFFSET szUser32
      CALL _LoadLibrary
      OR   EAX, EAX
      JZ   QUIT
      MOV  dwUserBase, EAX
      
      ;---- GET SOME USER API ADDRESSES ----
      ;-> MessageBoxA
      PUSH OFFSET szMessageBox
      PUSH dwUserBase
      CALL GetProcAddr
      OR   EAX, EAX
      JZ   QUIT
      MOV  _MessageBox, EAX
      
      ;-> wsprintfA
      PUSH OFFSET szwsprintf
      PUSH dwUserBase
      CALL GetProcAddr
      OR   EAX, EAX
      JZ   QUIT
      MOV  _wsprintf, EAX
      
      ;---- BUILD AND SHOW THE INFORMATION MSG ----
      PUSH _wsprintf
      PUSH _MessageBox
      PUSH _ExitProcess
      PUSH _GetProcAddress
      PUSH _LoadLibrary
      PUSH dwUserBase
      PUSH dwKernelBase
      
      PUSH OFFSET szInfoText
      PUSH OFFSET cBuff
      CALL _wsprintf
      ADD  ESP, (9 * SIZEOF(DWORD))
      
      PUSH MB_ICONINFORMATION OR MB_SYSTEMMODAL
      PUSH OFFSET szInfoCap
      PUSH OFFSET cBuff
      PUSH 0
      CALL _MessageBox
      
      ;---- EXIT ----
      CALL _ExitProcess             ;)
    
    QUIT:
      RET                 ; exit to OS
      
    ;---- AN UNUSED IMPORT ----
    ; The Win32 Loader of Win2k (maybe also of WinNT) won't call the EntryPoint of files which don't
    ; have an Import Table :(
    ; So here's an unused Import to make MASM compile an Import Table.
    
      PUSH NULL
      CALL GetOpenFileName
      
    ; ------ ROUTINES ------
    ; returns NULL in the case of an error
    GetKernelBase PROC USES EDI ESI, dwTopStack : DWORD
      ; install SEH frame
      PUSH OFFSET SehHandler
      PUSH FS:[0]
      MOV  SEH.OrgEsp, ESP
      MOV  SEH.OrgEbp, EBP
      MOV  SEH.SaveEip, OFFSET ExceptCont
      MOV  FS:[0], ESP
      
      ; start the search
      MOV  EDI, dwTopStack
      AND  EDI, 0FFFF0000h    ; wipe the LOWORD !
      .WHILE TRUE
         .IF WORD PTR [EDI] == IMAGE_DOS_SIGNATURE
            MOV  ESI, EDI
            ADD  ESI, [ESI+03Ch]
            .IF  DWORD PTR [ESI] == IMAGE_NT_SIGNATURE
               .BREAK
            .ENDIF
         .ENDIF
               ExceptCont:
         SUB  EDI, 010000h
         .IF EDI < MIN_KERNEL_SEARCH_BASE
            MOV  EDI, 0BFF70000h
            .BREAK
         .ENDIF
      .ENDW
      XCHG EAX, EDI 
      
      ; shutdown SEH frame
      POP  FS:[0]
      ADD  ESP, 4
      RET
    GetKernelBase ENDP
    
    ; returns address or NULL in the case of an error
    GetProcAddr PROC USES ESI EDI ECX EBX EDX, dwDllBase : DWORD, szApi : LPSTR
      ; install SEH frame
      PUSH OFFSET SehHandler
      PUSH FS:[0]
      MOV  SEH.OrgEsp, ESP
      MOV  SEH.OrgEbp, EBP
      MOV  SEH.SaveEip, OFFSET @@BadExit
      MOV  FS:[0], ESP
      
      ; check PE Signarue
      MOV  ESI, dwDllBase
      CMP  WORD PTR [ESI], IMAGE_DOS_SIGNATURE
      JNZ @@BadExit
      ADD  ESI, [ESI+03Ch]
      CMP  DWORD PTR [ESI], IMAGE_NT_SIGNATURE
      JNZ @@BadExit
      
      ; get the string length of the target Api
      MOV  EDI, szApi
      MOV  ECX, MAX_API_STRING_LENGTH
      XOR  AL, AL
      REPNZ  SCASB
      MOV  ECX, EDI
      SUB  ECX, szApi             ; ECX -> Api string length
      
      ; trace the export table
      MOV  EDX, [ESI+078h]            ; EDX -> Export table
      ADD  EDX, dwDllBase
      ASSUME EDX : PTR IMAGE_EXPORT_DIRECTORY
      MOV  EBX, [EDX].AddressOfNames          ; EBX -> AddressOfNames array pointer
      ADD  EBX, dwDllBase
      XOR  EAX, EAX             ; EAX AddressOfNames Index
      .REPEAT
         MOV  EDI, [EBX]
         ADD  EDI, dwDllBase
         MOV  ESI, szApi
         PUSH ECX       ; save the api string length
         REPZ CMPSB
         .IF ZERO?
            ADD  ESP, 4
            .BREAK
         .ENDIF
         POP  ECX
         ADD  EBX, 4
         INC  EAX   
      .UNTIL EAX == [EDX].NumberOfNames
      
      ; did we found sth ?
      .IF EAX == [EDX].NumberOfNames
         JMP @@BadExit
      .ENDIF
      
      ; find the corresponding Ordinal
      MOV  ESI, [EDX].AddressOfNameOrdinals
      ADD  ESI, dwDllBase
      PUSH EDX      ; save the export table pointer
      MOV  EBX, 2
      XOR  EDX, EDX
      MUL  EBX
      POP  EDX
      ADD  EAX, ESI
      XOR  ECX, ECX
      MOV  WORD PTR CX, [EAX]           ; ECX -> Api Ordinal
      
      ; get the address of the api
      MOV  EDI, [EDX].AddressOfFunctions
      XOR  EDX, EDX
      MOV  EBX, 4
      MOV  EAX, ECX
      MUL  EBX
      ADD  EAX, dwDllBase
      ADD  EAX, EDI
      MOV  EAX, [EAX]
      ADD  EAX, dwDllBase
      JMP  @@ExitProc
      
      ASSUME EDX : NOTHING  
        
       @@BadExit:
        XOR  EAX, EAX   
       @@ExitProc:
      ; shutdown SEH frame
      POP  FS:[0]
      ADD  ESP, 4
      RET
    GetProcAddr ENDP
    
    SehHandler PROC C pExcept:DWORD,pFrame:DWORD,pContext:DWORD,pDispatch:DWORD
      MOV  EAX, pContext
      ASSUME EAX : PTR CONTEXT
      PUSH SEH.SaveEip
      POP  [EAX].regEip
      PUSH SEH.OrgEsp
      POP  [EAX].regEsp
      PUSH SEH.OrgEbp
      POP  [EAX].regEbp
      MOV  EAX, ExceptionContinueExecution
      RET
    SehHandler ENDP
    
    end main
    
    --------------------------
    вот только как бы я его не изменял, не упаковывал, не шифровал все равно палится анти вирями. Шифровал XORом. Что посоветуете?
     
    #387 Juda, 12 Aug 2008
    Last edited: 12 Aug 2008
  8. 0verbreaK

    0verbreaK Elder - Старейшина

    Joined:
    30 Apr 2008
    Messages:
    318
    Likes Received:
    42
    Reputations:
    -3
    Juda

    1) не храни строки в открытом виде
    2) можно использовать адреса API
    3) контрольные суммы функций
    4) измени инструкции на подобные
    5) морфи код
     
  9. 0verbreaK

    0verbreaK Elder - Старейшина

    Joined:
    30 Apr 2008
    Messages:
    318
    Likes Received:
    42
    Reputations:
    -3
    Также есть вариант (может уже был озвучен, но приведу все равно) получение базы кернела (kernel32.dll) через адрес возврата, после загрузки программы в отладчик
    на верхушке стека лежита адрес возврата на kernel32.dll

    Следующая картина:

    Code:
    0012FFC4   77E7EB69  RETURN to kernel32.77E7EB69
    0012FFC8   00000007
    0012FFCC   00566ED0
    0012FFD0   7FFDF000
    0012FFD4   F4262CF4
    0012FFD8   0012FFC8
    0012FFDC   80536A0E
    0012FFE0   FFFFFFFF  End of SEH chain
    0012FFE4   77E9BB86  SE handler
    
    
    Используем следующий код для получения базы

    Code:
    start:
        	pop	ebp	;Return to kernel32.dll
                                        ; (ошибка) адрес внутри кернела
    
    Используя таблицу экспорта можно искать API функции по ординалу, просмотри в иде
    таблицу экспорта, в ней можно получить адреса API функций и их ординалы, достаточно дизассемблировать kernel32.dll
     
    #389 0verbreaK, 23 Aug 2008
    Last edited: 23 Aug 2008
  10. FrMn

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

    Joined:
    8 Aug 2008
    Messages:
    51
    Likes Received:
    16
    Reputations:
    7
    не обязательно в отладчик
    не базу, а какойто адрес внутри kernel32.dll
    ненадежно, ординал может отличатся в зависимости от весии библиотеки, лучше по хешу от имени
     
  11. w_2k

    w_2k New Member

    Joined:
    23 Jul 2008
    Messages:
    29
    Likes Received:
    1
    Reputations:
    0
    Народ, кто нить подскажите плиз простейший генератор чисел в 16 битах? Пытался использовать миллисекунды, но функция 2c прерывания 21 ничего не возвращает:(
     
  12. z01b

    z01b Муджахид

    Joined:
    5 Jan 2007
    Messages:
    494
    Likes Received:
    382
    Reputations:
    22
    тебе нужен код генерации псевдо-случайных чисел для дос?
     
  13. w_2k

    w_2k New Member

    Joined:
    23 Jul 2008
    Messages:
    29
    Likes Received:
    1
    Reputations:
    0
    Ну, в принципе да.
     
  14. z01b

    z01b Муджахид

    Joined:
    5 Jan 2007
    Messages:
    494
    Likes Received:
    382
    Reputations:
    22

    Простой:
    Code:
    randomize:
            in al, 40h	; read micro-clock for initial seed
            mov ah, al
            in al, 40h
            xchg al, ah
            or ax, 1
            mov rnum, ax
    ret
    
    Длинный:
    Code:
    jmp start
    	
    xxx:
    mov ah, 02ch
    int 21h
    and dl, 0fh
    cmp dl, 9
    ja xxx
    add dl, 30h
    mov [di], dl
    ret
    	
    delay:
    mov cx, 0
    	
    yyy:
    mov dx, 0a00h
    	
    zzz:
    xor ax, ax
    dec dx
    cmp dx, 0
    jne zzz
    	
    loop yyy
    ret
    	
    start:
    lea di, numb
    call xxx
    inc di
    call delay
    call xxx
    inc di
    call delay
    call xxx
    mov ah, 09h
    lea dx, numb
    int 21h
    int 20h
    	
    numb db 4 dup('$')
    
    ЗЫ В каком-то номере журнала комманды 29а, тоже был код генерации для дос .
     
  15. w_2k

    w_2k New Member

    Joined:
    23 Jul 2008
    Messages:
    29
    Likes Received:
    1
    Reputations:
    0
    О! Спасиба) Пошёл тестить)
    ----------------------------------------
    Странно, MASM короткий не хочет компилить....ругаецо, мол не известная операция(in)
    А вот длинный работает как часы, завтра буду разбираться что к чему. Спасиба еще раз
     
    #395 w_2k, 27 Aug 2008
    Last edited: 27 Aug 2008
  16. z01b

    z01b Муджахид

    Joined:
    5 Jan 2007
    Messages:
    494
    Likes Received:
    382
    Reputations:
    22
    у тебя масм какой версии? =)
     
  17. w_2k

    w_2k New Member

    Joined:
    23 Jul 2008
    Messages:
    29
    Likes Received:
    1
    Reputations:
    0
    Версия 6.11. Выкидывать пора? =)
     
  18. z01b

    z01b Муджахид

    Joined:
    5 Jan 2007
    Messages:
    494
    Likes Received:
    382
    Reputations:
    22
    Нет, старше если не ошибаюсь не линкует Дос код, а если для вин32апи, то лучше конечно юзать масм10 =)
     
  19. 4p3

    4p3 Elder - Старейшина

    Joined:
    18 Aug 2008
    Messages:
    142
    Likes Received:
    30
    Reputations:
    0
    Подскажите, пожалуйста, можно ли добиться улучшения быстродействия программы, если попутно использовать FPU. То есть, к примеру, я создаю через CreateThead еще поток, делаю в него вставку asm{} и работаю через FPU, пока тоже самое делает центральный процессор. Пишут вроде как при работающем FPU центральный проц работает отдельно. Еще также интересно вот что: количество FPU зависит от количества ядер проца?

    Право даже не знал в какой раздел задать вопрос...
     
  20. 4p3

    4p3 Elder - Старейшина

    Joined:
    18 Aug 2008
    Messages:
    142
    Likes Received:
    30
    Reputations:
    0
    Только сейчас осознал, что не все написал.

    Есть два потока. В первом случае. Они просто суммируют числа. при помощи add. Во втором случае первый поток делает все через add. а второй через fld, fadd, fstp.
    Надо сравнить быстродействие.