áúðчðть - Xakep Online
áúðчðть - Xakep Online
áúðчðть - Xakep Online
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
lea rdx,[_message] ; lpText ïåðåäàåì ñìåùåíèå âûâîäèìîé ñòðîêè<br />
mov rcx,0<br />
; hWnd ïåðåäàì äåñêðèïòîð îêíà âëàäåëüöà<br />
; (ìîæíî òàêæå èñïîëüçîâàòü xor rcx, rcx,<br />
; ÷òî íà òðè áàéòà êîðî÷å)<br />
call [MessageBox] ; âûçûâàåì ôóíêöèþ MessageBox<br />
mov ecx,eax ; çàíîñèì â ecx ðåçóëüòàò âîçâðàòà<br />
; (Ôóíêöèÿ ExitProcess îæèäàåò 32-áèòíûé ïàðàìåòð<br />
; ìîæíî èñïîëüçîâàòü è mov rcx, rax, íî ýòî áóäåò<br />
; íà áàéò äëèííåå)<br />
call [ExitProcess] ; âûçûâàåì ôóíêöèþ ExitProcess<br />
; ñîçäàòü ñåêöèþ äàííûõ ñ àòðèáóòàìè íà ÷òåíèå è çàïèñü<br />
; (âîîáùå-òî â äàííîì ñëó÷àå àòðèáóò íà çàïèñü íåîáÿçàòåëåí,<br />
; ïîñêîëüêó ìû íè÷åãî íå ïèøåì, à òîëüêî ÷èòàåì)<br />
section '.data' data readable writeable<br />
_caption db 'PENUMBRA is awesome!',0; ASCIIZ-ñòðîêà çàãîëîâêà îêíà<br />
_message db 'Hello World!',0 ; ASCIIZ-ñòðîêà âûâîäèìàÿ íà ýêðàí<br />
; ñîçäàòü ñåêöèþ èìïîðòà ñ àòðèáóòàìè íà ÷òåíèå è çàïèñü<br />
; (çäåñü àòðèáóò íà çàïèñü îáÿçàòåëåí, ïîñêîëüêó ïðè çàãðóçêå PE-Ôàéëà<br />
; â ñåêöèþ èìïîðòà ; áóäóò çàïèñûâàòüñÿ ôàêòè÷åñêèå àäðåñà API-ôóíêöèé)<br />
section '.idata' import data readable writeable<br />
dd 0,0,0,RVA kernel_name,RVA kernel_table<br />
dd 0,0,0,RVA user_name,RVA user_table<br />
dd 0,0,0,0,0 ; çàâåðøàåì ñïèñîê äâóìÿ 64-ðàçðÿíûìè íóëåìè!!!<br />
kernel_table:<br />
ExitProcess dq RVA _ExitProcess<br />
dq 0 ; çàâåðøàåì ñïèñîê 64-ðàçðÿíûì íóëåì!!!<br />
user_table:<br />
MessageBox dq RVA _MessageBoxA<br />
dq 0<br />
äèçàññåìáëèðîâàíèå 64-áèòíîãî PE-ôàéëà 32-áèòíîé âåðñèé IDA Pro<br />
64-ðàçðÿäíûì êîäîì áåç íåîáõîäèìîñòè. Åãî ñëåäóåò èñïîëüçîâàòü<br />
òîëüêî òàì, ãäå 64-áèòíàÿ àðèôìåòèêà è 8 äîïîëíèòåëüíûõ ðåãèñòðîâ<br />
äåéñòâèòåëüíî äàþò îùóòèìûé âûèãðûø. Íàïðèìåð, â ìàòåìàòè÷åñêèõ<br />
çàäà÷àõ èëè ïðîãðàììàõ äëÿ âñêðûòèÿ ïàðîëåé.<br />
[äèçàññåìáëåðíûé ëèñòèíã 32-áèòíîãî ïðèëîæåíèÿ hello, world!]<br />
code:00401000 6A 00<br />
push0<br />
code:00401002 68 00 20 40 00 pushoffset aPENUMBRA<br />
code:00401007 68 17 20 40 00 pushoffset aHelloWorld<br />
code:0040100C 6A 00<br />
push0<br />
code:0040100E FF 15 44 30 40 00 call ds:MessageBoxA<br />
code:00401014 6A 00<br />
push0<br />
code:00401016 FF 15 3C 30 40 00 call ds:ExitProcess<br />
 êà÷åñòâå çàêëþ÷èòåëüíîãî óïðàæíåíèÿ ïåðåïèøåì íàøå ïðèëîæåíèå<br />
