Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Pronaci 4 byte u fajlu?

[es] :: Asembler :: Pronaci 4 byte u fajlu?

Strane: 1 2

[ Pregleda: 4547 | Odgovora: 20 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Ramirez

Član broj: 13160
Poruke: 318
*.ptt.yu.



Profil

icon Pronaci 4 byte u fajlu?24.12.2004. u 17:18 - pre 235 meseci
Zanima me kako da pronadjem 4 bajta u nekom fajlu. Znam njihove HEX vrednosti i ako utvrdim da oni postoje zelim da iskopiram fajl, ali ne od pocetka vec od pocetka trazenih 4 bajta? Nadam se da sam bio jasan?

Pitanje sam postavio ovde jer bez obzira na to sto radim u C-u koristim iskljucivo win32 API, pa mi je logicnije da cu ovde naci odgovor.

@Mikky
Upravo citam tvoj post na win32asmboard kako najbrze uporediti dva fajla po sadrzaju (tako da znam da imas resenje mog problema)... nastavljam da trazim... :)

E sada sam se setio da nakon pronalazenja ta 4 bajta ne mora da se kopira fajl, vec moze da se izbrise sve ono sto ide od pocetka pa do tih 4 bajta... ali tek to ne umem da uradim :-P
 
Odgovor na temu

Sundance

Član broj: 7510
Poruke: 2559
*.cmu.carnet.hr.



Profil

icon Re: Pronaci 4 byte u fajlu?24.12.2004. u 20:10 - pre 235 meseci
MapViewOfFile + repnz scasd + UnmapViewOfFile

Diskovni I/O je bar za koji red velicine sporiji u odnosu na memorijski.
 
Odgovor na temu

Mikky

Član broj: 18
Poruke: 1563
213.244.197.*

ICQ: 44582291


+58 Profil

icon Re: Pronaci 4 byte u fajlu?24.12.2004. u 21:31 - pre 235 meseci
OK znaci nadjes fajl pa ides nesto tipa

[pseudo code]
hFile = OpenFile();
pMem = GlobalAlloc(GetFileSize(hFile));
ReadFile(hFile,pMem);

// pretrazi pMem u potrazi za ta 4 bajta
mySearchMem(pMem);

if (bNasao)
{
SetFilePointer(hFile, pNadjena4Bajta + 4 - pMem)
SetEndOfFile(hFile);
}

GlobalFree(pMem);
CloseHandle(hFile)
[/pseudo code]

mySearchMem - tvoja funkcija koja pretrazuje memoriju za ta 4 bajta, predlog je dao Sundance ili pogledaj BinSearch() iz MASM32 biblioteke.
SetEndOfFile() je funkcija koja ti treba da izbrises sve iz fajla posle nekog bajta.
SetFilePointer() postavlja pointer na bajt u fajlu posle koga ces da zelis da SetEndOfFile() sve izbaci.

-I know UNIX, PASCAL, C, FORTRAN,
COBOL, and nineteen other high-tech
words.
 
Odgovor na temu

Sundance

Član broj: 7510
Poruke: 2559
*.cmu.carnet.hr.



Profil

icon Re: Pronaci 4 byte u fajlu?25.12.2004. u 00:23 - pre 235 meseci
Memory-mapped files su izmisljeni da bismo se rijesili ovakvih workaround-ova :)

Ako BinSearch() radi klasicno binarno pretrazivanje tada nece biti primjenjivo jer tesko da su DWORD-i u slucajnoj binarnoj datoteci sortirani :) Jednostavno ces trebati piciti kroz petlju i usporedjivati...
 
Odgovor na temu

Mikky

Član broj: 18
Poruke: 1563
213.244.197.*

ICQ: 44582291


+58 Profil

icon Re: Pronaci 4 byte u fajlu?25.12.2004. u 00:57 - pre 235 meseci
OK ja licno nisam koristio MMF jer velike fajlove nemogu da mapiram cele ako nemam dovoljno memorije, mada je to sve isto po pitanju brzine, bilo da radims sa MMF ili klasicno ReadFile() tako da je sve jedno.

