Ruby FFI (Foreign Function Interface) ile C/C++ Etkileşimleri #DevSecOps

Bunjo

Ar-Ge Ekibi Asistanı
14 Ara 2020
1,640
27
1,982
💎

6449ti9.gif

pDHFoUY.png


Merhabalar, ben Bunjo. Bu konuda FFI (Foreign Function Interface) kütüphanesini temel olarak anlatacağım.

pDHFoUY.png

Ruby Foreign Function Interface Nedir?

Ruby FFI (Foreign Function Interface), Ruby programlarından C ve C++ gibi diğer dillerde yazılmış kütüphanelere kolayca erişim sağlamak için kullanılan bir kütüphanedir. FFI, Ruby kodu ile yerel (native) kütüphaneler arasında köprü görevi görerek, Ruby kodunun doğrudan bu kütüphaneleri içinde çağırmasına olanak tanır.

pDHFoUY.png

C Kütüphanesini Yazma
C:
// libexample.c
#include <stdio.h>

void hello_world() {
    printf("Hello, world!\n");
}

int add(int a, int b) {
    return a + b;
}
Örnek olarak, ekrana yazı yazan ve iki sayıyı toplayan bir C kodumuz olsun.

Linux için

Kütüphaneyi derlemek için Makefile dosyayı oluşturunuz

Makefile:
# Makefile
libexample.so: libexample.c
    gcc -shared -o libexample.so -fPIC libexample.c

Daha sonrasında "make" komutu ile derleme işlemini yapabilirsiniz.

Windows için

Not: Bu kütüphane Windows sistemlerde çalışmayabilir.

GCC derleyicisini indirip, parh değişkenlerini ayarladıktan sonra

Rich (BB code):
 gcc -shared -o libexample.so -fPIC libexample.c

Komutu ile derleme işlemini yapabilirsiniz.

Bu komutlar sonucunda, libexample.so adında paylaşımlı bir kütüphane oluşturacaktır.

.dll olarakta kullanabilirsiniz.



Ruby FFI ile Etkileşim

Yazdığımız C kodu ile etkileşime geçen basit bir kod yazalım
Ruby:
require 'ffi'

module Example
  extend FFI::Library
  ffi_lib './libexample.so' # Dosya yolu

  attach_function :hello_world, [], :void
  attach_function :add, [:int, :int], :int
end

# Kullanım
Example.hello_world
puts Example.add(5, 3)

Kod Açıklaması

FFI Modülü Yükleme ve Kullanma
Ruby:
require 'ffi'

Modül Tanımlama ve Kütüphane Bağlama
Ruby:
module Example
  extend FFI::Library
  ffi_lib './libexample.so'

Example adında bir modül tanımlayıp, FFI::Library modülünü genişletiyoruz. Ardından, ffi_lib ile C kütüphanesini bağlıyoruz.

Fonksiyonları Bağlama

Ruby:
attach_function :hello_world, [], :void
attach_function :add, [:int, :int], :int

Fonksiyonları Kullanma
Ruby:
Example.hello_world
puts Example.add(5, 3)


pDHFoUY.png


FFI ile Point

C:
// point.c Dosyası
struct Point {
    int x;
    int y;
};

struct Point create_point(int x, int y) {
    struct Point p;
    p.x = x;
    p.y = y;
    return p;
}

Kod Açıklaması

struct Point Tanımı

C:
struct Point {
    int x;
    int y;
};

Bu kısımda Point isimli bir yapı (struct) tanımlanıyor.
struct Point iki adet int türünde değişken içeriyor: x ve y.

x: Noktanın x koordinatını tutar.
y: Noktanın y koordinatını tutr.

create_point Fonksiyonu

C:
struct Point create_point(int x, int y) {
    struct Point p;
    p.x = x;
    p.y = y;
    return p;
}

create_point isimli bir fonksiyon tanımlanıyor. Bu fonksiyon, iki int parametre alarak (x ve y), bir Point yapısı oluşturup geri döndürüyor.
Fonksiyonun dönüş tipi struct Point olarak belirtilmiş.

Fonksiyonun adımları:

