Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Farrell
Založen: 18. 10. 2012 Příspěvky: 5
|
Zaslal: 18. říjen 2012, 05:51:02 Předmět: Konverze RAW dat ze serveru |
|
|
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 |
|
|
manutara
Založen: 02. 01. 2012 Příspěvky: 81 Bydliště: Kosice SVK
|
Zaslal: 18. říjen 2012, 11:21:12 Předmět: zdravim |
|
|
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 |
|
|
Zhuleny
Založen: 31. 01. 2012 Příspěvky: 28
|
Zaslal: 18. říjen 2012, 12:23:33 Předmět: |
|
|
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 |
|
|
Farrell
Založen: 18. 10. 2012 Příspěvky: 5
|
Zaslal: 18. říjen 2012, 12:48:05 Předmět: |
|
|
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 |
|
|
Zhuleny
Založen: 31. 01. 2012 Příspěvky: 28
|
Zaslal: 18. říjen 2012, 13:09:41 Předmět: |
|
|
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 |
|
|
Farrell
Založen: 18. 10. 2012 Příspěvky: 5
|
Zaslal: 18. říjen 2012, 13:18:05 Předmět: |
|
|
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 |
|
|
Zhuleny
Založen: 31. 01. 2012 Příspěvky: 28
|
Zaslal: 18. říjen 2012, 15:12:12 Předmět: |
|
|
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 |
|
|
manutara
Založen: 02. 01. 2012 Příspěvky: 81 Bydliště: Kosice SVK
|
Zaslal: 18. říjen 2012, 15:53:41 Předmět: hmm |
|
|
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 |
|
|
Zhuleny
Založen: 31. 01. 2012 Příspěvky: 28
|
Zaslal: 18. říjen 2012, 17:20:41 Předmět: |
|
|
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 |
|
|
manutara
Založen: 02. 01. 2012 Příspěvky: 81 Bydliště: Kosice SVK
|
Zaslal: 18. říjen 2012, 17:23:17 Předmět: 7bitconverter |
|
|
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 ) tak to mozno niekto vyuzije v buducnosti.
zatim... _________________ hadam to OpenGL este par rokov prezije |
|
Návrat nahoru |
|
|
Farrell
Založen: 18. 10. 2012 Příspěvky: 5
|
Zaslal: 18. říjen 2012, 17:40:08 Předmět: Re: 7bitconverter |
|
|
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 ) 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 |
|
|
manutara
Založen: 02. 01. 2012 Příspěvky: 81 Bydliště: Kosice SVK
|
Zaslal: 18. říjen 2012, 17:43:55 Předmět: fajnfajn |
|
|
nz _________________ hadam to OpenGL este par rokov prezije |
|
Návrat nahoru |
|
|
Farrell
Založen: 18. 10. 2012 Příspěvky: 5
|
Zaslal: 18. říjen 2012, 17:58:09 Předmět: |
|
|
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 _________________ C++, PHP, JS, XHTML, CSS, 3DsMax, Photoshop |
|
Návrat nahoru |
|
|
Crypton
Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 18. říjen 2012, 19:27:11 Předmět: |
|
|
[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.
[/shameless_plug] _________________
|
|
Návrat nahoru |
|
|
manutara
Založen: 02. 01. 2012 Příspěvky: 81 Bydliště: Kosice SVK
|
Zaslal: 23. říjen 2012, 13:33:00 Předmět: 8to7bit converter |
|
|
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 |
|
|
|