A on je rekao da mu trebaju 4 odredjena bajta iz fajla, pretpostavio sam da je to jedan DWORD tako da nevidim zasto trebaju da budu sortirani? Moze komotno da koristi BinSearch() ili tvoju metodu ali ova fja je vec optimizovana by some bad-ass guru (+ ima bug koji sam primetio pa nekad pravi GPF :))
-I know UNIX, PASCAL, C, FORTRAN,
COBOL, and nineteen other high-tech
words.
 
Odgovor na temu

Sundance

Član broj: 7510
Poruke: 2559
*.cmu.carnet.hr.



Profil

icon Re: Pronaci 4 byte u fajlu?25.12.2004. u 01:12 - pre 235 meseci
Ako BinSearch() == binarno pretrazivanje onda MORAJU biti sortirani. Ako je neka optimizirana implementacija obicnog repnz scasd, onda ne moraju :)

Za MMF ne moras koristiti cijele datoteke, vec mozes mapirati dio po dio (cini mi se da je potrebna ona Ex verzija).

Najbolje nek sam proba pa nek vidi sta mu vise pase...
 
Odgovor na temu

Ramirez

Član broj: 13160
Poruke: 318
*.ptt.yu.



Profil

icon Re: Pronaci 4 byte u fajlu?25.12.2004. u 11:34 - pre 235 meseci
OK dobio sam neku ideju ali mi neke stvari i dalje nisu jasne... Ako koristim MMF (sto planiram) ceo fajl ce se nalaziti u memoriji... Da li ja moram da se krecem kroz nju za po jedan bajt for petljom u potrazi za prvim bajtom pa da onda uporedim sledeca tri bajta sa vrednostima koje trazim??? Ako su 4 bajta koje trazim 01020304 onda ce oni u memoriji biti 04030201 zbog Little Endiana???

Kada budem probao verovatno cu imati odgovore na ova pitanja ali ono sto me najvise zbunjuje je to kako da iskopiram fajl...

Da li to treba da uradim sam, opet koristeci for petlju krecuci se od svojih 4 bajta pa do EOF i ako je tako koliki buffer da koristim. Verovatno 4k posto je to default za OS. Ili treba da pozovem CopyFile sa FilePonterom koji je setovan na prvi bajt od kog zelim da kopiram (u mom slucaju prvi bajt od 4 koje trazim)???

Opet napominjem da radim u C-u (iskljucivo win32 API) posto mi se cini da ste taj deo propustili (mozda gresim)
 
Odgovor na temu

Sundance

Član broj: 7510
Poruke: 2559
*.cmu.carnet.hr.



Profil

icon Re: Pronaci 4 byte u fajlu?25.12.2004. u 11:49 - pre 235 meseci
Ako ces koristiti usporedjivanje onda operiraj nad DWORD-ima, a ne nad bajtovima jer, em su operacije nad njima brze, em je trivijalno dokazati da tako smanjujes broj false positive-a za 2^32 - 2^8. Mozda postoji brza operacija preko MMX ili floating point registara, browsaj malo win32asmboard, siguran sam da je netko napravio perverzno optimiziranu verziju (i pejstaj ga ovdje :)

Ako radis u C-u onda zaboravi na endianess.

Sto se tice spremanja datoteke, Mikky ti je vec dao odgovor: SetEndOfFile+SetFilePointer. Mozes iskopirati i staru datoteku u novu sa "odsjecenim" krajem. Ne znam napamet da li mozes u letu napravi truncate datoteke, browsaj malo MSDN. Probaj na nekom test primjeru, brzo ces vidjeti jeli radi ili ne :)
 
Odgovor na temu

Ramirez

Član broj: 13160
Poruke: 318
*.ptt.yu.



Profil

icon Re: Pronaci 4 byte u fajlu?25.12.2004. u 14:06 - pre 235 meseci
Evo ja obecavam da necu imati novih postova do sutra... ali previse uopsteno mi govoris... pseudo code bi bio od velike pomoci...

