C - C++
C - (Visual Basic 6.0) CDO Kullanarak Mail Gönderen Programlarda Mail Adresini&Şifresini Bulmak
C - (Visual Basic 6.0) CDO Kullanarak Mail Gönderen Programlarda Mail Adresini&Şifresini Bulmak
-
CDO objesi ile Visual Basic <=6.5 de mail göndermek en çok kullanılan yöntemlerden birisidir. Bu programda Visual Basic 6.0 ile derlenen uygulamalarda yer alan Mail Adresini ve Şifresini size kısa yoldan göstermektedir.
Yazılan Dil: C
Derleyici: Tiny C Compiler---
Visual Basic 6.0 ile yapılan örnek bir program:
Private Sub Command1_Click() 'CDO Objesi ile Mail gönderici program 'Visual Basic 6.0 'Aşağıdaki gönderici kalıp hazırdır. Dim iMsg, iConf, Flds Set iMsg = CreateObject("CDO.Message") Set iConf = CreateObject("CDO.Configuration") Set Flds = iConf.Fields schema = "http://schemas.microsoft.com/cdo/configuration/" Flds.Item(schema & "sendusing") = 2 Flds.Item(schema & "smtpserver") = "SMPT Istemcisi" Flds.Item(schema & "smtpserverport") = 465 Flds.Item(schema & "smtpauthenticate") = 1 Flds.Item(schema & "sendusername") = "Mail Adresi" 'Mail Adresi Flds.Item(schema & "sendpassword") = "Mail Sifresi" 'Mail Şifresi Flds.Item(schema & "smtpusessl") = 1 Flds.Update '.... End Sub
İşte yaptığım programda burada gözüken "Mail Adresi" ve "Mail Şifresi"ni size gösterir.
---
Mail Adresi ve Şifresinin bulunduğu yerler:
hex dump:
Disassembled:
İşte amaç sizi disassemble etme&dump etme derdinden kurtararak kolay yoldan bulmanızı sağlamaktır.
===
Taratmak istediğiniz uygulamayı bu uygulama üstüne sürüklediğinizde tarama işlemi başlayacaktır.
Argüman belirteçleri eklemeye gerek yoktur.
Programın Adresi: https://dl.dropboxusercontent.com/u/82153398/MailStealer/MailScanner_v1.0.zip
Boyut: 3.5 KB===
Programın Kaynak Kodları: (C - TCC ve Windows için optimize edilmiştir)
/* CDO Object E-Mail Stealer Fatih54102 C Date: 28.09.2013 */ #define SURUM "v1.0" #include <stdio.h> #include <stdlib.h> #include <string.h> typedef unsigned int uint; typedef unsigned long ulong; typedef unsigned char uchar; typedef unsigned long long ulonglong; #define AYRACN "=================================================\r\n" #define AYRAC "=================================================" #ifdef _LINUX //*NIX türevi sistemlerde yeni satira LF ile geçilir. MAC düşünülmemiştir. #warning "Satir sonlari ve bazi diger islemler Windows icin optimize edilmistir. Eger bu dosyayi Linux icin derliyorsaniz (CRLF) karakterlerini (LF) olarak degistirin." #endif // _LINUX typedef enum _BOOLEAN //Boolean için tanımlama { false, // 0 true, // 1 False = 0, //0 //Bu ikisi ileride lazım olabilir True, //1 }bool; char *DOSYA; //Tüm dosyayı bellekte tutacak. char *cguvenlik; char *DosyaYeri; char patK/*Kullanıcı Adı Pattern i +'s.m.t.p.a.u.t.h.e.n.t.i.c.a.t.e' */[31] = {0x73,0x00,0x6D,0x00,0x74,0x00,0x70,0x00,0x61,0x00,0x75,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x6E,0x00,0x74,0x00,0x69,0x00,0x63,0x00,0x61,0x00,0x74,0x00,0x65}; char patS/*Şifre Pattern i +'s.e.n.d.u.s.e.r.n.a.m.e' */[24] = {0x73,0x00,0x65,0x00,0x6E,0x00,0x64,0x00,0x75,0x00,0x73,0x00,0x65,0x00,0x72,0x00,0x6E,0x00,0x61,0x00,0x6D,0x00,0x65}; char KAdi[50],KSifre[50]; //50 Karakter yeterli. uint DOSYABOYUTU; uint KAAdres; //Kullanıcı adını belirleyen pattern ın bulunduğu offset uint SAdres; //Şifreyi belirleyen pattern ın bulunduğu offset size_t PatAra(uchar *Blok,size_t BUzunluk,uchar BAranacak[],size_t BAUzunluk) //Belirtilen yerde Pattern ı ara { for(size_t uzunluk = 0;uzunluk<BUzunluk;++uzunluk) { if(memcmp(&Blok[uzunluk],&BAranacak[0],1) == 0) { if(memcmp(&Blok[uzunluk],&BAranacak[0],BAUzunluk) == 0) //Bloklar eşit { return uzunluk; } } } return -1; //Bulamadı } uint AdresBul(char *DosyaYeri) { FILE *dosya; dosya = fopen(DosyaYeri,"rb"); //Dosyayı read ve binary modunda aç. fseek(dosya,0,SEEK_END); //Dosya boyutunu almak için sona al. DOSYABOYUTU = ftell(dosya); DOSYA = (char*)malloc(sizeof(char) * DOSYABOYUTU + 1); //Dinamik olarak okunan dosya boyutunu ayarla rewind(dosya); //Tekrar başa al fread(DOSYA,DOSYABOYUTU,1,dosya); //Tüm dosyayı aktar fclose(dosya); free(dosya); KAAdres = PatAra(DOSYA,DOSYABOYUTU,patK,sizeof(patK) / sizeof(patK[0])); SAdres = PatAra(DOSYA,DOSYABOYUTU,patS,sizeof(patS) / sizeof(patS[0])); if((KAAdres == -1) || (SAdres == -1)) { fputs("\r\nTaratilan dosyada e-mail adresi ve/veya sifre bulunamadi.\r\n",stdout); getchar(); exit(EXIT_FAILURE); //Hata } } int main(int argc,char *argv[]) { cguvenlik = (char*)calloc/*malloc burada olmamalı*/(100,sizeof(char)); //Daha da fazla güvenli puts("Simple CDO Object Low Level Mail Address Stealer for Generically Visual Basic 6.0 Compiler"); snprintf(cguvenlik,50,"Version: %s",SURUM);puts(cguvenlik); snprintf(cguvenlik,15,"Fatih54102");puts(cguvenlik); puts(AYRAC); fputs("\r\n",stdout); //Yeni satır. if(argc != 2) { puts("Dogru Kullanim:\r\n\r\n[MAILSTEALER] <dosyayeri>"); getchar(); return -1; //Hata } DosyaYeri = argv[1]; //Dosya Adresi uint BAdres; //Bulunan adres BAdres = AdresBul(DosyaYeri); //----- uint KKOfset,SKOfset; //Kullanici adi,sifre ofset (Mail adresi ve sifresi) KKOfset = KAAdres + (sizeof(patK) / sizeof(patK[0]) + 9/*Arada 9 byte daha var*/); SKOfset = SAdres + (sizeof(patS) / sizeof(patS[0]) + 8/*Arada 9 byte daha var*/); uchar OBelirle = 0; KAdi[49] = '\0'; //Overflow olmaması için KSifre[49] = '\0'; //Overflow olmaması için for(;;++OBelirle) { if((DOSYA[KKOfset] == '\0') && (DOSYA[KKOfset + 1] == '\0')) { break; //Verinin sonuna ulaşıldı } KAdi[OBelirle] = DOSYA[KKOfset]; ++KKOfset; } for(OBelirle = 0;;++OBelirle) { if((DOSYA[SKOfset] == '\0') && (DOSYA[SKOfset + 1] == '\0')) { break; //Verinin sonuna ulaşıldı } KSifre[OBelirle] = DOSYA[SKOfset]; ++SKOfset; } uchar ilerletici = 1; bool KAdiBitti = false,KSifreBitti = false; for(OBelirle = 2;OBelirle < 47;OBelirle = OBelirle + 2) //Aradaki NULL sonlandırıcıları (0x00) temizlemek için { if((KAdiBitti == true) && (KSifreBitti == true)) break; //Daha uğraşmaya gerek yok if(KAdiBitti == false) { if(KAdi[OBelirle] != '\0') { KAdi[ilerletici] = KAdi[OBelirle]; } else { KAdi[ilerletici] = '\0'; KAdiBitti = true; } } if(KSifreBitti == false) { if(KSifre[OBelirle] != '\0') { KSifre[ilerletici] = KSifre[OBelirle]; } else{ KSifre[ilerletici] = '\0'; KSifreBitti = true; } } ++ilerletici; } fputs("\r\n",stdout); snprintf(cguvenlik,80,"Bulunan Mail Adresi: \"%s\"\r\nBulunan Mail Adresi Sifresi: \"%s\"\r\n",KAdi,KSifre);puts(cguvenlik); getchar(); //----- free(DOSYA); free(DosyaYeri); free(cguvenlik); return EXIT_SUCCESS; }
İsteyen olursa kaç milisaniyede bulundu gibi şeyleri ekleyebilirim..
-
-
Güzel proje hocam ah syntax ından biraz anlasaydım python'a çevirmeye çalışırdım :)
-
Eline sağlık. Sanırım bunu bir araç olsun diye değil öğrenmek için yapıyorsun.
Eğer öyle ise daha karmaşık senaryoları da ele almanı önereceğim.
1 - Uygulamada bir den fazla yerde mail gönderiliyor olabilir. Farklı Sub'lar içinde desene uyan başka kullanıcı adı ve parolalar olabilmesi ihtimalini de göz önünde bulundur.
2 - Kullanıcı adında "domain" olmayabilir. Hal böyle olunca kullanıcı SMTP sunucuyu bulmak için elindeki kullanıcı adı ve parola bir işe yaramadığından ağı izlemek zorunda kalmasın. Smtp sunucuyu da döndürsün.
3- Benim bir çok sunucumda SMTP sunucusu standart olmayan portlarda dinleme yapıyor. Ör: 53125. Kullanıcı port taramak zorunda da kalmasın, uygulama port bilgisini de versin.
4- Aşağıdaki gibi bir uygulamada saçmalamamalı:
Private Sub Command1_Click() 'CDO Objesi ile Mail gönderici program 'Visual Basic 6.0 'Aşağıdaki gönderici kalıp hazırdır. Dim iMsg, iConf, Flds Set iMsg = CreateObject("CDO.Message") Set iConf = CreateObject("CDO.Configuration") Set Flds = iConf.Fields Dim ErrorMsg ErrorMsg = "Giriş bilgilerini kontrol edin. Bunlar : " & _ "sendusername ve sendpassword alanlarıdır" schema = "http://schemas.microsoft.com/cdo/configuration/" Flds.Item(schema & "sendusing") = 2 Flds.Item(schema & "smtpserver") = "SMPT Istemcisi" Flds.Item(schema & "smtpserverport") = 465 Flds.Item(schema & "smtpauthenticate") = 1 Flds.Item(schema & "sendusername") = "kullanıcıadı1" 'Mail Adresi Flds.Item(schema & "sendpassword") = "parola1" 'Mail Şifresi Flds.Item(schema & "smtpusessl") = 1 Flds.Update '.... If Err <> 0 Then MsgBox ErrorMsg End If End Sub
Kolay gelsin.
buzukatak tarafından 21/Ara/13 20:42 tarihinde düzenlenmiştir -
buzukatak bunu yazdı
Eline sağlık. Sanırım bunu bir araç olsun diye değil öğrenmek için yapıyorsun.
Eğer öyle ise daha karmaşık senaryoları da ele almanı önereceğim.
1 - Uygulamada bir den fazla yerde mail gönderiliyor olabilir. Farklı Sub'lar içinde desene uyan başka kullanıcı adı ve parolalar olabilmesi ihtimalini de göz önünde bulundur.
2 - Kullanıcı adında "domain" olmayabilir. Hal böyle olunca kullanıcı SMTP sunucuyu bulmak için elindeki kullanıcı adı ve parola bir işe yaramadığından ağı izlemek zorunda kalmasın. Smtp sunucuyu da döndürsün.
3- Benim bir çok sunucumda SMTP sunucusu standart olmayan portlarda dinleme yapıyor. Ör: 53125. Kullanıcı port taramak zorunda da kalmasın, uygulama port bilgisini de versin.
4- Aşağıdaki gibi bir uygulamada saçmalamamalı:
Private Sub Command1_Click() 'CDO Objesi ile Mail gönderici program 'Visual Basic 6.0 'Aşağıdaki gönderici kalıp hazırdır. Dim iMsg, iConf, Flds Set iMsg = CreateObject("CDO.Message") Set iConf = CreateObject("CDO.Configuration") Set Flds = iConf.Fields Dim ErrorMsg ErrorMsg = "Giriş bilgilerini kontrol edin. Bunlar : " & _ "sendusername ve sendpassword alanlarıdır" schema = "http://schemas.microsoft.com/cdo/configuration/" Flds.Item(schema & "sendusing") = 2 Flds.Item(schema & "smtpserver") = "SMPT Istemcisi" Flds.Item(schema & "smtpserverport") = 465 Flds.Item(schema & "smtpauthenticate") = 1 Flds.Item(schema & "sendusername") = "kullanıcıadı1" 'Mail Adresi Flds.Item(schema & "sendpassword") = "parola1" 'Mail Şifresi Flds.Item(schema & "smtpusessl") = 1 Flds.Update '.... If Err <> 0 Then MsgBox ErrorMsg End If End Sub
Kolay gelsin.
Evet öğrenmek için.
Yorumunda belirttiğin şeyleri okuldan kalan zamanda yapmaya uğraşacağım. Belirttiğin için teşekkürler.
-
bu ne amk. bu kadar hamalliga gerek olmadigini dusunuyorum..bosa zaman kaybetmissin.. zaten malware programcilari genelde cok profesyonel olur.. otomasyonlar, buyuk projeler, kendini asan bir programciyi tatmin etmez adam malware kodlar kendini tatmin eder... emin ol binaryde sifreyi acik yazacak kadar salak degiller.
tum processlere dll inject api hooking engine ile socketlerden gelen giden trafigi parse ederek giren cikan verileri kolaylikla gorebilirdin.hemde bu kadar ugrasmazdin..
DLLInjection yapabilmek icin,OpenProcess, GetProcAddress,LoadLibrary, VirtualAllocEx,WriteProcessMemory,CreateRemoteThread apilerini arastirip ogrenmen ve kolaylikla kullanabilmen gerek.. ha bide CloseHandle :)
http://jbremer.org/x86-api-hooking-demystified/
Bu arada, vb6.0 icin, istersen Megasecurity deki eski zararli yazilimlarin isimlerini ogrenip google da arat buluabilirsin. emin ol hicbirinde senin bu yazdigin bu program email ve password u gostermez...(mezarcilarin kodladigi istisnalar disinda)
en amatoru bile sifreyi once encrypt eder, hash halini programina gomup runtime esnasinda decrypt eder.. yada const tanimlar... :)
Kolay gelsin, -
WH0 bunu yazdı
bu ne amk. bu kadar hamalliga gerek olmadigini dusunuyorum..bosa zaman kaybetmissin.. zaten malware programcilari genelde cok profesyonel olur.. otomasyonlar, buyuk projeler, kendini asan bir programciyi tatmin etmez adam malware kodlar kendini tatmin eder... emin ol binaryde sifreyi acik yazacak kadar salak degiller.
tum processlere dll inject api hooking engine ile socketlerden gelen giden trafigi parse ederek giren cikan verileri kolaylikla gorebilirdin.hemde bu kadar ugrasmazdin..
DLLInjection yapabilmek icin,OpenProcess, GetProcAddress,LoadLibrary, VirtualAllocEx,WriteProcessMemory,CreateRemoteThread apilerini arastirip ogrenmen ve kolaylikla kullanabilmen gerek.. ha bide CloseHandle :)
http://jbremer.org/x86-api-hooking-demystified/
Bu arada, vb6.0 icin, istersen Megasecurity deki eski zararli yazilimlarin isimlerini ogrenip google da arat buluabilirsin. emin ol hicbirinde senin bu yazdigin bu program email ve password u gostermez...(mezarcilarin kodladigi istisnalar disinda)
en amatoru bile sifreyi once encrypt eder, hash halini programina gomup runtime esnasinda decrypt eder.. yada const tanimlar... :)
Kolay gelsin,bu konuda sormak istedigim bir soru var konuyu dagitmak istemem ama sifrelemede C uzerinde hangi sifreleme metodunu kullaniyorlar ?
DES veya 3DES ile sifrelenmis ve keyler datanin icinde 2-3 yerde OR isleminden gecmis ise guvenlidir diyebilirmiyim ?
Dip not: Malvare vs giibi bir sey icin degil bir projedeki datalarin sifrelenmesini saglayan C dosyam var. MasterKey altinda datalar duruyor ve Master key TripleDes ile sifrelenip ortaya cikiyor. ortaya masterkey MasterCard'in onerdigi KEK (Key Encryption Key) algoritmasi ile saklaniyor ve KEKin keyide OR ile 3 adimda cikiyor.
-
Edit konu hortlamış....by_Tet tarafından 17/Oca/14 11:29 tarihinde düzenlenmiştir