.[ ČeskéHry.cz ].
Konverze RAW dat ze serveru

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Farrell



Založen: 18. 10. 2012
Příspěvky: 5

PříspěvekZaslal: 18. říjen 2012, 05:51:02    Předmět: Konverze RAW dat ze serveru Odpovědět s citátem

Není to přímo o vývoji, nýbrž je to modifikace hry Vietcong, na které pracuji. Výsledkem má být sada nástrojů pro správce serverů pro usnadnění práce jak adminů, tak i hráčů.

Jsem zatím na začátku, a už se objevují zdálnivě neřešitelné problémy. Vytvořil jsem si DirectPlay hook pro strukturu IDirectPlay8Server, kde pro rozluštění základní komunikace vypisuju data odesílaná hráčům promocí IDirectPlay8Server::toSend a vypisuju si data v hexadecimálním tvaru.
Jeden z klíčových prvků tohoto rozšíření je přebírání příkazů přímo z chatu. Např. /pm hráč zpráva, nebo /login heslo. Také budu některé zprávy zachytávat, např. login, protože heslo hráče nemusí vidět všichni. Ale prioritou toho je, abych tu zprávu vůbec přečetl a to se mi nedaří.
Jeden chlápek nickem Brchi dělal něco podobného, a říkal mi, že to je BitStream (o kterém jsem si četl, ale i tak tu koverzi samotnou nechápu, jelikož moc jsem o tom nenašel), a že samotný text je 7Bit ASCII. Dále zpráva obsahuje PlayerID, MessageID, MessageType. Co jsem z něho vytáhl je, že PlayerID je 12Bit INT iirc(?).

Tudíž je to pravděpodobně struktura o 4 prvcích(pořadí jsem odhadl):
kód:
PlayerID(INT12), MessageType(?), Message(7b ASCII), MessageID


Pro konverzi z 7Bit ASCII do 8Bit jsem si napsal jednoduchou funkci...
input - pointer na pole s daty
size - velikost pole
NewSize - velikost pole po konvertovani
return - vraci pole BYTE o velikosti NewSize

kód:
BYTE* Convert7BIT( BYTE *input, int size, int &NewSize )
{
   NewSize = (size*8)/7;
   if(NewSize < (float)(size*8)/7)
      NewSize++;

   BYTE *output = new BYTE[NewSize+1];

   for(int i=0;i<size;i++)
      output[i] = input[i];

   for(int pos=0; pos < NewSize; pos++)
   {

      BYTE puvodni = output[pos];
      BYTE prebyvajici;
      
      for( int xpos=pos+1; xpos < NewCount; xpos++)
      {
         if(getBit(7,puvodni))
            prebyvajici = 128;
         else
            prebyvajici = 0;

         puvodni = output[xpos];

         output[xpos] = (output[xpos] >> 1) | prebyvajici;
      }
      output[pos] = output[pos] >> 1;
   }

   return output;
}



Teď se podíváme přímo na data...

Několikrát po sobě poslané A - L (v každé zprávě ABCDEFGHIJKL), PlayerID je 263
kód:
97 10 23 7 41 50 38 24 16 8d 47 64 52 b9 64 2 8
97 10 23 7 41 50 38 24 16 8d 47 64 52 b9 64 2 6
97 10 23 7 41 50 38 24 16 8d 47 64 52 b9 64 2 8c
97 10 23 7 41 50 38 24 16 8d 47 64 52 b9 64 2 8
-----------------------------------------------------------------
Binárně(první řádek):
100101110001000000100011000001110100000101010000001110000010010000010110100011010100011101100100010100101011100101100100
------------------
ABCDEFGHIJKL (7BIT ASCII):
100000110000101000011100010010001011000110100011110010001001001100101010010111001100
 


Jak vidíte, zpráva je v datech k nenalezení. Tudíž vás prosím o pomoc, zda-li nedělám něco špatně, nebo jsem na něco zapomněl.
Za vyřešení problému jsem ochotný nabídnout protislužbu, jsem PHP, JS a XHTML kodér, a 2D/3D grafik.
Děkuji za případné reakce.
_________________
C++, PHP, JS, XHTML, CSS, 3DsMax, Photoshop
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
manutara



Založen: 02. 01. 2012
Příspěvky: 81
Bydliště: Kosice SVK

PříspěvekZaslal: 18. říjen 2012, 11:21:12    Předmět: zdravim Odpovědět s citátem

zdravim,

nemohol by si prilozit, zdroj dat?? povodne data z ktorych chces konvertovat
na 8bit ASCII ak som dobre pochopil.

alebo staci, ze
kód:
ABCDEFGHIJKL (7BIT ASCII):
100000110000101000011100010010001011000110100011110010001001001100101010010111001100


toto prepisem do 8bitASCII??
_________________
hadam to OpenGL este par rokov prezije
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zhuleny



Založen: 31. 01. 2012
Příspěvky: 28

PříspěvekZaslal: 18. říjen 2012, 12:23:33    Předmět: Odpovědět s citátem

Zdravim.
Namiesto odosielania celej abecedy odosli len jedno pismeno, potom dalsie a dalsie a porovnavaj zmeny.

Datovy tok moze byt aj komprimovany aby sa co najmenej zatazovala datova linka.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Farrell



Založen: 18. 10. 2012
Příspěvky: 5

PříspěvekZaslal: 18. říjen 2012, 12:48:05    Předmět: Odpovědět s citátem

Zdroj dat je zachycená struktura DPN_BUFFER_DESC v IDirectPlay8Server::SendTo();

kód:
typedef struct _BUFFERDESC{
    DWORD  dwBufferSize;
    BYTE*  pBufferData;
} BUFFERDESC, DPN_BUFFER_DESC;


kód:
HRESULT SendTo(
const DPNID dpnid,
const DPN_BUFFER_DESC *const pBufferDesc,
const DWORD cBufferDesc,
const DWORD dwTimeOut,
void *const pvAsyncContext,
DPNHANDLE *const phAsyncHandle,
const DWORD dwFlags
);



Jinak Hook funkce je:
kód:
HRESULT STDMETHODCALLTYPE SendTo(const DPNID dpnid,const DPN_BUFFER_DESC *const prgBufferDesc,const DWORD cBufferDesc,const DWORD dwTimeOut,void *const pvAsyncContext,DPNHANDLE *const phAsyncHandle,const DWORD dwFlags)
   {
      //OutputDebugStringA( "\n" );
      char *toSend = new char[1024];

      sprintf(toSend, "cBufferDesc: %d", cBufferDesc);

      for(int curBuf=0;curBuf < cBufferDesc; curBuf++)
      {
         sprintf(toSend, "%s Buffer: %d Size: %d\n", toSend, curBuf, prgBufferDesc[curBuf].dwBufferSize);
         sprintf(toSend, "%sBufferData(HEX):\n", toSend);
         for(int i=0; i < prgBufferDesc[curBuf].dwBufferSize; i++)
            sprintf(toSend, "%s%x ", toSend, prgBufferDesc[curBuf].pBufferData[i]);
         sprintf(toSend, "%s\nsBufferData(char): %s", toSend, prgBufferDesc[curBuf].pBufferData);
         
      }

      OutputDebugStringA(toSend);
      delete [] toSend;
      
      return directPlay8Server->SendTo( dpnid, prgBufferDesc, cBufferDesc, dwTimeOut, pvAsyncContext, phAsyncHandle, dwFlags);
   }


Takhle si vypíšu posílaná data...


Jinak další zachycené sekvence:
kód:
ASCII 7Bit standard:

1000001 - A
1001000 - H
1001111 - O
1001010 - J

Protokol Vietcongu



A
...00100011 00000001 ->01000000 00010000<- 00000000 <- RAW VC
...00100011 00000001 ->00000000 01000001<- 00000000 <- OK

AA
...00100011 00000001 ->01000000 00110000 00001000<- 00000000 <- RAW VC
-> ????????????? <- OK

H
...00100011 00000001 ->00000000 00010010<- 00000000 <- RAW VC
...00100011 00000001 ->00000000 01001000<- 00000000 <- OK

O
...00100011 00000001 ->11000000 00010011<- 00000000 <- RAW VC
...00100011 00000001 ->00000000 01001111<- 00000000 <- OK

J
...00100011 00000001 ->10000000 00010010<- 00000000 <- RAW VC
...00100011 00000001 ->00000000 01001010<- 00000000 <- OK

Ale AHOJ....

00100011 00000001 ->01000000 00010000 11111001 01010100 00000010 01011100 <- RAW VC
00100011 00000001 ->???????? ???????? ???????? ???????? ???????? ???????? <- OK


Jednopísmené zprávy jsem schopen rozluštit cyklickým offsetem
Ale, když tam je více písmen...

manutara napsal:
toto prepisem do 8bitASCII??

To je sekvence znaků v 7Bit, což bych teoreticky měl vidět v datech, které se odesílají klientovi. Tento řetězec, když proženu Covert7BIT funkcí, dostanu klasické 8Bit ascii čitelné pole...
kód:

BYTE test[] = {10000011, 00001010, 00011100, 01001000, 10110001, 10100011, 11001000, 10010011, 00101010, 01011100, 11000000};
int NewSize;
BYTE *vystup = Convert7BIT( test, 11, NewSize);
cout << (char*)vystup; // ABCDEFGHIJKL

_________________
C++, PHP, JS, XHTML, CSS, 3DsMax, Photoshop
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
Zhuleny



Založen: 31. 01. 2012
Příspěvky: 28

PříspěvekZaslal: 18. říjen 2012, 13:09:41    Předmět: Odpovědět s citátem

objasni mi co roby ten convert7bit, pretoze ho krmis 8 bitovim polom, a pises ze ti vracia 8bit pole.
citace:
Tento řetězec, když proženu Covert7BIT funkcí, dostanu klasické 8Bit ascii čitelné pole...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Farrell



Založen: 18. 10. 2012
Příspěvky: 5

PříspěvekZaslal: 18. říjen 2012, 13:18:05    Předmět: Odpovědět s citátem

Zhuleny napsal:
objasni mi co roby ten convert7bit, pretoze ho krmis 8 bitovim polom, a pises ze ti vracia 8bit pole.
citace:
Tento řetězec, když proženu Covert7BIT funkcí, dostanu klasické 8Bit ascii čitelné pole...


On jaksi datový typ BYTE má vždy 8 bitů, ať je tam 7BIT ascii, nebo 8BIT.

Rozdíl je asi takový...
kód:

BYTE 7BIT_ASCII[] = {10000011, 00001010, 00011100, 01001000, 10110001, 10100011, 11001000, 10010011, 00101010, 01011100, 11000000};
BYTE 8BIT_ASCII[] = {01000001, 01000010, 01000011, 01000100, 01000101, 01000110, 01000111, 01001000, 01001001, 01001010, 01001011, 01001100};


Kdybych četl 7BIT_ASCII, tak dostanu nesmysly
kód:

cout << (char*)7BIT_ASCII;

_________________
C++, PHP, JS, XHTML, CSS, 3DsMax, Photoshop
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
Zhuleny



Založen: 31. 01. 2012
Příspěvky: 28

PříspěvekZaslal: 18. říjen 2012, 15:12:12    Předmět: Odpovědět s citátem

Tak som o tom 7bit ascii troska precital a ak som spravne pochopil je uplne totozny z 8bit ascii a rozdiel je len v tom ze najvissi bit nesie informaciu a parite cize kontrola ci bol udaj preneseny spravne. takze mi z toho vychadza ze tvoj prevodnik z 7bit na 8bit nefunguje spravne.

data by mali vychadzat takto
kód:
BYTE 7BIT_ASCII[] = {10000011, 00001010, 00011100, 01001000, 10110001, 10100011, 11001000, 10010011, 00101010, 01011100, 11000000};
BYTE 8BIT_ASCII[] = {00000011, 00001010, 00011100, 01001000, 00110001, 00100011, 01001000, 00010011, 00101010, 01011100, 01000000};
teda ak som volaco nepriehladol co sa mi kludne mohlo stat.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
manutara



Založen: 02. 01. 2012
Příspěvky: 81
Bydliště: Kosice SVK

PříspěvekZaslal: 18. říjen 2012, 15:53:41    Předmět: hmm Odpovědět s citátem

citace:
data by mali vychadzat taktokód:
BYTE 7BIT_ASCII[] = {10000011, 00001010, 00011100, 01001000, 10110001, 10100011, 11001000, 10010011, 00101010, 01011100, 11000000};
BYTE 8BIT_ASCII[] = {00000011, 00001010, 00011100, 01001000, 00110001, 00100011, 01001000, 00010011, 00101010, 01011100, 01000000};

teda ak som volaco nepriehladol co sa mi kludne mohlo stat.


mno tak podla mna urcite ee, ide o to, ze davas 7bit do 8bit, takze podla
mna by to malo vyzerat nejak takto

kód:
7bit:{1000001,1000010,1000011,1000100,1000101,1000110,1000111,1001000,1001001,1001010,1001011,1001100}

8bit:{10000011,00001010,00011100,01001000,10110001,10100011,11001000,10010011,00101010,01011100,11000000}

zarovnane na cely byte, takze v poslednom som doplnil 4 nuly. podla toho
co som tu uviedol som napisal converter z 7bit prudu na 8bit ASCII, skoro aj funguje len to vynechava 8 pismeno hehe, este to musim doladit.