Ja odlazim da proucim Iczelionov Tut 13, da pogledam CreateFileMapping, MapViewOfFile i UnmapViewOfFile...

Kako vrsiti operacije nad DWORD-ima... da li treba da nadjem prvi bajt pa da onda odatle uzmem DWORD i uporedim ga sa 01020304 ili konstantno da ucitavam DWORDE i da ih uporedjujem sa ovom vrednoscu.... ovo mi je najvaznije i najnejasnije... pseudo please :)

Ne zelim da odsecem kraj fajla.... vec pocetak... to me niste razumeli... zato mi SetEndOfFile ne pomaze... znaci treba mi kopiranje od bajta koji je prvi bajt od 4 koje trazim pa do kraja fajla...

od ABABABABAB01020304CDCDCDCD treba da dobijem 01020304CDCDCDCD
 
Odgovor na temu

drizz
.hr

Član broj: 24843
Poruke: 25
*.net.t-com.hr.

Sajt: drizz.has.it


Profil

icon Re: Pronaci 4 byte u fajlu?26.12.2004. u 17:58 - pre 235 meseci
samo mala napomena:
za repnz scasd ta 4 byte moraju biti na dword granici (adresa mod 4 == 0)
 
Odgovor na temu

Vojislav Milunovic

Član broj: 25
Poruke: 2117
195.252.86.*



+1 Profil

icon Re: Pronaci 4 byte u fajlu?26.12.2004. u 22:37 - pre 235 meseci
Ja bi to po starisnki sa _lopen _llseek i normalno preko globalAlloc i onda na svaki byte gledam da li ima ta 4 byte =))
 
Odgovor na temu

Ramirez

Član broj: 13160
Poruke: 318
*.ptt.yu.



Profil

icon Re: Pronaci 4 byte u fajlu?29.12.2004. u 11:20 - pre 235 meseci
Code:

        hFileRead=CreateFile(FileData.cFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, NULL);
        hMapFile=CreateFileMapping(hFileRead, NULL, PAGE_READONLY, 0, 0, NULL);
        hFileWrite=CreateFile(szNewPath, GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_ARCHIVE, NULL);
        hMemory=MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 0);

        //ovde treba ubaciti moje kopiranje

        dwSize=GetFileSize(hFileRead, NULL);
        WriteFile(hFileWrite, hMemory, dwSize, &dwSizeWritten, NULL);
        UnmapViewOfFile(hMemory);
        CloseHandle(hMemory);
        hMemory=NULL;
        CloseHandle(hFileRead);
        CloseHandle(hFileWrite);


hMemory je HANDLE. Tako je u C-u dok je u ASM-u to DWORD? Nije mi jasno sta mi se tu nalazi ako je to HANDLE, da li je to prvi bajt sadrzaja fajla ili je u pitanju adresa prvog bajta... Ovaj primer kopira ceo fajl na neku drugu lokaciju... ja sada moram da pronadjem ta 4 bajta... kako se krecem kroz hMemory? I kada budem uspeo da ih pronadjem necu znati koju velicinu (dwSize) treba da iskopiram jer novonastali fajl nece biti iste velicine vec ce biti manji za X bajta???

I jos jednom: molim vas bez scasb repns bz i ostalih asm instrukcija :-P
 
Odgovor na temu

Vojislav Milunovic

Član broj: 25
Poruke: 2117
*.beotel.net.



+1 Profil

icon Re: Pronaci 4 byte u fajlu?29.12.2004. u 21:12 - pre 235 meseci
HANDLER ti je isto sto i 4byte ili DWORD i tako ga i treba posmatrati. Moze da bude adresa, ali moze da bude i file descriptor koji vraca recimo _fopen, sve zavisi u kom ga kontekstu koristis. Jedno mi nikad nece biti jasno sto u Windowsu se loze ti koji su ga pravili da neke banalne stvari zovu na sasvim drugi nacin =)))

U tvom slucaju kako kaze WinAPI ----
Code:

Return Values

