Sunday, August 25, 2013


Crypte Algoritması [ANLATIMLI açık kaynak] knight



[postlink]http://net4story.blogspot.com/2013/08/crypte-algoritmas-anlatimli-ack-kaynak.html[/postlink]Merhaba Zaman Kaybetmeden Hemen Konuya Giriyorum

Knight Online Packet Şifrelemesi Haricinde İlk Giriş İşleminde Üyeliğinizin Şifresini Ayrı Bir Şifreleme İşlemine Tabi Tutar ki Hem Clientless Yapanlar İçin Biraz Daha Caydırıcı Bir Sebep Birde Üyeliğinizin Şifresini Daha Güvenli Hale Gelmesi İçin Alınmış Önlemlerden Bir Tanesidir

Ne Dir Ne Değildir :
Kullanıcı adı : aaaaaaaa
Şifre : bbbbbbbb
Olarak Girdiğimizi Düşünelim



Knight Online Burada OK Tuşuna Basınca Bir Takım İşlemden Sonra Bu Şifreleme İşlemini Devreye Sokuyor Ancak Şifrelemeyi Açmak İçin Bir Function Mevcut Değil Exe'nin İçinde En Azından Ben Bulmak İçin Çabalamadım Yazmak İsteyen Şifreleme Function'undan Açma İşlemini 'de Yapabileceğini Düşünüyorum Neyse Konuya Dönelim

Resmi orjinal boyutlariyla görmek için tiklayiniz. Orjinal resim : 769x171 dir.

Burada Knight Şifreyi İşlem'e Almak için Stack'a Attığını Görebilirsiniz.
Neden Stack'a Atılıyor Diye Düşüneceksiniz.

PUSH EAX
PUSH EBX
CALL contonso

contonso İsimli bir functionu'muz olduğunu düşünürsek onu çağıran 2 parametre olduğunu görebiliriz.
PUSH İşlemlerinde değişken stack'a Atılır ki functionu Çağırdığınız zaman function Bilgileri Stack'tan okuyabilsin tabi bu function'u çağırma tiplerine göre değişir
__stdcall , __fastcall ,__thiscall ... Hepsinin Temelde yaptığı İşlem aynıdır ama pratikte biraz farklı oluyor tabi...

şimdi Şifreleme tarafına dönelim hepsini tek tek foto'sunu Çekmek İstemedim karışmaması için

Resmi orjinal boyutlariyla görmek için tiklayiniz. Orjinal resim : 706x87 dir.

burada ise Şifremiz Şifrelendi
Açık Şifre : bbbbbbbbbbb
Kapalı Şifre : 6X22Q216X22Q21GCC6TZO
olarak çıkarttı şu an bizi ilgilendiren kapalı şifreyi nasıl çözdüğü değil çıkan sonuç bu sonucu bulduktan sonra biraz analiz ile rahat bir şekilde functionu çözebilirsiniz ...

Bu Arada funchash değişkeni yabancı geleceğini düşündüğüm için birazda ondan bahsedeyim

funchash:

Bütün functionlar temelde binary olduğu için onları esnetip istediğiniz şekilde kullanabilirsiniz tabi hash olarak nasıl alacağınızı bilmeniz gerekir bütün functionlar biraz editleme ile hash olarak çok rahat kullanılabilir avantajı ise çözmenize gerek kalmaz zaten o function degişkendede olsa memoryde tutulacağı için istediğiniz şekilde çağırabilirsiniz

ÖRNEK

Kod:
push ebp
mov ebp,esp
mov eax,[ebp+0x08]
add eax,[ebp+0x0c]
pop ebp
ret
bu function bellekte bu şekilde tutulur
PHP- Kodu:
55 8B EC 8B 45 08 03 45 0C 5D C3 

Bu Şekilde Dönürtürdüğümüz zaman
Kod:
BYTE toplahash[] = {
0x55 ,0x8B ,0xEC ,0x8B ,0x45 ,0x08 ,0x03 ,0x45 ,0x0C ,0x5D ,0xC3
};
type'ni Asm functiondan anlaşıldığı gibi 2 adet DWORD değer alıyor Yani
Kod:
typedef int topla(int val1,int val2);
bu şekilde toplahash'ın typeni göstererek istediğimiz şekilde çağrabiliriz

oda şöyle bişi oluyor

Kod:
topla *contonso = (topla*)toplahash;
int sonuc = (*contonso)(5,10);
şeklinde kullanabilirsiniz şimdi aşşagıdaki kodları daha rahat anlayabilirsiniz



-----OPEN SOURCE FOREVER----

Kod:
 CLoginCrypter *LoginCrypter = new CLoginCrypter();
 char *cryp = new char[100];
 memset(cryp,0,100);
 LoginCrypter->MainFunction((int)mainClientless->s_szPassWord.c_str(),0x3e8,(int)cryp);
 mainClientless->s_szPassWord = LoginCrypter->data ;

LoginCrypter.cpp
Kod:
//---------------------------------------------------------------------------

#pragma hdrstop

