Screen с определенного окна.

Тема в разделе "WASM.WIN32", создана пользователем Flasher, 13 сен 2009.

  1. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Задача, - найти окно, получить размеры этого окна, и сделать скрин по ним.
    Реализовал следующим образом:
    Код (Text):
    1. .586
    2. .model flat, stdcall
    3. option casemap :none
    4.  
    5. include \masm32\include\w2k\ntdll.inc
    6. includelib \masm32\lib\w2k\ntdll.lib
    7. include \masm32\include\windows.inc
    8. include \masm32\include\kernel32.inc
    9. includelib \masm32\lib\kernel32.lib  
    10. includelib \masm32\lib\user32.lib
    11. include \masm32\include\user32.inc
    12. include \masm32\include\gdi32.inc  
    13. includelib \masm32\lib\gdi32.lib
    14. include \masm32\macros\strings.mac
    15. include \masm32\include\masm32.inc
    16. includelib \masm32\lib\masm32.lib
    17.  
    18. .code
    19. Screen proc hWnd:DWORD,lParam:DWORD
    20.      local hdc:HDC
    21.      local memdc:HDC
    22.      local hBitmap:dword
    23.      local dwWidth:dword
    24.      local dwHeight:dword
    25.      local hSize:dword
    26.      local hSize2:dword
    27.      local buffer[1024]:byte
    28.      local rc:RECT
    29.      local lpBMPImage:dword
    30.  
    31.        invoke GetWindowText,hWnd,addr buffer,sizeof buffer
    32.         .if eax > 0
    33.            invoke lstrcmp,addr buffer,$CTA0("Calculator");$CTA0("Калькулятор");
    34.             .if eax == 0
    35.                invoke GetWindowRect,hWnd,addr rc
    36.                mov eax,rc.right
    37.                sub eax,rc.left
    38.                sub eax,6
    39.                mov dwWidth,eax
    40.                mov ecx,rc.bottom
    41.                sub ecx,rc.top
    42.                sub ecx,25
    43.                mov dwHeight,ecx
    44.                mul ecx
    45.                mov ecx,24
    46.                mul ecx
    47.                shr eax,3
    48.                add eax,sizeof BITMAPFILEHEADER
    49.                add eax,sizeof BITMAPINFOHEADER
    50.                mov hSize,eax
    51.                mov hSize2,eax
    52.                mov lpBMPImage,0
    53.                invoke ZwAllocateVirtualMemory,-1,addr lpBMPImage,0,addr hSize2,MEM_COMMIT,PAGE_EXECUTE_READWRITE
    54.                 .if eax == 0
    55.                    mov edi,lpBMPImage
    56.                    mov (BITMAPFILEHEADER ptr [edi]).bfType,4D42h
    57.                    mov eax,hSize
    58.                    mov (BITMAPFILEHEADER ptr [edi]).bfSize,eax
    59.                    mov (BITMAPFILEHEADER ptr [edi]).bfOffBits,sizeof BITMAPFILEHEADER + sizeof BITMAPINFOHEADER
    60.                    add edi,sizeof BITMAPFILEHEADER
    61.                    mov (BITMAPINFOHEADER ptr [edi]).biSize,sizeof BITMAPINFOHEADER
    62.                    mov eax,dwWidth
    63.                    mov (BITMAPINFOHEADER ptr [edi]).biWidth,eax
    64.                    mov eax,dwHeight
    65.                    mov (BITMAPINFOHEADER ptr [edi]).biHeight,eax
    66.                    mov (BITMAPINFOHEADER ptr [edi]).biPlanes,1
    67.                    mov (BITMAPINFOHEADER ptr [edi]).biBitCount,24
    68.                    mov (BITMAPINFOHEADER ptr [edi]).biCompression,BI_RGB
    69.  
    70.                    invoke GetDCEx,hWnd,0,0
    71.                    mov hdc,eax
    72.                    invoke CreateCompatibleDC,hdc
    73.                    mov memdc,eax
    74.                    invoke CreateCompatibleBitmap,hdc,dwWidth,dwHeight
    75.                    mov hBitmap,eax
    76.                    invoke SelectObject,memdc,hBitmap
    77.                    invoke BitBlt,memdc,0,0,dwWidth,dwHeight,hdc,0,0,SRCCOPY
    78.                    invoke ReleaseDC,0,hdc
    79.                    mov esi,edi
    80.                    add edi,sizeof BITMAPINFOHEADER
    81.                    invoke GetDIBits,memdc,hBitmap,0,dwHeight,edi,esi,0
    82.                    invoke DeleteObject,hBitmap
    83.                    invoke DeleteDC,memdc
    84.                    
    85.                    invoke DeleteFileA,lParam
    86.                    invoke _lcreat,lParam,OF_WRITE
    87.                    mov esi,eax
    88.                    invoke _lwrite,esi,lpBMPImage,hSize
    89.                    invoke _lclose,esi
    90.                    
    91.                    invoke ZwFreeVirtualMemory,-1,addr lpBMPImage,addr hSize2,MEM_RELEASE
    92.                 .endif
    93.                 xor eax,eax
    94.                 ret
    95.             .endif
    96.         .endif
    97.        mov eax,1
    98.        ret
    99. Screen endp
    100. start proc
    101.        invoke EnumWindows,offset Screen,$CTA0("sample.bmp")
    102.        invoke ExitProcess,0
    103. start endp
    104. end start
    Хотел узнать:
    1) Насколько это корявая реализация ?
    2) Будет ли работать на все Vista и Seven ?
    3) Можно-ли еще пооптимальнее?

    Мне просто потом весь этот код надо будет перенести на уровен ниже, т.е. на функции ZwUser* и ZwGdi*.
    Спасибо За мнимание.
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Flasher
    1. На уровень шадов сервисов бессмысленно переносить это, обёртка вокруг них очень большая и в версиях сильно отличается. Ядерными указателями вам не нужно ведь манипулировать из юзермода(ога, на уровне сервисов именно ядерные адреса передаются), выщитывать дельты между пользовательской и ядерной проекциями, искать кучу не экспортируемых функций(ValidateHwnd() etc.).. незачем это делать. Вашу защиту это не улучшит.
    2. Скрин таким образом не получится снять. Если окно закрыто другим или скрыто, то нужную картинку вы не получите. Следует использовать чтото типа PrintWindow(), при запросе на перерисовку шадов доставляет некоторые калбэки, которые вызывают оконные функции и инициируют перересовку, логично принять решение о захвате этих сообщений(только удалённо) и подмене контекста.
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    (контекста на котором прорисовка выполняется).
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
  5. mrcrown

    mrcrown Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    227
    ... мдец
    http://wasm.ru/forum/viewtopic.php?id=31473
     
  6. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Clerk, почти для всех функций нашел прототипы в ядре.
    Код (Text):
    1. .586
    2. .model flat, stdcall
    3. option casemap :none
    4.  
    5. include \masm32\include\w2k\ntdll.inc
    6. includelib \masm32\lib\w2k\ntdll.lib
    7. include \masm32\include\windows.inc
    8. include \masm32\include\kernel32.inc
    9. includelib \masm32\lib\kernel32.lib  
    10. includelib \masm32\lib\user32.lib
    11. include \masm32\include\user32.inc
    12. include \masm32\include\gdi32.inc  
    13. includelib \masm32\lib\gdi32.lib
    14. include \masm32\macros\strings.mac
    15. include \masm32\include\masm32.inc
    16. includelib \masm32\lib\masm32.lib
    17.  
    18. .code
    19. Screen proc hWnd:DWORD,lParam:DWORD
    20.      local hdc:HDC
    21.      local memdc:HDC
    22.      local hBitmap:dword
    23.      local dwWidth:dword
    24.      local dwHeight:dword
    25.      local hSize:dword
    26.      local hSize2:dword
    27.      local buffer[1024]:byte
    28.      local rc:RECT
    29.      local lpBMPImage:dword
    30.      local po:POINT
    31.  
    32.        invoke GetWindowText,hWnd,addr buffer,sizeof buffer
    33.         .if eax > 0
    34.            invoke lstrcmp,addr buffer,$CTA0("Calculator");$CTA0("Калькулятор");
    35.             .if eax == 0
    36.                ;invoke GetWindowRect,hWnd,addr rc
    37.                lea eax,po
    38.                push eax
    39.                lea eax,rc
    40.                push eax
    41.                push hWnd
    42.                mov eax,119Bh ;ZwUserGetInternalWindowPos
    43.                mov edx,esp
    44.                int 2Eh
    45.                lea esp,[esp+3*4]
    46.                
    47.                mov eax,rc.right
    48.                sub eax,rc.left
    49.                sub eax,6
    50.                mov dwWidth,eax
    51.                mov ecx,rc.bottom
    52.                sub ecx,rc.top
    53.                sub ecx,25
    54.                mov dwHeight,ecx
    55.                mul ecx
    56.                mov ecx,24
    57.                mul ecx
    58.                shr eax,3
    59.                add eax,sizeof BITMAPFILEHEADER
    60.                add eax,sizeof BITMAPINFOHEADER
    61.                mov hSize,eax
    62.                mov hSize2,eax
    63.                mov lpBMPImage,0
    64.                invoke ZwAllocateVirtualMemory,-1,addr lpBMPImage,0,addr hSize2,MEM_COMMIT,PAGE_EXECUTE_READWRITE
    65.                 .if eax == 0
    66.                    mov edi,lpBMPImage
    67.                    mov (BITMAPFILEHEADER ptr [edi]).bfType,4D42h
    68.                    mov eax,hSize
    69.                    mov (BITMAPFILEHEADER ptr [edi]).bfSize,eax
    70.                    mov (BITMAPFILEHEADER ptr [edi]).bfOffBits,sizeof BITMAPFILEHEADER + sizeof BITMAPINFOHEADER
    71.                    add edi,sizeof BITMAPFILEHEADER
    72.                    mov (BITMAPINFOHEADER ptr [edi]).biSize,sizeof BITMAPINFOHEADER
    73.                    mov eax,dwWidth
    74.                    mov (BITMAPINFOHEADER ptr [edi]).biWidth,eax
    75.                    mov eax,dwHeight
    76.                    mov (BITMAPINFOHEADER ptr [edi]).biHeight,eax
    77.                    mov (BITMAPINFOHEADER ptr [edi]).biPlanes,1
    78.                    mov (BITMAPINFOHEADER ptr [edi]).biBitCount,24
    79.                    mov (BITMAPINFOHEADER ptr [edi]).biCompression,BI_RGB
    80.  
    81.                    ;invoke GetDCEx,hWnd,0,0
    82.                    push 0
    83.                    push 0
    84.                    push hWnd
    85.                    mov eax,1192h ;ZwUserGetDCEx
    86.                    mov edx,esp
    87.                    int 2Eh
    88.                    lea esp,[esp+3*4]
    89.                    mov hdc,eax
    90.                    ;invoke CreateCompatibleDC,hdc
    91.  
    92.                    push hdc
    93.                    mov eax,101Eh ;ZwGdiCreateCompatibleDC
    94.                    mov edx,esp
    95.                    int 2Eh
    96.                    lea esp,[esp+1*4]
    97.                    mov memdc,eax
    98.                    
    99.                    ;invoke CreateCompatibleBitmap,hdc,dwWidth,dwHeight
    100.                    push dwHeight
    101.                    push dwWidth
    102.                    push hdc
    103.                    mov eax,101Dh ;ZwGdiCreateCompatibleBitmap
    104.                    mov edx,esp
    105.                    int 2Eh
    106.                    lea esp,[esp+3*4]
    107.                    mov hBitmap,eax
    108.                    
    109.                    ;invoke SelectObject,memdc,hBitmap
    110.                    push hBitmap
    111.                    push memdc
    112.                    mov eax,1101h ;ZwGdiSelectBitmap
    113.                    mov edx,esp
    114.                    int 2Eh
    115.                    lea esp,[esp+2*4]
    116.                    
    117.                    ;invoke PrintWindow,hWnd,memdc,0
    118.                    push 0
    119.                    push memdc
    120.                    push hWnd
    121.                    mov eax,11DDh ;ZwUserPrintWindow
    122.                    mov edx,esp
    123.                    int 2Eh
    124.                    lea esp,[esp+3*4]
    125.  
    126.                    ;invoke BitBlt,memdc,0,0,dwWidth,dwHeight,hdc,0,0,SRCCOPY
    127.                    push 0
    128.                    push 0
    129.                    push SRCCOPY
    130.                    push 0
    131.                    push 0
    132.                    push hdc
    133.                    push dwHeight
    134.                    push dwWidth
    135.                    push 0
    136.                    push 0
    137.                    push memdc
    138.                    mov eax,100Dh ;ZwGdiBitBlt
    139.                    mov edx,esp
    140.                    int 2Eh
    141.                    lea esp,[esp+11*4]
    142.                    
    143.                    ;invoke ReleaseDC,0,hdc
    144.                    push hdc
    145.                    mov eax,100Eh ;ZwGdiCancelDC
    146.                    mov edx,esp
    147.                    int 2Eh
    148.                    lea esp,[esp+1*4]
    149.                    push 39h
    150.                    push hdc
    151.                    mov eax,1143h ;ZwUserCallOneParam
    152.                    mov edx,esp
    153.                    int 2Eh
    154.                    lea esp,[esp+2*4]
    155.  
    156.                    mov esi,edi
    157.                    add edi,sizeof BITMAPINFOHEADER
    158.                    invoke GetDIBits,memdc,hBitmap,0,dwHeight,edi,esi,0
    159.                    
    160.                    ;invoke DeleteObject,hBitmap
    161.                    push hBitmap
    162.                    mov eax,107Ah ;ZwGdiDeleteObjectApp
    163.                    mov edx,esp
    164.                    int 2Eh
    165.                    lea esp,[esp+1*4]
    166.                    
    167.                    invoke DeleteDC,memdc
    168.                    
    169.                    invoke DeleteFileA,lParam
    170.                    invoke _lcreat,lParam,OF_WRITE
    171.                    mov esi,eax
    172.                    invoke _lwrite,esi,lpBMPImage,hSize
    173.                    invoke _lclose,esi
    174.                    
    175.                    invoke ZwFreeVirtualMemory,-1,addr lpBMPImage,addr hSize2,MEM_RELEASE
    176.                 .endif
    177.                 xor eax,eax
    178.                 ret
    179.             .endif
    180.         .endif
    181.        mov eax,1
    182.        ret
    183. Screen endp
    184. start proc
    185.        invoke EnumWindows,offset Screen,$CTA0("sample.bmp")
    186.        invoke ExitProcess,0
    187. start endp
    188. end start
    Номера сервисов из XP.
    У меня норм снимает. А от функции PrintWindow вроди никакого толка, если поверх другое окно, снимает это окно.
     
  7. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Только для DeleteDC не нашел, и столкнулся с проблемами при юзании ZwGdiGetDIBitsInternal вместо GetDIBits.
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Flasher
    Наоборот, PrintWindow(NtUserPrintWindow) выполняет замену коннтекста, доставляет сообщение для обновления его и копирует изображение, тоесть на внутренний контекст отрисовка происходит, смотрим:
    [​IMG]
    Но всятаки я бы выполнил код как и сказал, вручную подменив контекст.
    Касательно сервисов. На сколько понимаю вам они нужны чтобы код был самодостаточным, тоесть сокрыть от юзермодного отладчика. Это бесполезно, элементарно условный останов на прерывание, тутже обнаружит вызов, на это секунды уйдут, под сисером выполнить > proc, bpint 2e (pid == #), F9. Более того это инициирует ядерный калбэк в чужём процессе, там можно выполнить проверку состояния обьектов.
     
  9. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    А, т.е. в верхнем коде отпадает юзание ZwGdiBitBlt и все да ? :)
    А хочу юзать прямиком из ядря чтобы хотябы юзермодных антискринов не написали, т.е. перехватить и подменить.
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Да, это сервис сам делает.