Kirjoittaja: Deffi
Kirjoitettu: 04.09.2008 – 21.12.2013
Tagit: ohjelmointitavat, koodi näytille, vinkki
Koodivinkissä esitellään FASM-assemblerin makroja sekä yksinkertaisen Windows-konsoliohjelman luomista assemblyllä käyttäen C:n standardikirjastoa. Lähdekoodissa määritellään pari tekstiä, jotka XORrataan käännöksen aikana käyttämällä FASMin makroja. Näin tekstit eivät näy binäärissä esimerkiksi heksaeditorilla tutkittaessa. Ajon aikana tekstit puretaan ja näytetään käyttäjälle printf:llä.
FASM?
FASM on tehokas assembleri x86(-64)-prosesoriarkkitehtuurille, joka on saatavilla Linuxille, DOSille ja Windowsille osoitteesta flatassembler.net. Jos kiinnostaa tietää miksi FASM on muita assemblereita parempi, niin kannattaa lukea vaikka tämä: Design Principles - or why flat assembler is different?
Kääntäminen
Koodin voi kääntää komentorivillä komennolla fasm.exe hello.asm tai käyttämällä FASMin mukana tulevaa kehitysympäristöä fasmw.exe. Koodin pitäisi kääntyä suoraan, kunhan muistaa määrittää FASMin include-polun asetustiedostoon fasmw.ini:
[Environment] Include=E:\fasmw\include
Polku tietysti saattaa poiketa. Käännetty ohjelma kannattaa ajaa komentorivillä, tai muuten se vain välähtää.
; Windows PE konsoliohjelma
format PE CONSOLE
include 'win32a.inc'
; koodi tulee binäärin .text-osioon
section '.text' code readable executable
entry $
; puretaan tervehdysviesti
push 0AAh ; XORrataan tällä
push szHello.size ; näin monta tavua
push szHello ; ja täältä
call DeXor
; tulostetaan purettu teksti.
; C:n standardikirjasto käyttää __cdecl-kutsumistapaa,
; joten meidän on huolehdittava pinon tasapainottamisesta
push szHello
call [printf]
add esp, 4 ; __cdecl
; ja vielä sama poistumisviestille
push 74h
push szQuit.size
push szQuit
call DeXor
push szQuit
call [printf]
add esp, 4
; nyt riitti
push 0
call [exit]
;-------------------------------------------------------------------------;
; funktio DeXor, joka purkaa viestin ajon aikana.
;-------------------------------------------------------------------------;
proc DeXor uses esi edi, lpSource:DWORD, dwSize:DWORD, bKey:BYTE
mov dl, [bKey] ; avain
mov esi, [lpSource] ; lähde
mov edi, esi ; kohde :)
mov ecx, [dwSize] ; määrä
; lodsb lukee al-rekisteriin tavun [esi] ja kasvattaa esiä yhdellä.
; stosb kirjoittaa al:n sisällön kohteeseen [edi] ja kasvattaa ediä yhdellä
.loop: lodsb
xor al, dl
stosb
loop .loop
ret
endp
section '.data' data readable writeable
; nämä tekstit eivät näy binäärissä selkokielisinä
szHello db "Hello World",0Dh,0Ah,0
.size = $ - szHello
szQuit db "Poistutaan...",0
.size = $ - szQuit
;-------------------------------------------------------------------------;
; FASM-makro viestien salaamista varten.
; % kertoo monesko repeatin suorituskerta on menossa.
; ensimmäisellä pyörähdyksellä %:n arvo on 1 (hence the -1)
;-------------------------------------------------------------------------;
macro xorcrypt source, len, key
{
repeat len
load x byte from source+%-1
x = x xor key
store byte x at source+%-1
end repeat
}
; kutsutaan makroa
xorcrypt szHello, szHello.size, 0AAh
xorcrypt szQuit, szQuit.size, 074h
;-------------------------------------------------------------------------;
; importataan ohjelmassa käytettävät APIt
;-------------------------------------------------------------------------;
section '.idata' import readable
library msvcrt,'msvcrt.dll'
import msvcrt,\
printf,'printf',\
exit,'exit'