Permalink
Browse files

first commit

  • Loading branch information...
0 parents commit 2ee24cf9780e14284083c73da1509843419475d4 @proton committed Jan 7, 2010
Showing with 2,673 additions and 0 deletions.
  1. +2 −0 Makefile
  2. +1 −0 TODO
  3. BIN alaistair
  4. +175 −0 alaistair.c
  5. +173 −0 alaistair.c.orig
  6. +40 −0 ascii_uni.c
  7. +162 −0 build_game.c
  8. +82 −0 build_gs.c
  9. +64 −0 build_ls.c
  10. +8 −0 config
  11. +35 −0 config.c
  12. +41 −0 config.h
  13. +73 −0 game.c
  14. +22 −0 game.h
  15. +3 −0 go
  16. +26 −0 libastral.c
  17. +113 −0 net_gs.c
  18. +80 −0 net_ls.c
  19. +76 −0 out
  20. +258 −0 out0
  21. +252 −0 out1
  22. +273 −0 out2
  23. +159 −0 out3
  24. +21 −0 pc_chksum.c
  25. +53 −0 pc_out.c
  26. +320 −0 recv_game.c
  27. +20 −0 recv_gs.c
  28. +141 −0 recv_ls.c
@@ -0,0 +1,2 @@
+all: Makefile libastral.c alaistair.c config.h game.h config.c game.c ascii_uni.c pc_out.c pc_chksum.c build_ls.c build_gs.c build_game.c recv_ls.c recv_gs.c recv_game.c net_ls.c net_gs.c
+ gcc -o alaistair /usr/lib/libcrypto.so libastral.c config.h game.h game.c config.c ascii_uni.c pc_out.c pc_chksum.c build_ls.c build_gs.c build_game.c recv_ls.c recv_gs.c recv_game.c net_ls.c net_gs.c alaistair.c -lpthread
@@ -0,0 +1 @@
+-Добавление конструкций пакетов
Binary file not shown.
@@ -0,0 +1,175 @@
+///Alaistair 0.3.0-r3
+#include "config.h"
+
+int main()
+{
+ printf("\nВас приветствует Alaistair! (ver 0.3.0)\n\n");
+ log_add("-----------Alaistair started!-----------",40,0);
+ printf("[>] Чтение конфигурационных настроек...\n");
+ config(address, &port, key, &protocol, login, pwd, &servnum, &charnum);
+ printf("[!] Конфигурация успешно считана!\n");
+ log_add("Configuration loaded!",21,'a');
+ printf("[>] Генерация подключей на основе базового ключа...\n");
+ BF_set_key(&bfkey,21,key);
+ printf("[!] Генерация подключей успешно завершена!\n");
+ cnt();
+ //if( m<0 ) recnt();
+ return 0;
+}
+
+void cnt()
+{
+ log_add("Connecting to server...",23,'a');
+ //la_connect();
+ w=0;
+//m=-1;
+ m = connect_to_ls(&s2,address,port);
+ if ( m>=0 ) ls_build_auth(sbuf,login,pwd);
+ if ( m>=0 ) m = send_ls_pc(&s2,sbuf,bfkey);
+ if ( m>=0 ) m = test_recv_ls(3);
+ if ( m>=0 ) ls_build_servlst(sbuf,login_key_p1,login_key_p2);
+ if ( m>=0 ) m = send_ls_pc(&s2,sbuf,bfkey);
+ if ( m>=0 ) m = test_recv_ls(4);
+ if ( m>=0 ) ls_build_servlogin(sbuf,login_key_p1,login_key_p2,servnum);
+ if ( m>=0 ) m = send_ls_pc(&s2,sbuf,bfkey);
+ if ( m>=0 ) m = test_recv_ls(7);
+ if ( m>=0 ) close(s2);
+ if ( m>=0 ) m = printf("[!] Соединение с логин-сервером завершено! =D\n");
+ if ( m>=0 ) m = connect_to_gs(&s2,servers[servnum-1].ip,servers[servnum-1].port,rbuf,sbuf,key_cs,key_sc,protocol);
+ if ( m>=0 ) gs_build_auth(sbuf,login,login_key_p1,login_key_p2,play_key_p1,play_key_p2);
+ if ( m>=0 ) m = send_gs_pc(&s2, sbuf,key_cs);
+ if ( m>=0 ) m = recv_gs_pc(&s2, rbuf, key_sc);
+ if ( m>=0 ) gs_build_charselect(sbuf,charnum);
+ if ( m>=0 ) m = send_gs_pc(&s2, sbuf,key_cs);
+ if ( m>=0 ) m = recv_gs_pc(&s2, rbuf, key_sc);
+ if ( m>=0 ) m = recv_gs_pc(&s2, rbuf, key_sc);
+ if ( m>=0 ) gs_build_mlist(sbuf);
+ if ( m>=0 ) m = send_gs_pc(&s2, sbuf,key_cs);
+ if ( m>=0 ) gs_build_qlist(sbuf);
+ if ( m>=0 ) m = send_gs_pc(&s2, sbuf,key_cs);
+ if ( m>=0 ) m = recv_gs_pc(&s2, rbuf, key_sc);
+ if ( m>=0 ) m = recv_gs_pc(&s2, rbuf, key_sc);
+ if ( m>=0 ) gs_build_enterworld(sbuf);
+ if ( m>=0 ) m = send_gs_pc(&s2, sbuf,key_cs);
+ gameprc();
+}
+
+int test_recv_ls(int must_m)
+{
+ int recv_m = recv_ls_pc(&s2,rbuf,login_key_p1,login_key_p2,play_key_p1,play_key_p2,bfkey,servers);
+ if ( recv_m!=must_m && recv_m>=0) test_recv_ls(must_m);
+ return recv_m;
+}
+
+void recnt()
+{
+ log_add("Connection with server losed. Waiting 25 sec..",46,'c');
+ printf("[X] Соединение с сервером разорвано. Попытка переподключения состоится через\n");
+ sleep(1);
+ unsigned char isp;
+ for (isp=25; isp>0; isp-=5)
+ {
+ printf(" %i", isp);
+ sleep(5);
+ }
+ cnt();
+ sleep(1);
+ if (m<0) recnt();
+}
+
+void gameprc()
+{
+ int i=0,l,len=0,size=0;
+ init_pl();
+ while (m>=0)
+ {
+star:
+ l=recv(s2, rbuf, 65536, 0);
+ if (l < 0)
+ {
+ printf("[X] Ошибка при получении данных\n");
+ log_add("Can't get data from GS",22,'c');
+ m = -1;
+ }
+ else if (l>0)
+ {
+ memcpy(mbuf+len,rbuf,l);
+ len+=l;
+ if (rbuf[1]*256+rbuf[0]!=l) goto star;
+ while (i!=len)
+ {
+ size=mbuf[i+1]*256+mbuf[i];
+ gs_pc_dec(mbuf+2+i,size-2,key_sc);
+ game_td(mbuf+i,sbuf,pid);
+ i+=size;
+ }
+ i=len=size=0;
+ if (w==0)
+ {
+ printf("[!] Вход в мир произведен!\n");
+ log_add("Entered to world!",17,'w');
+ w = 1;
+ }
+ }
+ //if( m==2 ) send_gs_pc(&s2, sbuf,key_cs);
+ if (w==1 && gbuf[0]==0x00)
+ {
+ FILE *file = fopen("ala", "r");
+ fseek (file, 0 , SEEK_END);
+ size_t fsize = ftell (file);
+ rewind (file);
+ fread (gbuf, 1, fsize, file);
+ fclose(file);
+ }
+ if (gbuf[0]!=0x00)
+ {
+ game_recv_cmd(gbuf, "", strlen(gbuf), 0, 0);
+ bzero(gbuf, 1000);
+ remove("ala");
+ FILE *file = fopen("ala", "w+");
+ fclose(file);
+ }
+ }
+}
+
+void gmtd(unsigned char* raw)
+{
+ switch (raw[0])
+ {
+ case 0x38://Say
+ game_build_say(sbuf,raw+1);
+ break;
+ case 0x1D://Sit|Stand
+ game_build_wtp(sbuf,raw+1);
+ break;
+ case 0x1C://Go|Run
+ game_build_mtp(sbuf,raw+1);
+ break;
+ case 0x01://Move
+ game_build_move(sbuf,raw+1);
+ break;
+ case 0x1B://Socact
+ game_build_socact(sbuf,raw+1);
+ break;
+ case 0x2F://Use Skill
+ game_build_skilluse(sbuf,raw+1);
+ break;
+ case 0x29://Request Party
+ game_build_partyreq(sbuf,raw+1);
+ break;
+ case 0x2A://Answer JoinParty
+ game_build_partyans(sbuf,raw+1);
+ break;
+ case 0x5E://Request Adding to Friends
+ game_build_friendreq(sbuf,raw+1);
+ break;
+ case 0xA8://Ping
+ game_build_ping(sbuf,raw+1);
+ break;
+ default:
+ printf("[!] Невозможно определить тип команды (%d)\n",raw[0]);
+ break;
+ }
+ send_gs_pc(&s2, sbuf,key_cs);
+ printf("[>] Команда: #%.2X отпралена на исполнение!\n",raw[0]);
+}
@@ -0,0 +1,173 @@
+///Alaistair 0.3.0-r3
+#include "config.h"
+
+int main()
+{
+ printf("\nВас приветствует Alaistair! (ver 0.3.0)\n\n");
+ log_add("-----------Alaistair started!-----------",40,0);
+ printf("[>] Чтение конфигурационных настроек...\n");
+ config(address, &port, key, &protocol, login, pwd, &servnum, &charnum);
+ printf("[!] Конфигурация успешно считана!\n");
+ log_add("Configuration loaded!",21,'a');
+ printf("[>] Генерация подключей на основе базового ключа...\n");
+ BF_set_key(&bfkey,21,key);
+ printf("[!] Генерация подключей успешно завершена!\n");
+ cnt();
+ //if( m<0 ) recnt();
+ return 0;
+}
+
+void cnt()
+{
+log_add("Connecting to server...",23,'a');
+ //la_connect();
+w=0;
+//m=-1;
+ m = connect_to_ls(&s2,address,port); if( m>=0 ) ls_build_auth(sbuf,login,pwd);
+ if( m>=0 ) m = send_ls_pc(&s2,sbuf,bfkey);
+ if( m>=0 ) m = test_recv_ls(3);
+ if( m>=0 ) ls_build_servlst(sbuf,login_key_p1,login_key_p2);
+ if( m>=0 ) m = send_ls_pc(&s2,sbuf,bfkey);
+ if( m>=0 ) m = test_recv_ls(4);
+ if( m>=0 ) ls_build_servlogin(sbuf,login_key_p1,login_key_p2,servnum);
+ if( m>=0 ) m = send_ls_pc(&s2,sbuf,bfkey);
+ if( m>=0 ) m = test_recv_ls(7);
+ if( m>=0 ) close(s2);
+ if( m>=0 ) m = printf("[!] Соединение с логин-сервером завершено! =D\n");
+ if( m>=0 ) m = connect_to_gs(&s2,servers[servnum-1].ip,servers[servnum-1].port,rbuf,sbuf,key_cs,key_sc,protocol);
+ if( m>=0 ) gs_build_auth(sbuf,login,login_key_p1,login_key_p2,play_key_p1,play_key_p2);
+ if( m>=0 ) m = send_gs_pc(&s2, sbuf,key_cs);
+ if( m>=0 ) m = recv_gs_pc(&s2, rbuf, key_sc);
+ if( m>=0 ) gs_build_charselect(sbuf,charnum);
+ if( m>=0 ) m = send_gs_pc(&s2, sbuf,key_cs);
+ if( m>=0 ) m = recv_gs_pc(&s2, rbuf, key_sc);
+ if( m>=0 ) m = recv_gs_pc(&s2, rbuf, key_sc);
+ if( m>=0 ) gs_build_mlist(sbuf);
+ if( m>=0 ) m = send_gs_pc(&s2, sbuf,key_cs);
+ if( m>=0 ) gs_build_qlist(sbuf);
+ if( m>=0 ) m = send_gs_pc(&s2, sbuf,key_cs);
+ if( m>=0 ) m = recv_gs_pc(&s2, rbuf, key_sc);
+ if( m>=0 ) m = recv_gs_pc(&s2, rbuf, key_sc);
+ if( m>=0 ) gs_build_enterworld(sbuf);
+ if( m>=0 ) m = send_gs_pc(&s2, sbuf,key_cs);
+ gameprc();
+}
+
+int test_recv_ls(int must_m)
+{
+ int recv_m = recv_ls_pc(&s2,rbuf,login_key_p1,login_key_p2,play_key_p1,play_key_p2,bfkey,servers);
+ if( recv_m!=must_m && recv_m>=0) test_recv_ls(must_m);
+ return recv_m;
+}
+
+void recnt()
+{
+ log_add("Connection with server losed. Waiting 25 sec..",46,'c');
+ printf("[X] Соединение с сервером разорвано. Попытка переподключения состоится через\n");
+ sleep(1);
+ unsigned char isp;
+ for(isp=25; isp>0; isp-=5)
+ {
+ printf(" %i", isp);
+ sleep(5);
+ }
+ cnt();
+ sleep(1);
+ if(m<0) recnt();
+}
+
+void gameprc()
+{
+ int i=0,l,len=0,size=0;
+ init_pl();
+ while(m>=0)
+ {
+ star:
+ l=recv(s2, rbuf, 65536, 0);
+ if(l < 0)
+ {
+ printf("[X] Ошибка при получении данных\n");
+ log_add("Can't get data from GS",22,'c');
+ m = -1;
+ }
+ else if(l>0)
+ {
+ memcpy(mbuf+len,rbuf,l);
+ len+=l;
+ if(rbuf[1]*256+rbuf[0]!=l) goto star;
+ while(i!=len)
+ {
+ size=mbuf[i+1]*256+mbuf[i];
+ gs_pc_dec(mbuf+2+i,size-2,key_sc);
+ game_td(mbuf+i,sbuf,pid);
+ i+=size;
+ }
+ i=len=size=0;
+ if(w==0)
+ {
+ printf("[!] Вход в мир произведен!\n");
+ log_add("Entered to world!",17,'w');
+ w = 1;
+ }
+ }
+ //if( m==2 ) send_gs_pc(&s2, sbuf,key_cs);
+ if(w==1 && gbuf[0]==0x00)
+ {
+ FILE *file = fopen("ala", "r");
+ fseek (file, 0 , SEEK_END);
+ size_t fsize = ftell (file);
+ rewind (file);
+ fread (gbuf, 1, fsize, file);
+ fclose(file);
+ }
+ if(gbuf[0]!=0x00)
+ {
+ game_recv_cmd(gbuf, "", strlen(gbuf), 0, 0);
+ bzero(gbuf, 1000);
+ remove("ala");
+ FILE *file = fopen("ala", "w+");
+ fclose(file);
+ }
+ }
+}
+
+void gmtd(unsigned char* raw)
+{
+ switch(raw[0]) {
+ case 0x38://Say
+ game_build_say(sbuf,raw+1);
+ break;
+ case 0x1D://Sit|Stand
+ game_build_wtp(sbuf,raw+1);
+ break;
+ case 0x1C://Go|Run
+ game_build_mtp(sbuf,raw+1);
+ break;
+ case 0x01://Move
+ game_build_move(sbuf,raw+1);
+ break;
+ case 0x1B://Socact
+ game_build_socact(sbuf,raw+1);
+ break;
+ case 0x2F://Use Skill
+ game_build_skilluse(sbuf,raw+1);
+ break;
+ case 0x29://Request Party
+ game_build_partyreq(sbuf,raw+1);
+ break;
+ case 0x2A://Answer JoinParty
+ game_build_partyans(sbuf,raw+1);
+ break;
+ case 0x5E://Request Adding to Friends
+ game_build_friendreq(sbuf,raw+1);
+ break;
+ case 0xA8://Ping
+ game_build_ping(sbuf,raw+1);
+ break;
+ default:
+ printf("[!] Невозможно определить тип команды (%d)\n",raw[0]);
+ break;
+ }
+ send_gs_pc(&s2, sbuf,key_cs);
+ printf("[>] Команда: #%.2X отпралена на исполнение!\n",raw[0]);
+}
@@ -0,0 +1,40 @@
+void acu(unsigned char* in, unsigned char* out)
+{
+ int i,n=strlen(in);
+ for(i=0; i<n; ++i)
+ {
+ if(in[i]<0x7F)
+ {
+ out[2*i]=in[i];
+ out[2*i+1]=0x00;
+ }
+ else if(in[i]>=0xC0)
+ {
+ out[2*i]=in[i]-0xB0;
+ out[2*i+1]=0x04;
+ }
+ else if(in[i]==0xA8)
+ {
+ out[2*i]=0x01;
+ out[2*i+1]=0x04;
+ }
+ else if(in[i]==0xB8)
+ {
+ out[2*i]=0x51;
+ out[2*i+1]=0x04;
+ }
+ }
+//print_key(out,2*n);
+}
+
+void uca(unsigned char* in, unsigned char* out, int len)
+{
+ int i;
+ for(i=0; i<len; ++i)
+ {
+ if(in[i*2+1]*256+in[i*2]<0x7F) out[i]=in[i*2];
+ else if(in[i*2+1]*256+in[i*2]>=0x410) out[i]=in[i*2]+0xB0;
+ else if(in[i*2+1]*256+in[i*2]==0x401) out[i]=0xA8;
+ else if(in[i*2+1]*256+in[i*2]==0x451) out[i]=0xB8;
+ }
+}
Oops, something went wrong.

0 comments on commit 2ee24cf

Please sign in to comment.