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'