If the function succeeds, the return value is the starting address of the mapped view.
If the function fails, the return value is NULL


Znaci hMemory ti pokazuje na mapiran fajl, tacnije on pokazuje na sam pocetak mapiranog fajla iliti na prvi byte fajla =)) znaci handle+velicina_od(file) bi trebalo da bude kraj fajla mapiranog u memoriji =))


 
Odgovor na temu

Sundance

Član broj: 7510
Poruke: 2559
*.cmu.carnet.hr.



Profil

icon Re: Pronaci 4 byte u fajlu?29.12.2004. u 21:26 - pre 235 meseci
Citat:
Vojislav Milunovic: HANDLE ti je isto sto i 4byte ili DWORD


Na tvojoj AMD64 pili HANDLE je 8byte ili QWORD :)

Citat:
Moze da bude adresa, ali moze da bude i file descriptor koji vraca recimo _fopen, sve zavisi u kom ga kontekstu koristis. Jedno mi nikad nece biti jasno sto u Windowsu se loze ti koji su ga pravili da neke banalne stvari zovu na sasvim drugi nacin =)))


HANDLE != unix-style fd != libc FILE, Windows ima pravu ring3 razinu apstrakcije a neke gluposti kao neki, hm, inferiorni OS-evi :)
 
Odgovor na temu

Vojislav Milunovic

Član broj: 25
Poruke: 2117
*.beotel.net.



+1 Profil

icon Re: Pronaci 4 byte u fajlu?31.12.2004. u 16:52 - pre 235 meseci
Pa da 8byte kod mene =)) Ali još ne mogu da koristim jer nemam win64, barem još nije stigao na naše tezge ako ga uopšte ima =))))

JA to sve tretiram kao 4byte jer ne kapiram kako 4byte može da bude nešto drugo do 4byte =)))
 
Odgovor na temu

Ramirez

Član broj: 13160
Poruke: 318
*.ptt.yu.



Profil

icon Re: Pronaci 4 byte u fajlu?12.01.2005. u 20:46 - pre 234 meseci
Code:

char ReadBuffer[4];
do
{
    if(ReadFile(hFileRead, ReadBuffer, sizeof(ReadBuffer), &dwBytesRead, NULL))
    {
        //kopiranje sadrzaja fajla
    }
}
while(dwBytesRead==4);


ova petlja se krece po 4 bajta... nemam pojma kako da se krecem po jedan bajt??? i kako da uporedim sadrzaj buffera sa 0x4D502B07 (4 bajta koje trazim)???

MOLIM VAS samo odgovori na moja pitanja!
 
Odgovor na temu

Vojislav Milunovic

Član broj: 25
Poruke: 2117
195.252.85.*



+1 Profil

icon Re: Pronaci 4 byte u fajlu?12.01.2005. u 21:32 - pre 234 meseci
Evo kako ja pretražujem kernel32.dll za nekim instrukcijama =) kod u MASM
Code:

invoke GetModuleHandle, ADDR dll
    mov esi, eax
    @@:
      xor eax, eax
      lodsw
      .if ax == opcode.opcode
        push esi
        sub esi, 2
        invoke wsprintf, ADDR text, ADDR format, ADDR opcode.name1, esi
        invoke StdOut, ADDR text
        pop esi
       .else
         dec esi
       .endif
    jmp @B


Samo sto ces zameniti sledece :
lodsw sa lodsd
sub esi, 2 sa sub esi,4
dec esi sa sub esi, 3
i if ax == opcode.opcode sa .if eax == (sta god) =)))
i to ti je cela mudrost =)
i takodje mi je podesen SEH jer acces violation znaci da sam izleteo iz kernela i to fatam =)

[Ovu poruku je menjao Vojislav Milunovic dana 12.01.2005. u 22:36 GMT+1]
 
Odgovor na temu

Ramirez

Član broj: 13160
Poruke: 318
*.ptt.yu.



Profil

icon Re: Pronaci 4 byte u fajlu?12.01.2005. u 21:35 - pre 234 meseci
Po koji put treba da kazem: RADIM U C-u!!!
 
