Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Исходник [ASM] Ассемблер - Open-Source BMP-Скриншотер. v0.01

EXCLUSIVE
EXCLUSIVE
Статус
Оффлайн
Регистрация
21 Июн 2025
Сообщения
148
Реакции
49
Написал прикольную программку, скриншотит и сохраняет в .bmp, иделаьно подходит для изучения новичками!
Программа будет апгрейдится, будут новые версии с новым source-кодом.
--
Самое важное из кода:

DC - GetDC дает доступ к экрану, а CreateCompatibleDC создает его виртуальную копию в памяти.
BitBlt
- Получаем снимок именно через эту функцию. Она копирует пиксели из одного контекста в другой.
ABI - Также в программе демонстрируется работа с Windows x64 ABI.
GetDIBits - Чтобы GetDIBits сработал, заполняем структуру BITMAPINFOHEADER, где указываем ширину, высоту и глубину цвета (32 бита). После этого функция берет данные из битмапов и выгружает их в память, которая была выделена через GlobalAlloc.
BMP - это просто три куска данных в одном файле: Header, InfoHeader (его ТТХ) и сырые пиксели в конце. Всё это по очереди записывается на диск через WriteFile.

P.S не забудьте нажать любую кнопку после запуска программы, чтобы появился запрос.

1771588482722.png


--

ASM:
Expand Collapse Copy
format PE64 console
entry start

include 'C:\FLAT\INCLUDE\win64a.inc'
include 'C:\FLAT\section.inc'

.data
information db "~~~~~ This is ScreenShoter for Yougame. v0.01 ~~~~~", 10, 0
information_two db "Author: KVANTOR815", 10, 0
lin db "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", 10, 0
info db "Enter F3 for screenshot", 10, 0
sucess db "ScreenShot succes!!", 10, 0
; ----
filename db 'screenshot.bmp', 0
header rb 14
info_header rb 40

section '.bss' readable writeable
hScreen dq ?
hMemDC dq ?
hBmp dq ?
hFile dq ?
pPixels dq ?
width dd ?
height dd ?
bytesWritten dd ?



