Poslao: 03 Dec 2013 22:02
|
offline
- savan2
- Građanin
- 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 .
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. Hvala vam puno!
|
|
|
Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
|
|
Poslao: 03 Dec 2013 22:14
|
offline
- morando
- Građanin
- 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.
|
|
|
|
Poslao: 03 Dec 2013 22:27
|
offline
- savan2
- Građanin
- 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....
|
|
|
|
Poslao: 03 Dec 2013 22:38
|
offline
- morando
- Građanin
- 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;
}
|
|
|
|
Poslao: 03 Dec 2013 22:59
|
offline
- savan2
- Građanin
- 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?
|
|
|
|
|
Poslao: 03 Dec 2013 23:05
|
offline
- savan2
- Građanin
- Pridružio: 15 Jul 2009
- Poruke: 150
|
Evo i dodao sam par nula u lozinku za svaki slucaj -> d-h.st/PkW
Hvala ti puno!
|
|
|
|
Poslao: 03 Dec 2013 23:41
|
offline
- morando
- Građanin
- 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?
|
|
|
|
Poslao: 04 Dec 2013 14:51
|
offline
- savan2
- Građanin
- 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;
}
|
|
|
|
Poslao: 04 Dec 2013 16:01
|
offline
- morando
- Građanin
- 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.
|
|
|
|