#include "LoginCrypter.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
DWORD Key =0x06901E482;
BYTE funchash[] = {
0x81,0xEC,0x00,0x01,0x00,0x00,0x53,0x56,0xBE,0x16,0x00,0x00,0x00,0xB8,0x05,0x00,0x00,0x00,0x89,0x74,0x24,0x78,0x89,0xB4,0x24,0xA0,0x00,0x00,0x00,0x8B,0xB4,0x24,
0x0C,0x01,0x00,0x00,0x57,0xBB,0x03,0x00,0x00,0x00,0xBF,0x07,0x00,0x00,0x00,0xBA,0x01,0x00,0x00,0x00,0xB9,0x19,0x00,0x00,0x00,0x89,0x84,0x24,0x88,0x00,0x00,0x00,
0x89,0x84,0x24,0xCC,0x00,0x00,0x00,0x33,0xC0,0x85,0xF6,0xC7,0x44,0x24,0x0C,0x1A,0x00,0x00,0x00,0xC7,0x44,0x24,0x10,0x1F,0x00,0x00,0x00,0xC7,0x44,0x24,0x14,0x11,
0x00,0x00,0x00,0xC7,0x44,0x24,0x18,0x0A,0x00,0x00,0x00,0xC7,0x44,0x24,0x1C,0x1E,0x00,0x00,0x00,0xC7,0x44,0x24,0x20,0x10,0x00,0x00,0x00,0xC7,0x44,0x24,0x24,0x18,
0x00,0x00,0x00,0xC7,0x44,0x24,0x28,0x02,0x00,0x00,0x00,0xC7,0x44,0x24,0x2C,0x1D,0x00,0x00,0x00,0xC7,0x44,0x24,0x30,0x08,0x00,0x00,0x00,0xC7,0x44,0x24,0x34,0x14,
0x00,0x00,0x00,0xC7,0x44,0x24,0x38,0x0F,0x00,0x00,0x00,0xC7,0x44,0x24,0x3C,0x1C,0x00,0x00,0x00,0xC7,0x44,0x24,0x40,0x0B,0x00,0x00,0x00,0xC7,0x44,0x24,0x44,0x0D,
0x00,0x00,0x00,0xC7,0x44,0x24,0x48,0x04,0x00,0x00,0x00,0xC7,0x44,0x24,0x4C,0x13,0x00,0x00,0x00,0xC7,0x44,0x24,0x50,0x17,0x00,0x00,0x00,0xC7,0x44,0x24,0x54,0x00,
0x00,0x00,0x00,0xC7,0x44,0x24,0x58,0x0C,0x00,0x00,0x00,0xC7,0x44,0x24,0x5C,0x0E,0x00,0x00,0x00,0xC7,0x44,0x24,0x60,0x1B,0x00,0x00,0x00,0xC7,0x44,0x24,0x64,0x06,
0x00,0x00,0x00,0xC7,0x44,0x24,0x68,0x12,0x00,0x00,0x00,0xC7,0x44,0x24,0x6C,0x15,0x00,0x00,0x00,0x89,0x5C,0x24,0x70,0xC7,0x44,0x24,0x74,0x09,0x00,0x00,0x00,0x89,
0x7C,0x24,0x78,0x89,0x94,0x24,0x80,0x00,0x00,0x00,0x89,0x8C,0x24,0x84,0x00,0x00,0x00,0xC7,0x84,0x24,0x8C,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0xC7,0x84,0x24,0x90,
0x00,0x00,0x00,0x1D,0x00,0x00,0x00,0x89,0xBC,0x24,0x94,0x00,0x00,0x00,0x89,0x8C,0x24,0x98,0x00,0x00,0x00,0xC7,0x84,0x24,0x9C,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,
0xC7,0x84,0x24,0xA0,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0xC7,0x84,0x24,0xA8,0x00,0x00,0x00,0x1B,0x00,0x00,0x00,0xC7,0x84,0x24,0xAC,0x00,0x00,0x00,0x09,0x00,0x00,
0x00,0xC7,0x84,0x24,0xB0,0x00,0x00,0x00,0x1A,0x00,0x00,0x00,0x89,0x9C,0x24,0xB4,0x00,0x00,0x00,0xC7,0x84,0x24,0xB8,0x00,0x00,0x00,0x0D,0x00,0x00,0x00,0xC7,0x84,
0x24,0xBC,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0xC7,0x84,0x24,0xC0,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0xC7,0x84,0x24,0xC4,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0xC7,
0x84,0x24,0xC8,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0xC7,0x84,0x24,0xD0,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xC7,0x84,0x24,0xD4,0x00,0x00,0x00,0x17,0x00,0x00,0x00,
0xC7,0x84,0x24,0xD8,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xC7,0x84,0x24,0xDC,0x00,0x00,0x00,0x0A,0x00,0x00,0x00,0xC7,0x84,0x24,0xE0,0x00,0x00,0x00,0x18,0x00,0x00,
0x00,0xC7,0x84,0x24,0xE4,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0xC7,0x84,0x24,0xE8,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0xC7,0x84,0x24,0xEC,0x00,0x00,0x00,0x06,0x00,
0x00,0x00,0xC7,0x84,0x24,0xF0,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0xC7,0x84,0x24,0xF4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x84,0x24,0xF8,0x00,0x00,0x00,0x15,
0x00,0x00,0x00,0xC7,0x84,0x24,0xFC,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0xC7,0x84,0x24,0x00,0x01,0x00,0x00,0x08,0x00,0x00,0x00,0xC7,0x84,0x24,0x04,0x01,0x00,0x00,
0x04,0x00,0x00,0x00,0x89,0x94,0x24,0x08,0x01,0x00,0x00,0x76,0x34,0x8A,0x9C,0x24,0x14,0x01,0x00,0x00,0x33,0xFF,0x8B,0xCE,0x83,0xE1,0xFE,0x8B,0xD6,0x2B,0xD1,0xD1,
0xEE,0x85,0xD2,0x74,0x15,0x84,0xDB,0x74,0x06,0x8B,0x4C,0x3C,0x0C,0xEB,0x07,0x8B,0x8C,0x3C,0x8C,0x00,0x00,0x00,0xD3,0xE2,0x03,0xC2,0x83,0xC7,0x04,0x85,0xF6,0x77,
0xD5,0x5F,0x5E,0x5B,0x81,0xC4,0x00,0x01,0x00,0x00,0xC2,0x08,0x00
};
typedef int __stdcall buftype(unsigned int a1, char a2);
int __stdcall CLoginCrypter::MainFunction(int sifrelenecekmetin, int a2/*0x3e8*/, int cikti/*şifrelenen metin*/)
{
  buftype *bftype =  (buftype*)funchash;
  int a1 = sifrelenecekmetin;  int a3 = cikti;  unsigned int v3;  int v4;  char v5;  int *v6;  char v7;  int *v8;
  char v9;  int v10;   char *v11 = new char[1000];  int v12;  signed int result;  int v14;  char v15;  int v16;
  int v17[64];  unsigned int v18;  v18 = (unsigned int)&v16 ^ Key;  v3 = 0;  v16 = a3;  memset(v17, 0, 256);  v4 = a1;
  do
  {
 v5 = *(BYTE *)v4;
 *((BYTE *)v17 + v4 - a1) = *(BYTE *)v4;
 ++v4;
  }
  while ( v5 );
  v6 = v17;
  do
  {
 v7 = *(BYTE *)v6;
 v6 = (int *)((char *)v6 + 1);
  }
 while ( v7 );
  v8 = v17;
  do
  {
 v9 = *(BYTE *)v8;
 v8 = (int *)((char *)v8 + 1);
  }
  while ( v9 );
  v10 = (char *)v8 - ((char *)v17 + 1);
  if ( (signed int)((char *)v8 - ((char *)v17 + 1)) > 0 )
  {
 v11 = (char*)data;
 do
 {
   v12 = (*bftype)((DWORD)a2 + v17[v3], 1);
   sub_847810(v12, (char*)v11);
   ++v3;
   v11 += 7;
 }
 while ( (signed int)(v3 * 4) < v10 );
  }
  memcpy((void*)cikti,(void*)data,(int)v9);
  return result;
}


