- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
format pe console 5.0
entry start
include 'win32ax.inc'
SLEEP=1000
section '.data' data readable
_hello db 'Hello "https://www.govnokod.ru/"!',13,10,0
_conout db 'CONOUT$',0
align 8
_conoutnt du '\??\CONOUT$',0
section '.data?' data readable writeable
bytes_write dd ?
houtput dd ?
length dd ?
section '.text' code readable executable
start:
call _novice
invoke Sleep,SLEEP
call _advanced
invoke Sleep,SLEEP
call _psycho
invoke Sleep,SLEEP
invoke ExitProcess,0
_novice:
invoke GetStdHandle,STD_OUTPUT_HANDLE
mov [houtput],eax
invoke lstrlen,_hello
mov [length],eax
invoke WriteConsole,[houtput],_hello,[length],bytes_write,0
ret
_advanced:
invoke CreateFileA,_conout,GENERIC_WRITE,0,0,OPEN_EXISTING,0,0
mov [houtput],eax
invoke lstrlen,_hello
mov [length],eax
invoke WriteFile,[houtput],_hello,[length],bytes_write,0
invoke CloseHandle,[houtput]
ret
_psycho:
push ebx
sub esp,40
mov ebx,esp
mov word[ebx+24],22
mov word[ebx+26],24
mov dword[ebx+28],_conoutnt
mov dword[ebx+0],24
mov dword[ebx+4],0
lea eax,[ebx+24]
mov dword[ebx+8],eax
mov dword[ebx+12],$00000040
mov dword[ebx+16],0
mov dword[ebx+20],0
lea eax,[ebx+32]
invoke NtCreateFile,houtput,$40100080,ebx,eax,0,0,0,1,$60,0,0
invoke lstrlen,_hello
mov [length],eax
lea eax,[ebx+32]
invoke NtWriteFile,[houtput],0,0,0,eax,_hello,[length],0,0
invoke NtClose,[houtput]
add esp,40
pop ebx
ret
section '.import' data import readable
library\
ntdll,'ntdll.dll',\
kernel32,'kernel32.dll'
import ntdll,\
NtClose,'NtClose',\
NtCreateFile,'NtCreateFile',\
NtWriteFile,'NtWriteFile'
include 'api\kernel32.inc'
section '.reloc' fixups data readable discardable
Интересно какой из методов (_novice, _advanced, _psycho) вывода в консоль является говнокодом?
Мне вот, кстати, непонятно, почему Томаш, написав ассемблер с таким классным препроцессором, сам не юзает макросы в исходниках fasm, и даже таблицы импорта руками собирает?
Ассемблерщики любят ручками поработать, любят сэкономить лишний байт, лишний проход и лишнюю милисекунду конпеляции. Именно поэтому я за "assembler".
Надо бы придумать fasm++, с классами, шаблонами, констэкспрами и прочей хуйнёй и наметушить огромную библиотеку, чтобы программы конпелировались по джва часа.
invoke stdcall
cinvoke ccall
З.Ы. Я просто никогда invoke в асмах не юзал, всегда push/mov вручную писал подглядывая в соглашение о вызовах.
З.Ы. На английской. На русской только 32-битные перевели.
куда ссал?
Блин, я сначала подумал, что это парсер ГК на асме...
> _psycho
А напрямую через syscall, как недавно для линукса делали, тогда кто? :)
_shizo
_shizo:
push ebx edi
xor edi,edi
sub esp,40
mov ebx,esp
mov word[ebx+24],22
mov word[ebx+26],24
mov dword[ebx+28],_conoutnt
mov dword[ebx+0],24
mov dword[ebx+4],edi
lea eax,[ebx+24]
mov dword[ebx+8],eax
mov dword[ebx+12],$00000040
mov dword[ebx+16],edi
mov dword[ebx+20],edi
lea eax,[ebx+32]
push edi
push edi
push $60
push 1
push edi
push edi
push edi
push eax
push ebx
push $40100080
push houtput
push edi
mov eax,$55
mov edx,$775BEA50
call edx
add esp,$30;$2C
invoke lstrlen,_hello
mov [length],eax
lea eax,[ebx+32]
push edi
push edi
push [length]
push _hello
push eax
push edi
push edi
push edi
push [houtput]
push edi
mov eax,$1A0008
mov edx,$775BEA50
call edx
add esp,$28
push [houtput]
push edi
mov eax,$3000F
mov edx,$775BEA50
call edx
add esp,$8
add esp,40
pop edi ebx
ret
> call edx
Сла́бо.
З.Ы. Или можно call + systenter? Я просто не помню, что делает переходник после возврата из сисколла. Если там просто ret - то прокатит.
З.Ы. Но я х.з. насчёт стабильности виндовых сисколлов. Надо исследовать разные версии венды. Так то твой способ надёжнее.
Флаг на 0x7FFE0308 — какое-то поле в KUSER_SHARED_DATA, видимо, поддерживает ли процессор «syscall».
А вот добрые люди ведут список сисколлов: https://j00ru.vexillium.org/syscalls/nt/64/
Декомпилировал ntdll от «Windows 95». Оказывается, на не-NT сделали шиворот-навыворот: ntdll импортирует функции из kernel32. Это примерно как на заборе слово «МЕЛ» написать...
> $60
Паскалист?)