UEFI Keylogger

Merhabalar. Bu blogta UEFI’de basit bir keylogger geliştireceğiz. Bir önceki blogta temel olarak UEFI’yi anlamıştık ve edk2 kurulumunu tamamlamıştık ve ardından bir adet gereği “Hello World” çıktısı veren sürücü yazmıştık. Artık basit projeler geliştirebilir hale geldik.

Kabaca yapacağımız şey UEFI’de klavyeden basılan tuşları ekrana bastıran bir sürücü yazacağız.

Kodlama

KeyLogger.c projesi oluşturalım ve aşağıdaki kodları yapıştıralım:

#include <Uefi.h>
#include <Library/UefiApplicationEntryPoint.h>
#include <Library/UefiLib.h>

EFI_STATUS
EFIAPI
UefiMain(
    EFI_HANDLE        ImageHandle,
    EFI_SYSTEM_TABLE  *SystemTable
) {
  EFI_SIMPLE_TEXT_INPUT_PROTOCOL *TextInput;
  EFI_INPUT_KEY Key;

  /* Protokole erişim sağla */
  TextInput = SystemTable->ConIn;

  Print (L"UEFI Keylogger!\n");

  while(1) {
    TextInput->ReadKeyStroke (
        TextInput, 
        &Key
    );
    if (Key.ScanCode == SCAN_ESC) {
      Print (L"ESC Button Detected\n");
      break;
    }

    if (Key.UnicodeChar != 0) {
      Print (L"Pressed: %c\n", Key.UnicodeChar);
    }
  }

  return EFI_SUCCESS;
}

Kodumuz oldukça basit. Detaylıca göz atalım:

EFI_SIMPLE_TEXT_INPUT_PROTOCOL *TextInput;
EFI_INPUT_KEY Key;

Sürücümüzde EFI_SIMPLE_TEXT_INPUT_PROTOCOL protokolü ile bir pointer oluşturarak başlıyoruz. Bu pointer, klavyeden gelen girişleri yakalamak için kullanacağız. EFI_SIMPLE_TEXT_INPUT_PROTOCOL protokolü, klavye girişlerini okuma işlemini gerçekleştiren temel bir protokoldür.

Daha sonra klavyeden basılan tuşları bir değişkene kaydetmek için EFI_INPUT_KEY tipinde bir değişken oluşturuyoruz.

TextInput = SystemTable->ConIn;

Bu kısımda ise EFI_SIMPLE_TEXT_INPUT_PROTOCOL’e erişim sağlıyoruz. ConIn, Console Input Protocol (Konsol Giriş Protokolü) için kullanılan bir üye değişkendir.

while(1) {
    TextInput->ReadKeyStroke ( 
        TextInput, 
        &Key
    );
    if (Key.ScanCode == SCAN_ESC) {
      Print (L"ESC Button Detected\n");
      break;
    }

    if (Key.UnicodeChar != 0) {
      Print (L"Pressed: %c\n", Key.UnicodeChar);
    }
}

Artık bir döngü ile basılan tuşları ekrana bastırmaya başlıyoruz. ReadKeyStroke ile basılan tuşları Key değişkenine aktarıyoruz.

Eğer basılan tuş ESC (SCAN_ESC) tuşuysa sürücünün döngüden çıkmasını sağlıyoruz. Eğer değilse basılan tuşu ekrana bastırıyoruz.

Sürücüyü Çalıştırma

KeyLogger.inf dosyasını oluşturalım ve aşağıdaki kodları yapıştıralım:

[Defines]
  INF_VERSION                    = 0x00010006
  BASE_NAME                      = KeyLogger
  MODULE_TYPE                    = UEFI_APPLICATION
  VERSION_STRING                 = 1.0
  ENTRY_POINT                    = UefiMain

[Sources]
  KeyLogger.c

[Packages]
  MdePkg/MdePkg.dec
  ShellPkg/ShellPkg.dec
  MdeModulePkg/MdeModulePkg.dec

[LibraryClasses]
  UefiApplicationEntryPoint
  UefiLib

Aşağıdaki kodla projemizi build edelim:

Build -m ShellPkg\Application\KeyLogger\KeyLogger.inf

Her şey tamam olduğuna göre sonuca bakabiliriz:

Gördüğünüz gibi klavyeden bastığım tuşlar ekrana bastırılıyor. ESC tuşuna basıldığında ise sürücü kapanıyor.

Sonuç

Bu blogta UEFI sürücüsü ile basit bir Keylogger geliştirmeyi öğrendik. Blogun basit olduğunun farkındayım ancak daha yeni olduğumuz için ve UEFI projelerine adepte olabilmek için böyle basit projelerle ilerlemenin güzel olacağını düşünüyorum. İlerideki süreçlerde daha derin projelere girişeceğiz.

Last updated on