.code
start:  
                            sub rsp, 48h

                            lea rcx, [information]
                            call[printf]
                            lea rcx, [information_two]
                            call[printf]
                            lea rcx, [lin]
                            call[printf]
                            call[_getch]
                            lea rcx, [info]
                            call[printf]
                            call[_getch]

                            ; ------
                        loops:  
                            mov rcx, 0x72 ; f3
                            call[GetAsyncKeyState]

                            test ax, 0x8000
                            jnz screen

                            mov rcx, 10
                            call[Sleep]

                            jmp loops
                        screen:
                            xor rcx, rcx
                            call[GetSystemMetrics]
                            mov [width], eax

                            ; sm
                            mov rcx, 1
                            call[GetSystemMetrics]
                            mov [height], eax

                            ; dc
                            call [GetDesktopWindow]
                            mov rcx, rax
                            call[GetDC]
                            mov [hScreen], rax

                            ; --
                            mov rcx, [hScreen]
                            call[CreateCompatibleDC]
                            mov [hMemDC], rax

                            ; --
                            mov rcx, [hScreen]
                            mov edx, [width]
                            mov r8d, [height]
                            call[CreateCompatibleBitmap]
                            mov [hBmp], rax

                            ; --
                            mov rcx, [hMemDC]
                            mov rdx, [hBmp]
                            call[SelectObject]

                            ; --
                            mov rcx, [hMemDC]
                            xor edx, edx
                            xor r8d, r8d
                            mov r9d, [width]

                            mov eax, [height]
                            mov [rsp+20h], rax
                            mov rax, [hScreen]
                            mov [rsp+28h], rax
                            mov qword [rsp+30h], 0
                            mov qword [rsp+38h], 0
                            mov qword [rsp+40h], 0x00CC0020
                            call[BitBlt]

                            mov eax, [width]
                            imul eax, [height]
                            shl eax, 2
                            mov ecx, 0x40
                            mov edx, eax
                            call [GlobalAlloc]
                            mov [pPixels], rax

                            mov dword [info_header], 40
                            mov eax, [width]
                            mov dword [info_header+4], eax
                            mov eax, [height]
                            mov dword [info_header+8], eax
                            mov word [info_header+12], 1
                            mov word [info_header+14], 32

                            ; --
                            mov rcx, [hMemDC]
                            mov rdx, [hBmp]
                            xor r8d, r8d
                            mov r9d, [height]
                            mov rax, [pPixels]
                            mov [rsp+20h], rax
                            lea rax, [info_header]
                            mov [rsp+28h], rax
                            mov qword [rsp+30h], 0
                            call [GetDIBits]

                            ; --

                            mov word [header], 0x4D42
                            mov eax, [width]
                            imul eax, [height]
                            shl eax, 2
                            add eax, 54
                            mov dword [header+2], eax
                            mov dword [header+10], 54


                            lea rcx, [filename]
                            mov edx, 0x40000000
                            xor r8d, r8d
                            xor r9, r9
                            mov qword [rsp+20h], 2
                            mov qword [rsp+28h], 0x80
                            mov qword [rsp+30h], 0
                            call [CreateFileA]
                            mov [hFile], rax

                            mov rcx, [hFile]
                            lea rdx, [header]
                            mov r8d, 14
                            lea r9, [bytesWritten]
                            mov qword [rsp+20h], 0
                            call [WriteFile]

                            mov rcx, [hFile]
                            lea rdx, [info_header]
                            mov r8d, 40
                            lea r9, [bytesWritten]
                            mov qword [rsp+20h], 0
                            call [WriteFile]

                            mov rcx, [hFile]
                            mov rdx, [pPixels]
                            mov eax, [width]
                            imul eax, [height]
                            shl eax, 2
                            mov r8d, eax
                            lea r9, [bytesWritten]
                            mov qword [rsp+20h], 0
                            call [WriteFile]

                            mov rcx, [hFile]
                            call [CloseHandle]

                            mov rcx, [hBmp]
                            call [DeleteObject]
                            mov rcx, [hMemDC]
                            call [DeleteDC]
                            xor rcx, rcx
                            mov rdx, [hScreen]
                            call [ReleaseDC]
                            mov rcx, [pPixels]
                            call [GlobalFree]

                            lea rcx, [sucess]
                            call[printf]

                            add rsp, 48h
                            xor rcx, rcx
                            call [ExitProcess]
   
.idata
    library kernel32, 'kernel32.dll', \
            msvcrt, 'msvcrt.dll', \
            user32, 'user32.dll', \
            gdi32, 'gdi32.dll'

    import kernel32, \
           ExitProcess,'ExitProcess', \
           CloseHandle,'CloseHandle', \
           OpenProcess,'OpenProcess',\
           Sleep, 'Sleep', \
           CreateFileA, 'CreateFileA', \
           WriteFile, 'WriteFile', \
           GlobalAlloc, 'GlobalAlloc', \
           GlobalFree, 'GlobalFree'

    import msvcrt, \
           printf, 'printf', \
           _getch, '_getch'

    import user32, \
           GetAsyncKeyState, 'GetAsyncKeyState', \
           GetDC, 'GetDC', \          
           ReleaseDC, 'ReleaseDC', \      
           GetDesktopWindow,  'GetDesktopWindow',\
           GetSystemMetrics, 'GetSystemMetrics'
    import gdi32, \
           CreateCompatibleDC, 'CreateCompatibleDC', \
           CreateCompatibleBitmap, 'CreateCompatibleBitmap', \
           SelectObject, 'SelectObject', \
           BitBlt, 'BitBlt', \    
           DeleteDC, 'DeleteDC', \
           DeleteObject, 'DeleteObject', \
           GetDIBits,'GetDIBits'
section:
Expand Collapse Copy
macro .code {
    section '.text' code readable executable
}

macro .data {
    section '.data' data readable writeable
}

macro .idata {
    section '.idata' import data readable writeable
}
 
Последнее редактирование:
Назад
Сверху Снизу