Selamlar, Hemen konuya girmek istiyorum. qmail-queue.c dosyasi initialize edilidigi zaman 0 file descriptordan mailin body sini aliyor ve 1 file descriptordan da envelope bilgisini aliyor. Ve envelope bilgisi kotrolu dogru ise mail qmail.queue.c sayesinde outgoing queue ye ekleniyor. Fakat envelope ya da daha baska internal kaynakli hata var ise, ornegin insufficient memory, e.g. bazi die numaralari ile _exit(exit_no); ile qmail-queue.c den cikiliyor. Boylece mail outgoing queue ye eklenmiyor ve hata loglaniyor. Klasik bir virus scanning olayi virus kodunun specific imzasi ( ben buna imza diyorum, aslinda anlatmak istedigim virus kodunun virus oldugunu ispatlayan byte zinciri) nin optimize bir sistem icinde degerlendirip eger mevcut virus database icinde bulunan bir virus ise, herhangi bir islem yapmasidir. Bu islemlerde mailin recipientlere gonderilmemesi, loglanmasi, yada alicilara bu mail virusludur uyarisi gelmesi, vs,vs. Bu iki olayi baglamak istiyorum. Simdi genelde inceledigim qmail virus scannerler qmail-queue.c dosyasini kullaniyorlar. Yani yeni bir scanner binary ile substitude edip, yeni gelen qmail-queue dosyasi cagriliyor. Sonra asil qmail-queue spawn ediliyor. qmail-queue beklemede iken, baska bir binary spawn ediliyor ve piping kullanilarak 0 dan gelen mail yeni spawn edilen binary tarafindan scan ediliyor. Ve eger bir virus bulundu ise orijinal qmail-queue ye hata kode lu bir deger donuyor piping ile. Eger mailde bir problem yoksa, qmail-queue nin 0 file desc den orijinal mail ve 1 nolu desc. den envelope degeri gonderilip mail islemi tamamlanmis olur. Simdi bazi sitelerde mail arsivleri inceledim. Biz yeni gelen qmail-queue de orijinal qmail-queue yi spawn ettigimiz zamandan once, orjinal qmail-queue ile haberlesmemiz icin, orjinal qmail-queue nin 0 inci ve 1 inci file desc. leri icin piping kullanmamiz gerekiyor. Yani orijinal qmail-queue ile ayni anda spawn edilen bin. ile orijinal qmail-queue haberlesmesi icin.... ----> qmail-queue(yeni) -- spawn -----> scanner -- -- spawn -----> qmail-queue(orjinal) simdi benim yapmaya calistigim yeni qmail-queue olusturmak ve onun icinde, 0 ve 1 file desc. leri child processler icin kullanilmak uzre pipe fdlerine iliskilendirmek... mesela, ornek int fd[2]; int pid; if(pipe(fd) != 0) perror("pipe fail"), exit(-1); if((pid = fork()) != 0) write(fd[1], "deneme msg", 11); else { execve("/usr/sbin/qmail-queue-original","qmail-queue-original", 0,0); } yukarida child icinde ben gercek qmail-queue yi calistiriyorum. ve qmail-queue-original a 0 dan data aktamam gerekiyor. ve bunu kesinlikle yani 0 inci fd yi kesinlikle fd[0] ile iliskilendirmem gerekiyor ki parent te fd[1] e yazilan bir data pipe araciligi ile fd[0] a aktarilmali ve ayni zamanda fd[0], 0 oldugu icin calisan programin 0. fd. sinden input olarak alinmali... bunun dup ve dup2 syscall larla yapilacagini bir yerde okudum close(0); dup2(0, fd[0]); gibi ama bir sey olmadi :) yorumlarinizi alabilir miyim? iyi calismalar.
Attachment:
pgpSjoodeKOB9.pgp
Description: PGP signature