â ñòèëå MASM, ïîêëîííèêîâ êîòîðîãî íóæíî íå áèòü, à óâàæàòü. Íèêàêèõ<br />
ðàäèêàëüíûõ îòëè÷èé íå íàáëþäàåòñÿ:<br />
[64-áèòíîå ïðèëîæåíèå hello, world ïîä Windows íà MASM'å]<br />
[XÀÊÅÐ 11 [83] 05 > ÊÎÄÈÍÃ 122]<br />
kernel_name db 'KERNEL32.DLL',0<br />
user_name db 'USER32.DLL',0<br />
_ExitProcess dw 0<br />
db 'ExitProcess',0<br />
_MessageBoxA dw 0<br />
db 'MessageBoxA',0<br />
Àññåìáëèðóåì ôàéë (fasm PE64DEMO.ASM) è çàïóñòèì îáðàçîâàâøèéñÿ EXE<br />
íà âûïîëíåíèå. Ïîä 32-ðàçðÿäíîé Windows îí, åñòåñòâåííî, íå çàïóñòèòñÿ.<br />
Âäîâîëü íàèãðàâøèñü íàøåì ïåðâûì x86-64 ôàéëîì, çàãðóçèì åãî<br />
â äèçàññåìáëåð (íàïðèìåð, â IDA Pro 4.7. Îíà õîòü è ìàòåðèòüñÿ,<br />
ïðåäëàãàÿ èñïîëüçîâàòü ñïåöèàëüíóþ 64-áèòíóþ âåðñèþ, íî ïðè íàæàòèè<br />
íà yes âñå êîððåêòíî äèçàññåìáëèðóåò, âî âñÿêîì ñëó÷àå äî<br />
òåõ ïîð, ïîêà íå ñòîëêíåòñÿ ñ ïîäëèííûì 64-áèòíûì àäðåñîì èëè<br />
îïåðàíäîì, ñ êîòîðûì ïðîèçîéäåò îáðåçàíèå, â ÷àñòíîñòè, mov<br />
r9,1234567890h äèçàññåìáëèðóåòñÿ, êàê mov r9, 34567890h, òàê ÷òî<br />
ïåðåõîä íà 64-áèòíóþ âåðñèþ IDA âñå æå î÷åíü æåëàòåëåí, òåì áîëåå,<br />
÷òî, íà÷èíàÿ ñ IDA 4.9, îíà âõîäèò â áàçîâóþ ïîñòàâêó). Ïîñìîòðèì,<br />
÷òî ó íàøåé ïðîãðàììû âíóòðè<br />
[äèçàññåìáëåðíûé ëèñòèíã 64-áèòíîãî ïðèëîæåíèÿ hello, world!]<br />
.code:0000000000401000 41 B9 00 00 00 00 mov r9d, 0<br />
.code:0000000000401006 4C 8D 05 F3 0F 00 00 lea r8, aPENUMBRA<br />
.code:000000000040100D 48 8D 15 03 10 00 00 lea rdx, aHelloWorld ;<br />
"Hello World!"<br />
.code:0000000000401014 48 C7 C1 00 00 00 00 mov rcx, 0<br />
.code:000000000040101B FF 15 2B 20 00 00 call cs:MessageBoxA<br />
.code:0000000000401021 89 C1<br />
mov ecx, eax<br />
.code:0000000000401023 FF 15 13 20 00 00 call cs:ExitProcess<br />
×òî æ, äîâîëüíî ãðîìîçäêî, îáúåìíî è êîíöåïòóàëüíî. Äëÿ ñðàâíåíèÿ,<br />
äèçàññåìáëèðîâàííûé ëèñòèíã àíàëîãè÷íîãî 32-ðàçðÿäíîãî ôàéëà ïðèâåäåí<br />
íèæå. Ñòàðûé x86 êîä â 1,6 ðàç êîðî÷å! À âåäü ýòî òîëüêî äåìîíñòðàöèîííàÿ<br />
ïðîãðàììà èç íåñêîëüêèõ ñòðîê! Íà ïîëíîâåñíûõ ïðèëîæåíèÿõ<br />
ðàçðûâ áóäåò òîëüêî íàðàñòàòü! Òàê ÷òî íå ñòîèò çëîóïîòðåáëÿòü<br />
; îáúÿâëÿåì âíåøíèå API-ôóíêöèè, êîòîðûå ìû áóäåì âûçûâàòü<br />
extrn MessageBoxA: PROC<br />
extrn ExitProcess: PROC<br />
; ñåêöèÿ äàííûõ ñ àòðèáóòàìè ïî óìîë÷àíèþ (÷òåíèå è çàïèñü)<br />
.data<br />
mytit db 'PENUMBRA is awesome!', 0<br />
mymsg db 'Hello World!', 0<br />
; ñåêöèÿ êîäà ñ àòðèáóòàìè ïî óìîë÷àíèþ (÷òåíèå è èñïîëíåíèå)<br />
.code<br />
Main:<br />
mov r9d, 0 ; uType = MB_OK<br />
lea r8, mytit ; LPCSTR lpCaption<br />
lea rdx, mymsg ; LPCSTR lpText<br />
mov rcx, 0 ; hWnd = HWND_DESKTOP<br />
call MessageBoxA<br />
mov ecx, eax<br />
call ExitProcess<br />
End Main<br />
; uExitCode = MessageBox(...)<br />
Àññåìáëèðîâàíèå è ëèíêîâêà ïðîõîäèò òàê:<br />
ml64 XXX.asm /link /subsystem:windows /defaultlib:kernel32.lib /defaultlib:user32.lib<br />
/entry:main<br />
â ðåçóëüòàòå ÷åãî îáðàçóåòñÿ ãîòîâûé ê óïîòðåáëåíèþ exe-ôàéë ñ ðóìÿíîé<br />
ïîäæàðåííîé êîðî÷êîé íàøåãî ÖÏ (FASM àññåìáëèðóåò íàìíîãî áûñòðåå).<br />
Êàê ïîêàçûâàåò ïðàêòèêà, çàïðîñû òèïà x86-64 [AMD64] assembler example<br />
íåýôôåêòèâíû è ãîðàçäî ëó÷øå èñïîëüçîâàòü ÷òî-íèáóäü âðîäå mov rax.<br />
[çàêëþ÷åíèå] Âîò ìû è ïîçíàêîìèëèñü ñ àðõèòåêòóðîé x86-64! Çäåñü<br />
äåéñòâèòåëüíî åñòü ìåñòî, ãäå ðàçâåðíóòñÿ è ÷åìó ïîó÷èòüñÿ! Íàñêîëüêî<br />
ýòè çíàíèÿ îêàæóòñÿ âîñòðåáîâàíû íà ïðàêòèêå — òàê ñðàçó è íå ñêàæåøü.<br />
Ó AMD åñòü õîðîøèå øàíñû ïîøàòíóòü ðûíîê, íî âåäü è Intel íå<br />
äðåìëåò, àêòèâíî ïðîäâèãàÿ ñîáñòâåííûå 64-ðàçðÿäíûå ïëàòôîðìû, èçâåñòíûå<br />
ïîä îáùåì èìåíåì IA64, íî î íèõ êàê-íèáóäü â äðóãîé ðàç