31.12.2014 Views

Скачать - Xakep Online

Скачать - Xakep Online

Скачать - Xakep Online

SHOW MORE
SHOW LESS

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, íî î íèõ êàê-íèáóäü â äðóãîé ðàç

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!