Otvranje i provera softap.conf fajla

1

Otvranje i provera softap.conf fajla

offline
  • Pridružio: 15 Jul 2009
  • Poruke: 150

Zdravo! Molim vas za malu pomoc za sledecu stvar:

hexdump binarnog fajla softap.conf:
Citat:Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000 00 00 00 01 00 09 41 6E 64 72 6F 69 64 41 70 00 ......AndroidAp.
00000010 00 00 04 00 0F 65 78 61 6D 70 6C 65 70 61 73 73 .....examplepass
00000020 77 6F 72 64 word


Treba mi program radjen u c programskom jeziku koji ce da otvori softap.conf i uradi sledece:
1. da proveri dali je u pitanju WPA2 ili WPA ili NONE enkripcija
2. da nadoda na newfile.conf (koji vec ima konfiguraciju u sebi) nesto tipa: SSID=blabla pa u novi red password=blabla, pa u novi red type=wpa|wp2|none u zavisnosti koja je enkripcijja u pitanju.


Da objasnim znacenje:
00 00 00 01 00 09 41 6E 64 72 6F 69 64 41 70 00 00 00 04 00 0F 65 78 61 6D 70 6C 65 70 61 73 73 77 6F 72 64

znaci 00 00 00 01 to se ne menja nikad, 00 09 oznacava duzinu stringa 41 6E 64 72 6F 69 64 41 70, pa onda ide 00 00 00 04 (u ovom slucaju znaci da je u pitanju wpa2 enkripcija dok 00 00 00 01 oznacava wpa enkripciju, a kad stoji 00 00 00 00 znaci da nema enkripcije i tada nema nista posle 00 00 00 00. Ako ima enkricije (kao u ovom slucaju) onda ovo 00 0f oznacava duzinu lozinke, pa onda iza toga ide lozinka Smile.

Format softap.conf binarnog fajla je jasan, ali posto fajl nije iste duzine kod svakog "user" samim tim i duzina fajla, ne znam kako da uradim ovo. Smile Hvala vam puno!



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Pridružio: 19 Maj 2011
  • Poruke: 297

Nisi mi bas jasan, prva 4 bajta su uvek ista (00 00 00 01) ili oznacavaju koja je enkripcija (gde je 00 00 00 00 bez)? Sledeca 2 bajta oznacavaju duzinu nekog stringa, pa preskacemo 9 bajtova i posle toga su sledeca 2 duzina stringa lozinke, da li je lozinka odmah posle ovoga ili treba jos da se preskoci?

EDIT: sad sam video, ide lozinka odmah posle toga.



offline
  • Pridružio: 15 Jul 2009
  • Poruke: 150

Napisano: 03 Dec 2013 22:18

Da objasnim lakse. Tri primera:

1.

00 00 00 01 00 09 41 6E 64 72 6F 69 64 41 70 00 00 00 04 00 0F 65 78 61 6D 70 6C 65 70 61 73 73 77 6F 72 64

2.

00 00 00 01 00 09 41 6E 64 72 6F 69 64 41 70 00 00 00 01 00 0F 65 78 61 6D 70 6C 65 70 61 73 73 77 6F 72 64


3.

00 00 00 01 00 09 41 6E 64 72 6F 69 64 41 70 00 00 00 00

Prvi primer je wpa2.
Drugi primer je wpa
Treci primer je bez enkripcije, sto znaci da 00 00 00 00 oznacava da nema lozinke

Dopuna: 03 Dec 2013 22:22

Problem je sto se menja velicina fajla u zavisnosti od unete lozinke i SSID-a samim tim se i pomeraju atagovi 00000001 00000004, i atagovi sto oznacavaju duzinu stringa, a i duzina samog stringa se povecava u zavisnosti sta "user" unese u wifi konfiguraciju.

Kao na primer evo ga novi konfig koji sam uneo, promenio se binarni fajl:
Citat:Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000 00 00 00 01 00 0D 41 6E 64 72 6F 69 64 41 70 4E ......AndroidApN
00000010 6F 76 69 00 00 00 04 00 1A 65 78 61 6D 70 6C 65 ovi......example
00000020 70 61 73 73 77 6F 72 64 6E 6F 76 61 6C 6F 7A 69 passwordnovalozi
00000030 6E 6B 61 nka


Dopuna: 03 Dec 2013 22:27

Ovako izgleda kad nema enkripcije:
Citat:Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000 00 00 00 01 00 0D 41 6E 64 72 6F 69 64 41 70 4E ......AndroidApN
00000010 6F 76 69 00 00 00 00 ovi....

offline
  • Pridružio: 19 Maj 2011
  • Poruke: 297

Radim na tome sad. Ona prva duzina stringa oznacava koliko da se "preskoci" da bi se doslo do tipa enkripcije

Ovo bi trebalo da bude sto ti treba, ako nisam negde zeznuo (a mislim da nisam):
#include <stdio.h> #include <stdlib.h> #include <assert.h> #define ENC_NONE 0 #define ENC_WPA  1 #define ENC_WPA2 4 int main() {    FILE* pFile = fopen("softap.conf", "r");    unsigned long int encType;    unsigned short int passLen;    // read stuff to skip first string    {       unsigned short int toSkip;       fseek(pFile, 4, SEEK_SET);       fread(&toSkip, sizeof(toSkip), 1, pFile);       fseek(pFile, toSkip, SEEK_CUR);    }    // read encription type    {       fread(&encType, sizeof(encType), 1, pFile);       if(ENC_NONE == encType)          printf("Enc. type is NONE");       else if(ENC_WPA == encType)          printf("Enc. type is WPA");       else if(ENC_WPA2 == encType)          printf("Enc. type is WPA2");       else          assert( "Enc. type is UNKNOWN!!! Something is wrong." && 0 );    }    // read pass len    {       fread(&passLen, sizeof(passLen), 1, pFile);    }    // read password    {       char* passBuffer = (char*)malloc(passLen);       fread(passBuffer, sizeof(char), passLen, pFile);       // ... do something with password       free(passBuffer); // free mem    }    fclose(pFile); // close file    return EXIT_SUCCESS; }

offline
  • Pridružio: 15 Jul 2009
  • Poruke: 150

Nije mi bas jasno to pomeranje. Dali ti je problem da mi uradis kompletan kod, cini mi se da si preskocio SSID i password?

offline
  • Pridružio: 19 Maj 2011
  • Poruke: 297

Daj mi neki softap.conf za test.

offline
  • Pridružio: 15 Jul 2009
  • Poruke: 150

Evo i dodao sam par nula u lozinku za svaki slucaj Smile -> d-h.st/PkW

Hvala ti puno!

offline
  • Pridružio: 19 Maj 2011
  • Poruke: 297

Fajl je verovatno kreiran na Linuxu?
Morao sam da swapujem bajtove zbog drugacijeg endian sistema posto sam ja na windowsu... nasao sam neke primere na net-u pa sam izmenio kod (treba da ispise u konzoli koja je wpa enkripcija u pitanju i sam pass) e sad ne znam da li je pass mozda utf8 pa bi moralo to da se parsuje drugacije?
#include <stdio.h> #include <stdlib.h> #include <assert.h> #define ENC_NONE 0 #define ENC_WPA  1 #define ENC_WPA2 4 #ifdef _WIN32 #define SWAP_UINT16(x) (((x) >> 8) | ((x) << 8)) #define SWAP_UINT32(x) (((x) >> 24) | (((x) & 0x00FF0000) >> 8) | (((x) & 0x0000FF00) << 8) | ((x) << 24)) #else // Not windows do nothing #define SWAP_UINT16(x) (x) #define SWAP_UINT32(x) (x) #endif int main() {    FILE* pFile = fopen("softap.conf", "r");    unsigned long int encType;    unsigned short int passLen;    // read stuff to skip first string    {       unsigned short int toSkip;       int sz = sizeof(toSkip);       fseek(pFile, 4, SEEK_SET);       fread(&toSkip, sz, 1, pFile);       toSkip = SWAP_UINT16(toSkip);       fseek(pFile, toSkip, SEEK_CUR);    }    // read encription type    {       fread(&encType, sizeof(encType), 1, pFile);       encType = SWAP_UINT32(encType);       if(ENC_NONE == encType)          printf("Enc. type is NONE");       else if(ENC_WPA == encType)          printf("Enc. type is WPA");       else if(ENC_WPA2 == encType)          printf("Enc. type is WPA2");       else          assert( "Enc. type is UNKNOWN!!! Something is wrong." && 0 );    }    // read pass len    {       fread(&passLen, sizeof(passLen), 1, pFile);       passLen = SWAP_UINT16(passLen);    }    // read password    {       char* passBuffer = (char*)malloc(passLen+1);       fread(passBuffer, sizeof(char), passLen, pFile);       passBuffer[passLen] = '\0';       // ... do something with password       // print password       printf("\nPasswor is: %s", passBuffer);       free(passBuffer); // free mem    }    fclose(pFile); // close file    return EXIT_SUCCESS; }

Nije mi jasno tvoje drugo pitanje. Treba da se kreira novi fajl, isto binary?

offline
  • Pridružio: 15 Jul 2009
  • Poruke: 150

Da, treba da apenduje to u neki vec postojeci fajl. Ti si pogresno razumeo gde se nalazi enkription atag, ali hvala u svakom slucaju! Dao si mi dobru ideju pa sam zavrsio sve kako treba:

#include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <sys/stat.h> #include <sys/types.h> #define SOFTAP_CONF "softap.conf" #define ENC_NONE 0 #define ENC_WPA  1 #define ENC_WPA2 4 #define ENABLE_DEBUG 1 #if ENABLE_DEBUG #define LOG printf #else #define LOG(...) #endif int main(void) {    FILE* pFile;    char *ssidBuffer, *passBuffer;    unsigned short int ssidLen, encType, passLen;    struct stat fileStat;    if(stat(SOFTAP_CONF, &fileStat) < 0) {       printf("File %s not exist! I must exit now!\n", SOFTAP_CONF);          goto done;    }    //check if 6.th byte contain sizeof the SSID    if (fileStat.st_size < 6) {       printf("File %s not contain what I wanted! I must exit now!\n", SOFTAP_CONF);          goto done;    }          if ((pFile = fopen(SOFTAP_CONF, "rb")) == NULL) {       printf("Fail to open %s for reading! I must exit now!\n", SOFTAP_CONF);       goto done;    }    // skip to the SSID size atag and read a size of the SSID string    fseek(pFile, 5, SEEK_SET);    fread(&ssidLen, 1, 1, pFile);    if (!ssidLen) {       printf("Error: there is empty ssid! I must exit now!\n");       goto fail_done;    }    else       LOG("SSID contain %d characters\n", ssidLen);    // now read SSID string    ssidBuffer = (char *)malloc(ssidLen+1);    fread(ssidBuffer, sizeof(char), ssidLen, pFile);    ssidBuffer[ssidLen] = '\0';    LOG("SSID is: %s\n", ssidBuffer);    // skip to the encription atag    fseek(pFile, +3, SEEK_CUR);    // read encription type    fread(&encType, 1, 1, pFile);    if (ENC_NONE == encType) {       LOG("Enc. type is NONE\n");    } else if(ENC_WPA == encType) {       LOG("Enc. type is WPA\n");    } else if(ENC_WPA2 == encType) {       LOG("Enc. type is WPA2\n");    } else {       printf("Enc. type is UNKNOWN!!! Something is wrong.\n");       goto free_done;    }    // encription things    if (encType) {       // skip to the password size atag       fseek(pFile, +1, SEEK_CUR);       // read a size of the password string       fread(&passLen, 1, 1, pFile);       if (!passLen) {          printf("Error: there is an empty password! I must exit now!\n");          goto free_done;       }       else          LOG("password contain %d characters\n", passLen);       // read password       passBuffer = (char *)malloc(passLen+1);       fread(passBuffer, sizeof(char), passLen, pFile);       passBuffer[passLen] = '\0';       LOG("Passwor is: %s\n", passBuffer);    } free_done:    free(ssidBuffer);    if (encType && passLen)       free(passBuffer); fail_done:    fclose(pFile); done:    return 0; }

offline
  • Pridružio: 19 Maj 2011
  • Poruke: 297

Imas dosta greski u kodu i samo je cudo da ti uopste i radi, a ja nisam pogresio gde je enkripcijski tip!
Objasni zasto mislis da ne radi moj kod.

Sam si rekao da se prva 4 bajta ne menjaju, a i lepo se vidi na razlicitim primerima hex ispisa.
Sledeca 2 bajta predstavljaju duzinu stringa SSID-a i tvoj kod ce fejlovati ako string predje 256 karaktera jer si preskocio jedan bajt koji pripada ssidLen (tipa velicine 2 bajta):
fseek(pFile, 5, SEEK_SET); // preskocio 1 bajt vise    fread(&ssidLen, 1, 1, pFile); // ucitavas samo 1 bajt u kontenjer od 2 bajta

Dalje, opet radis isto sa duzinom stringa enkripcijskog tipa:
   fseek(pFile, +3, SEEK_CUR); // ??? preskaces dzaba 3 bajta    // read encription type    fread(&encType, 1, 1, pFile); // ucitavas 1 bajt u kontenjer od 2 bajta, btw. koji treba sam da bude 4 bajta odnosno drugi tip promenjljive

I dalje opet isto preskaces za pass....

U prevodu tvoj kod je tempirana bomba koja ce jednog dana da ti explodira u lice.

Ko je trenutno na forumu
 

Ukupno su 572 korisnika na forumu :: 13 registrovanih, 0 sakrivenih i 559 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: branko7, dejoglina, djordje92sm, DonRumataEstorski, dragoljub11987, mihajlot2013, Miskohd, pbg12345, Rabit, Tas011, vrlenija, zhuki8, zlaya011