Odgovor na temu

Vojislav Milunovic

Član broj: 25
Poruke: 2117
195.252.85.*



+1 Profil

icon Re: Pronaci 4 byte u fajlu?12.01.2005. u 21:43 - pre 234 meseci
Epa problem je u tome sto ti procitas 4 byte i file pointer se pomeri napred za 4 byte recimo: da trazis ove bytove : [2][3][4][5]
[1][2][3][4][5][6][7][8]

Sa ovim tvoj algoritmom ih neces naci jer ce u buf da se ucitaju prva 4 byte sto su [1][2][3][4] pa onda sledeca 4 sto automatski preskace trazena 4 byte.

Resenje je u sledecem ili da mapiras fajl u memoriju kao sto ti je sundance rekao ili da koristis malo neelgantno resenje (zbog velikog broja poziva iste funkcije)
SetFilePointer(fd, -3, NULL, FILE_CURRENT);...
Tako da ti preporucujem da mapiras fajl i da skeniras byte po byte.
Algoritam za to bi isao kao sto sam gore napisao u ASM =) Znam da znas asm pa ne bi trebalo da bude problem da to implementiras u C, gde bi esi bio pointer na pocetak mapiranog fajla =))


Sto se tice same pretrage to je barem prosto, 4 byte ucitas u neku int promenljivu i nju poredis sa trazena 4 byte
ako se ne varam to bi islo ovako :
Code:

while (ReadFile(fd, &moj_int, 4, &bRead)){
if (moj_int = ono_sto_trazis){
    SetFilePointer(fd, -4, NULL, FILE_CURRENT);
    kopiraj kod
    break;
 }else
  SetFilePointer(fd, -3, NULL, FILE_CURRENT);
}

ja mislim takodje da ces morati da izvrnes ta 4 byte buduci da je x86 little endian... Tako da ako trazis 0x12345678 poredi dobijeni int sa 0x78563412 =)))

Ili pak ukoliko se odlucis za elegantnije resenje koje ja preporucujem to bi islo ovako nesto (ne ljuti se za omaske u C sintaksi jer je davno nisam koristio taj jezik):

Code:

char *file="file.bin";
int fd, temp, *memptr;
int *test, bla=0x78563412, fsize;
fd=CreateFile(file,GENERIC_READ+GENERIC_WRITE,NULL,NULL,OPEN_EXISTING,NULL,NULL);
temp=CreateFileMapping(fd,0,PAGE_READWRITE,0,0,0);
memptr=MapViewOfFile(temp,FILE_MAP_ALL_ACCESS,0,0,0);
fsize=GetFileSize, fd, NULL

test=memptr;

while (test != ((char *)test+fsize)){
  if (*test == bla){
     kopiraj kod;
    break;
  }else
    (char *)test=(char *)test+1;
}

Ako se ne varam test=(char *)test+1 bi trebalo da pomeri adresu za 1 byte napred, jer koliko me secanje sluzi int * + 1 = +4 byte jer se C uzima (1+*sizeof(pointer_type))

Nadam se da sam pomogao donekle

[Ovu poruku je menjao Vojislav Milunovic dana 12.01.2005. u 23:23 GMT+1]
 
Odgovor na temu

Ramirez

Član broj: 13160
Poruke: 318
*.ptt.yu.



Profil

icon Re: Pronaci 4 byte u fajlu?12.01.2005. u 22:22 - pre 234 meseci
OK sada si mi vec pomogao... jedino sto mi jos nije jasno je kako da se krecem kroz fajl koji sam mapirao... ja imam HANDLE koji mi MapViewOfFile vraca... ali kada ja pozovem ReadFile sa tim handle-om nista se ne desava ili se ne desava ono sto ja zelim...

Dakle kako da se pomeram AAAAA poludecu :-P
 
Odgovor na temu

[es] :: Asembler :: Pronaci 4 byte u fajlu?

Strane: 1 2

[ Pregleda: 4547 | Odgovora: 20 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.