char *a0123456789ab_1;
char *v9;
int __stdcall CLoginCrypter::sub_847810(unsigned int a1, char* a2)
{
 a0123456789ab_1 = new char[37] ;
 v9 =new char[0x24u];
 memcpy(a0123456789ab_1,"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",37);
 unsigned int v2,v3,v5,v7,v11;
 char v4,v6,v10;
 int result;

 v11 = (unsigned int)&v9 ^ Key;
 memcpy(v9, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ", 0x24u);
 v10 = a0123456789ab_1[36];
 v2 = a1 / 0x24 / 0x24;
 a2[0] = *(v9 + a1 % 0x24);
 v3 = v2;
 v2 /= 0x24u;
 *(BYTE *)(a2 + 1) = *(v9 + a1 / 0x24 % 0x24);
 v4 = *(v9 + v3 - 36 * v2);
 v5 = v2;
 v2 /= 0x24u;
 *(BYTE *)(a2 + 2) = v4;
 v6 = *(v9 + v5 - 36 * v2);
 v7 = v2;
 v2 /= 0x24u;
 *(BYTE *)(a2 + 3) = v6;
 *(BYTE *)(a2 + 4) = *(v9 + v7 - 36 * v2);
 *(BYTE *)(a2 + 5) = *(v9 + v2 % 0x24);
 result = (unsigned __int8)*(v9 + v2 / 0x24 % 0x24);
 *(BYTE *)(a2 + 6) = result;
 *(BYTE *)(a2 + 7) = 0;
   return result;
}
LoginCrypter.h
Kod:
//---------------------------------------------------------------------------

#ifndef LoginCrypterH
#define LoginCrypterH
//---------------------------------------------------------------------------
#include <windows.h>
class CLoginCrypter
{
protected:

private:
 int __stdcall sub_847810(unsigned int a1, char* a2);
public:
 int __stdcall MainFunction(int sifrelenecekmetin, int a2/*0x3e8*/, int cikti/*şifrelenen metin*/);
 char data[1000];
};
#endif

0 yorum:

Post a Comment