struct Point p; ifadesi ile p adında bir Point yapısı oluşturuluyor.
p.x = x; ifadesi ile p yapısının x alanına fonksiyonun x parametresi atanıyor.
p.y = y; ifadesi ile p yapısının y alanına fonksiyonun y parametresi atanıyor.
return p; ifadesi ile oluşturulan p yapısı geri döndürülüyor.
Etkileşimi sağlayacak olan Ruby kodu

Ruby:
# example.rb
require 'ffi'

module Example
  extend FFI::Library
  ffi_lib 'point.so'

  class Point < FFI::Struct
    layout :x, :int,
           :y, :int
  end

  attach_function :create_point, [:int, :int], Point.by_value
end

point = Example.create_point(2, 3)
puts "Point: (#{point[:x]}, #{point[:y]})"

Kod Açıklaması

module Example


Ruby:
module Example
  extend FFI::Library
  ffi_lib './libexample.so'

Example adında bir modül tanımlanıyor.

extend FFI::Library ile FFI modülünün özelliklerini Example modülüne dahil ediyoruz.

ffi_lib './example.so' ile libexample.so adlı paylaşımlı kütüphaneyi yüklüyoruz. Bu kütüphane, point.c dosyasından derlenmiş olmalıdır.

class Point < FFI::Struct


Ruby:
  class Point < FFI::Struct
    layout :x, :int,
           :y, :int
  end

Point adında bir sınıf tanımlanıyor ve FFI::Struct sınıfından türetiliyor.

layout metodu ile Point yapısının C tarafındaki struct Point ile aynı düzenlemeye sahip olduğunu belirtiyoruz.

attach_function


Ruby:
  attach_function :create_point, [:int, :int], Point.by_value
end

attach_function metodu ile C kütüphanesindeki create_point fonksiyonunu Ruby'de kullanılabilir hale getiriyoruz.
:create_point Ruby'deki metod ismi.

[:int, :int] fonksiyonun iki int parametre aldığını belirtir.
Point.by_value fonksiyonun Point türünde bir değer döndüreceğini belirtir.


Geriye kalan kod kısımlarında ise fonksiyonların çağırımı ve kullanımı yer alıyor.

pDHFoUY.png


FFI çok detaylı bir kütüphanedir daha fazlası için


Okuyan herkese teşekkürler.
 

legandrary

Üye
24 Ağu 2023
164
35
Arkandayım
E

6449ti9.gif


pDHFoUY.png




Merhabalar, ben Bunjo. Bu konuda FFI (Foreign Function Interface) kütüphanesini temel olarak anlatacağım.



pDHFoUY.png




Ruby Foreign Function Interface Nedir?



Ruby FFI (Foreign Function Interface), Ruby programlarından C ve C++ gibi diğer dillerde yazılmış kütüphanelere kolayca erişim sağlamak için kullanılan bir kütüphanedir. FFI, Ruby kodu ile yerel (native) kütüphaneler arasında köprü görevi görerek, Ruby kodunun doğrudan bu kütüphaneleri içinde çağırmasına olanak tanır.



pDHFoUY.png




C Kütüphanesini Yazma



C:
// libexample.c
#include <stdio.h>

void hello_world() {
    printf("Hello, world!\n");
}

int add(int a, int b) {
    return a + b;
}
Örnek olarak, ekrana yazı yazan ve iki sayıyı toplayan bir C kodumuz olsun.



Linux için



Kütüphaneyi derlemek için Makefile dosyayı oluşturunuz




Makefile:
# Makefile
libexample.so: libexample.c
    gcc -shared -o libexample.so -fPIC libexample.c

Daha sonrasında "make" komutu ile derleme işlemini yapabilirsiniz.



Windows için



Not: Bu kütüphane Windows sistemlerde çalışmayabilir.



GCC derleyicisini indirip, parh değişkenlerini ayarladıktan sonra



Rich (BB code):
 gcc -shared -o libexample.so -fPIC libexample.c



Komutu ile derleme işlemini yapabilirsiniz.



Bu komutlar sonucunda, libexample.so adında paylaşımlı bir kütüphane oluşturacaktır.



.dll olarakta kullanabilirsiniz.





Ruby FFI ile Etkileşim



Yazdığımız C kodu ile etkileşime geçen basit bir kod yazalım




Ruby:
require 'ffi'