EDIT:
ono ide o to, ze kazdy nasledujuci byte ma shiftnute bity dolava o jedno
viac ako predchadzajuci byte. neviem ci to je zrozumitelne, ale v prvom
byte je 7bitov pre prvy znak + 1bit druheho znaku. v druhom byte je
6bitov druheho znaku + 2bity tretieho znaku atd.
_________________
hadam to OpenGL este par rokov prezije
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zhuleny



Založen: 31. 01. 2012
Příspěvky: 28

PříspěvekZaslal: 18. říjen 2012, 17:20:41    Předmět: Odpovědět s citátem

pre manutara

Vychadzam z tohto:

http://www.neurophys.wisc.edu/comp/docs/ascii/
8 bit sa pouziva ako kontrola spravneho prenosu.

Mam dojem ze
    97 10 23 7 41 50 38 24 16 8d 47 64 52 b9 64 2 8
niesu spravne data. to ze sa opakuje 64 sa mi moc nezda

ak to mame rozlusknut asi by sa zislo dostat tie RAW udaje pre kazde pismeno zvlast.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
manutara



Založen: 02. 01. 2012
Příspěvky: 81
Bydliště: Kosice SVK

PříspěvekZaslal: 18. říjen 2012, 17:23:17    Předmět: 7bitconverter Odpovědět s citátem

funkcny 7bitconverter, konvertuje z prudu 7bit znakov na 8bit ASCII znaky:

kód:

//===nieco na pouzivanie
int i=0;
int j=0;
int char_count=0;

int shift_count=1;

unsigned char *b_data=NULL;
unsigned char *cb_data=NULL;

unsigned char data_temp=0x00;
unsigned char data_temp1=0x00;

unsigned char bit_mask=0x01;
unsigned char bit_temp=0x00;

//===mozog programceku
j=0;
for(i=0; i<char_count; i++){

   data_temp=b_data[i]&bit_mask;
   
   b_data[i]=b_data[i]>>shift_count;
   cb_data[j]=b_data[i]|data_temp1;
         
   data_temp1=data_temp<<(7-shift_count);

   if(bit_mask==0x7F){
      cb_data[++j]=data_temp1;
   }

   j++;

   if(bit_mask==0x7F){
                 bit_mask=0x01;
         
      shift_count=1;

      data_temp1=0x00;
   }else{
      bit_temp=bit_mask;
      bit_mask=bit_mask<<1;
      bit_mask=bit_mask|bit_temp;

      shift_count++;
   }
}



samozrejme prud 7bit znakov bol zapisany v klasickom subore, ktroy
ci chceme ci nie aj tak ma 8bit byte. takze ako som pisal vyssie, 7bit
znaky v 8bit datach to su shifty dolava a chvosty.

vstup:
kód:

hex zapis: 83 0A 1C 48 B1 A3 C8 93 2A 5C C8 30 A1 C4 8B 1A 3C 89 32 A5 CC


vystup:
kód:

hex zapis: 41 42 43 44 45 46 47 48 49 4A 4B 4C 41 42 43 44 45 46 47 48 49 4A 4B 4C

ASCII zapis: ABCDEFGHIJKLABCDEFGHIJKL


tak neviem ak si potreboval nieco take tak to spokojne pouzivaj. ak nie a
opat som nieco zle pochopil (dislexia Sad ) tak to mozno niekto vyuzije v buducnosti.

zatim...
_________________
hadam to OpenGL este par rokov prezije
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Farrell



Založen: 18. 10. 2012
Příspěvky: 5

PříspěvekZaslal: 18. říjen 2012, 17:40:08    Předmět: Re: 7bitconverter Odpovědět s citátem

manutara napsal:
funkcny 7bitconverter, konvertuje z prudu 7bit znakov na 8bit ASCII znaky:

kód:

//===nieco na pouzivanie
int i=0;
int j=0;
int char_count=0;

int shift_count=1;

unsigned char *b_data=NULL;
unsigned char *cb_data=NULL;

unsigned char data_temp=0x00;
unsigned char data_temp1=0x00;

unsigned char bit_mask=0x01;
unsigned char bit_temp=0x00;

//===mozog programceku
j=0;
for(i=0; i<char_count; i++){

   data_temp=b_data[i]&bit_mask;
   
   b_data[i]=b_data[i]>>shift_count;
   cb_data[j]=b_data[i]|data_temp1;
         
   data_temp1=data_temp<<(7-shift_count);

   if(bit_mask==0x7F){
      cb_data[++j]=data_temp1;
   }

   j++;

   if(bit_mask==0x7F){
                 bit_mask=0x01;
         
      shift_count=1;

      data_temp1=0x00;
   }else{
      bit_temp=bit_mask;
      bit_mask=bit_mask<<1;
      bit_mask=bit_mask|bit_temp;

      shift_count++;
   }
}



