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 не забудьте нажать любую кнопку после запуска программы, чтобы появился запрос.
--
Программа будет апгрейдится, будут новые версии с новым source-кодом.
--
Самое важное из кода:
DC - GetDC дает доступ к экрану, а CreateCompatibleDC создает его виртуальную копию в памяти.
BitBlt - Получаем снимок именно через эту функцию. Она копирует пиксели из одного контекста в другой.
ABI - Также в программе демонстрируется работа с Windows x64 ABI.
GetDIBits - Чтобы GetDIBits сработал, заполняем структуру BITMAPINFOHEADER, где указываем ширину, высоту и глубину цвета (32 бита). После этого функция берет данные из битмапов и выгружает их в память, которая была выделена через GlobalAlloc.
BMP - это просто три куска данных в одном файле: Header, InfoHeader (его ТТХ) и сырые пиксели в конце. Всё это по очереди записывается на диск через WriteFile.
P.S не забудьте нажать любую кнопку после запуска программы, чтобы появился запрос.
--
ASM:
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:
macro .code {
section '.text' code readable executable
}
macro .data {
section '.data' data readable writeable
}
macro .idata {
section '.idata' import data readable writeable
}
Последнее редактирование:
