Kirjautuminen

Haku

Tehtävät

Koodit: Assembly: XOR-kryptaus makroilla (FASM)

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'

Kirjoita kommentti

Muista lukea kirjoitusohjeet.
Tietoa sivustosta