samozrejme prud 7bit znakov bol zapisany v klasickom subore, ktroy
ci chceme ci nie aj tak ma 8bit byte. takze ako som pisal vyssie, 7bit
znaky v 8bit datach to su shifty dolava a chvosty.

vstup:
kód:

hex zapis: 83 0A 1C 48 B1 A3 C8 93 2A 5C C8 30 A1 C4 8B 1A 3C 89 32 A5 CC


vystup:
kód:

hex zapis: 41 42 43 44 45 46 47 48 49 4A 4B 4C 41 42 43 44 45 46 47 48 49 4A 4B 4C

ASCII zapis: ABCDEFGHIJKLABCDEFGHIJKL


tak neviem ak si potreboval nieco take tak to spokojne pouzivaj. ak nie a
opat som nieco zle pochopil (dislexia Sad ) tak to mozno niekto vyuzije v buducnosti.

zatim...


To je ono!! Díky moc, pokud bys cokoliv potřeboval, ozvi se! Dííky
_________________
C++, PHP, JS, XHTML, CSS, 3DsMax, Photoshop
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
manutara



Založen: 02. 01. 2012
Příspěvky: 81
Bydliště: Kosice SVK

PříspěvekZaslal: 18. říjen 2012, 17:43:55    Předmět: fajnfajn Odpovědět s citátem

nz Wink
_________________
hadam to OpenGL este par rokov prezije
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Farrell



Založen: 18. 10. 2012
Příspěvky: 5

PříspěvekZaslal: 18. říjen 2012, 17:58:09    Předmět: Odpovědět s citátem

Trochu jinak, ta funkce dělá přesně to, co můj konverter, jenže princip mě přivedl na myšlenku offsetu, který můžu do bitů/bytů aplikovat a tak jsem na to přišel Smile
_________________
C++, PHP, JS, XHTML, CSS, 3DsMax, Photoshop
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
Crypton



Založen: 14. 05. 2009
Příspěvky: 306
Bydliště: The Void

PříspěvekZaslal: 18. říjen 2012, 19:27:11    Předmět: Odpovědět s citátem

[shameless_plug]
Něco podobného jsem taky nedávno dělal, akorád pro hru Arcanum, a bylo to jen pro multiplayer. Taky jsem tam hookoval konzoli pro chat a k tomu jsem i nabindoval některé části toho enginu do skriptovacího prostředí Lua. Zdrojové kódy jsem taky nemněl, všechno jsem to kutil přes disassembler, takže mi to dalo docela zabrat.

Přes konzoli jsem pak mohl taky spawnovat nové NPC a předměty, apod. Pokud tě to zajímám, udělal jsem malé video: http://www.youtube.com/watch?v=p_jJqyIzcUA

Měl by tam být i odkaz na stažení té hook knihovny a toho Lua skriptu. Jde tam pěkně vidět co všechno můžeš naimplementovat už jen tím hookováním toho chatu. Twisted Evil
[/shameless_plug]
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
manutara



Založen: 02. 01. 2012
Příspěvky: 81
Bydliště: Kosice SVK

PříspěvekZaslal: 23. říjen 2012, 13:33:00    Předmět: 8to7bit converter Odpovědět s citátem

zdravim,

tak to uz len tak zo srandy, 8bitto7bit konvertor. komprimacia vychadza na
~88% povodnej 8bit spravy, takze nic moc, ale ako jednoduchy sifrovaci
algorytmus sa to moze zist hehe, tak spokojne ak to niekomu niekedy bude treba...

kód:

//===Nieco na pouzivanie
unsigned int i=0;
unsigned int j=0;

unsigned int shift=0;

unsigned char *b_data;
unsigned char *cb_data

unsigned char data_temp=0x00;

unsigned char bit_mask=0x80;
unsigned char bit_temp=0x00;

//===MOZOGg
j=0;
for(i=0; i<char_count; i++){
   cb_data[j]=b_data[i]<<(shift+1);

   if((i+1)!=char_count){
      data_temp=(b_data[i+1]<<1)&bit_mask;
      data_temp=data_temp>>(7-shift);
              }else{
      data_temp=0x00;
   }

   cb_data[j]=cb_data[j]|data_temp;

   bit_temp=bit_mask;
   bit_mask=bit_mask>>1;
   bit_mask=bit_mask|bit_temp;

   if(shift==7){
      shift=0;
         
      bit_mask=0x80;
   }else{
      shift++;
      j++;
   }
}


zatim...
_________________
hadam to OpenGL este par rokov prezije
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++ Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna