I haven't worked in assembly language for a long time. My favorite is FASM.
Here is an example of older source code that randomly displays some colored pixels.
If you change this line of source code, you will see that it is written directly on the screen from Windows 10:
invoke FindWindow,NULL,<'Random Pixels Screen'>
this is the result:
... using this you cannot be able to take a screenshot with Windows shortkeys:
invoke FindWindow,NULL,<'Random Pixels ...'>
This is the source code, if you want to test it:
format pe console
entry start
include 'INCLUDE/WIN32AX.INC'
section '.code' code readable writeable executable
start:
invoke GetStdHandle,STD_OUTPUT_HANDLE
mov [stdout],eax
mov [rect.Left],0
mov [rect.Top],0
mov [rect.Right],79
mov [rect.Bottom],44
mov [coord.x],8
mov [coord.y],40
mov [cinfo.dwSize],25
mov [cinfo.bVisible],FALSE
cinvoke system,<'cls'>
cinvoke srand,<cinvoke time,NULL>
invoke SetConsoleTitle,<'Random Pixels Screen'>
invoke SetConsoleWindowInfo,[stdout],1,rect
invoke SetConsoleScreenBufferSize,[stdout],dword[coord]
invoke SetConsoleCursorInfo,[stdout],cinfo
invoke FindWindow,NULL,<'Random Pixels ...'>
mov [hWnd],eax
invoke GetDC,[hWnd]
mov [hdc],eax
@@:
cinvoke rand
shl eax,9
push eax
cinvoke rand
pop ecx
add eax,ecx
mov esi,eax
invoke SetPixel,[hdc],<stdcall rnd,640>,<stdcall rnd,100>,esi
cinvoke _kbhit
test eax,eax
jz @b
invoke ExitProcess,0
proc rnd max
cinvoke rand
shl eax,17
mul [max]
mov eax,edx
ret
endp
section '.data' data readable writeable
struc COORD {
.x dw ?
.y dw ?
}
struc SMALL_RECT {
.Left dw ?
.Top dw ?
.Right dw ?
.Bottom dw ?
}
struc LPCONSOLE_CURSOR_INFO {
.dwSize dd ?
.bVisible db ?
}
cinfo LPCONSOLE_CURSOR_INFO
rect SMALL_RECT
coord COORD
stdout dd ?
hWnd dd ?
hdc dd ?
section '.idata' import data readable writeable
library kernel32,'kernel32.dll',\
msvcrt,'msvcrt.dll',\
user32,'user32.dll',\
gdi32,'gdi32.dll'
import gdi32,\
SetPixel,'SetPixel'
import user32,\
GetDC,'GetDC',\
FindWindow,'FindWindowA'
import kernel32,\
ExitProcess,'ExitProcess',\
GetStdHandle,'GetStdHandle',\
SetConsoleTitle,'SetConsoleTitleA',\
SetConsoleCursorInfo,'SetConsoleCursorInfo',\
SetConsoleWindowInfo,'SetConsoleWindowInfo',\
SetConsoleCursorPosition,'SetConsoleCursorPosition',\
SetConsoleScreenBufferSize,'SetConsoleScreenBufferSize'
import msvcrt,\
_kbhit,'_kbhit',\
system,'system',\
srand,'srand',\
rand,'rand',\
time,'time'