PDA

Tam Sürümünü Görmek İçin : runtime'da kod yazma


myavuzselim
29/12/2006, 22:25
Merhaba,

Bir virtual machine hakkında bir yazı okurken aklıma geldi. Mesela programınız öyle hızlı çalışmalı ki, programı hızlandırmanın en iyi yolu programın çalıştığı kodu değiştirmek olsun. Bunu yapmak ne kadar kolaydır diyerekten bir deney yaptım. Sizce şu programın çıktısı ne olur?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef int ifunc_t(int,int);

int test(int x, int y) {
return x + y + 37;
}

#define SIZE 100

int main() {
ifunc_t * func = (ifunc_t*) malloc(SIZE);
int i;
memcpy(func, test, SIZE);
char * ptr = (char*) func;
for (i=0; i<SIZE; i++) {
if (ptr[i] == 37)
ptr[i] = 100;
}
printf("func(%d,%d) = %d\n", 3, 5, func(3,5));
return 0;
}

Bu program intel linux üzerinde (2.6.17-10-386) amaçladığım çıktıyı veriyor. Tabi döngüde yaptığım şey kör dövüşü, çalışmış olmasının bir şans olduğunu biliyorum. Ayrıca hatırladığım kadarıyla her platform rastgele yerden kod çalıştırılmasına izin vermiyordu.

Şimdi bir kütüphane düşünün, getCode(func) dediğimde bana bu fonksiyonun o platformdaki assembly kodunu temsil eden bir yapı döndürsün. Ben bu yapıda istediğim değişiklikleri yapayım, sonra getFunc(code) dediğimde bana bu kodu derleyip çalişacak bir fonksiyon döndürsün. Var mıdır böyle bir sey?
Bu ne işimize yarar? Belki pek bir işe yaramaz, eğlencelik :)


serimc
29/12/2006, 23:56
Böyle bişey managed dillerde var eğer ki doğru anladıysam seni.
Codedom 'u araştırırsan run-time'da kod yazmanın ve run-time derlemenin nasıl bişey olduğunu görebilirsin.

mr_c
30/12/2006, 15:36
Vardır bu yapı, adı da yorumlayıcı iyileştirmesi. Eğlencelik de değil galiba. Yorumlanan dillerin derlenen diller kadar hızlı çalışabilceğini iddia eden firmalar tarafından üzerinde çalışılan bir konu.

Dinamik olarak kodla oynananın değişik nedenleri de var yorumlayıcılar dışında. Birkaç tane yazayım:

1-) Kodu paketleyip bellekte açmak. (Reverse engineering uygulanmasını engellemek ve daha az yer kaplayan yürütülebilirler oluşturmak. )

2-) Kodu şifrelemek dinamik olarak bellekte açmak. (Antivirüs programlarının yakalayabildiği zararlı komut yürütmelerinin taranmasını engellemek. Sezgiye dayalı ve yürütmenin simülasyonlanması gibi durumlarda biraz yetersiz kalıyor ama imza taramalarını atlatabiliyor.)

Değindiğiniz konu gerçekten çarpıcı ve üzerinde daha fazla konuşulmaya değer. İlginize teşekkürler.