module Example
  extend FFI::Library
  ffi_lib './libexample.so' # Dosya yolu

  attach_function :hello_world, [], :void
  attach_function :add, [:int, :int], :int
end

# Kullanım
Example.hello_world
puts Example.add(5, 3)

Kod Açıklaması



FFI Modülü Yükleme ve Kullanma




Ruby:
require 'ffi'

Modül Tanımlama ve Kütüphane Bağlama




Ruby:
module Example
  extend FFI::Library
  ffi_lib './libexample.so'


Example adında bir modül tanımlayıp, FFI::Library modülünü genişletiyoruz. Ardından, ffi_lib ile C kütüphanesini bağlıyoruz.



Fonksiyonları Bağlama




Ruby:
attach_function :hello_world, [], :void
attach_function :add, [:int, :int], :int

Fonksiyonları Kullanma




Ruby:
Example.hello_world
puts Example.add(5, 3)



pDHFoUY.png




FFI ile Point



C:
// point.c Dosyası
struct Point {
    int x;
    int y;
};

struct Point create_point(int x, int y) {
    struct Point p;
    p.x = x;
    p.y = y;
    return p;
}

Kod Açıklaması



struct Point Tanımı




C:
struct Point {
    int x;
    int y;
};

Bu kısımda Point isimli bir yapı (struct) tanımlanıyor.


struct Point iki adet int türünde değişken içeriyor: x ve y.

x: Noktanın x koordinatını tutar.

y: Noktanın y koordinatını tutr.



create_point Fonksiyonu

C:
struct Point create_point(int x, int y) {
    struct Point p;
    p.x = x;
    p.y = y;
    return p;
}

create_point isimli bir fonksiyon tanımlanıyor. Bu fonksiyon, iki int parametre alarak (x ve y), bir Point yapısı oluşturup geri döndürüyor.

Fonksiyonun dönüş tipi struct Point olarak belirtilmiş.



Fonksiyonun adımları:



struct Point p; ifadesi ile p adında bir Point yapısı oluşturuluyor.

p.x = x; ifadesi ile p yapısının x alanına fonksiyonun x parametresi atanıyor.

p.y = y; ifadesi ile p yapısının y alanına fonksiyonun y parametresi atanıyor.

return p; ifadesi ile oluşturulan p yapısı geri döndürülüyor.




Etkileşimi sağlayacak olan Ruby kodu

Ruby:
# example.rb
require 'ffi'

module Example
  extend FFI::Library
  ffi_lib 'point.so'

  class Point < FFI::Struct
    layout :x, :int,
           :y, :int
  end

  attach_function :create_point, [:int, :int], Point.by_value
end

point = Example.create_point(2, 3)
puts "Point: (#{point[:x]}, #{point[:y]})"

Kod Açıklaması

module Example


Ruby:
module Example
  extend FFI::Library
  ffi_lib './libexample.so'

Example adında bir modül tanımlanıyor.

extend FFI::Library ile FFI modülünün özelliklerini Example modülüne dahil ediyoruz.

ffi_lib './example.so' ile libexample.so adlı paylaşımlı kütüphaneyi yüklüyoruz. Bu kütüphane, point.c dosyasından derlenmiş olmalıdır.

class Point < FFI::Struct


Ruby:
  class Point < FFI::Struct
    layout :x, :int,
           :y, :int
  end

Point adında bir sınıf tanımlanıyor ve FFI::Struct sınıfından türetiliyor.

layout metodu ile Point yapısının C tarafındaki struct Point ile aynı düzenlemeye sahip olduğunu belirtiyoruz.

attach_function


Ruby:
  attach_function :create_point, [:int, :int], Point.by_value
end

attach_function metodu ile C kütüphanesindeki create_point fonksiyonunu Ruby'de kullanılabilir hale getiriyoruz.
:create_point Ruby'deki metod ismi.

[:int, :int] fonksiyonun iki int parametre aldığını belirtir.
Point.by_value fonksiyonun Point türünde bir değer döndüreceğini belirtir.


Geriye kalan kod kısımlarında ise fonksiyonların çağırımı ve kullanımı yer alıyor.

pDHFoUY.png


FFI çok detaylı bir kütüphanedir daha fazlası için


Okuyan herkese teşekkürler.
Eline sağlık
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.