Porovnání EXE souborů   otázka

VB.NET

Zdravim, potřebuji zkontrolovat zda se exe soubor u klienta shoduje s exe souborem na serveru, pokud ne odeslat ho klientovi...

díky

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Já na tyhle záležitosti používám obyčejný vb script. Podle mne to je nejrychlejší a nejjednodušší. Určitě to jde i z VB.NET, ale to neumím a celkem by mě to i zajímalo, jak využít jazyka z vbs v prostředí VB.NET. Tady je malý příklad, jak ve vbs zjistit verzi např. dll. Funguje to určitě i na .exe.

Set objFSO = CreateObject("Scripting.FileSystemObject")
Wscript.Echo objFSO.GetFileVersion("c:\windows\system32\scrrun.dll")

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pokud si chcete být na 100% jist, že se dané soubory shodují, porovnejte MD5 hash obou souborů. Použít na to můžete freeware nástroj MD5sums nebo si napsat vlastní jednoduchou konzolovou aplikaci s využitím System.Security.Cryptography.MD5CryptoServiceProvider.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

MD5 hashem nejde na 100% urcit, jestli se dane soubory shoduji.

Pocitejte se mnou: md5 hash ma tusim 16B; soubor muze mit libovolnou velikost, pokud vezmeme napr. 10MB soubor, tak 10*2^20/16 je 655360, takze 1 hash odpovida 655360 variacim 10MB souboru. Hashe jsou sice delany chytre, aby neslo jednoduse najit nejaky zdrojovy retezec k zadanemu hashi, kazdopadne na 100% porovnani souboru to neni dobre. A navic odhahuji, ze vygenerovani hashe bude pomalejsi nez proste porovnani vsech znaku, nebot vygenerovani hashe musi previst vsechny znaky a pak s nimi jeste nejak carovat nejak carovat, kdezto proste porovanavani jednoduse porovnava bajty, dokud nenarazi na rozdil nebo konec souboru.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Otázkou je, jak přesně potřebujete vědět, že jsou soubory jiné. Pokud by vám třeba stačilo datum poslední změny souboru na serveru, tak to je celkem v pohodě. Ale pokud potřebujete naprosto přesné porovnání, jestli jsou soubory stejné, tak je imho musíte vždycky stáhnout a porovnat. Pak už je ale vlastně nemusíte porovnávat, stačí je vždy stáhnout a nahradit s nimi ty potencionálně staré, protože když budou stejné, nic nezkazíte, a když nebudou, tak by se to stejně provedlo.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Není to sice 100% ale šance že dojde ke kolizi je tak malá, že můžeme klidně tvrdit 100%. Jestli nevyhovuje MD5, dá se použít SHA1 u které je pravděpodobnost kolize ještě menší...

Co se týče rychlosti hešování, tak to není o mnoho pomalejší než přečíst celý soubor znak po znaku. Rychlost se může projevovat až u souborů v řádu desítek GB.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

jednoduse porovnava bajty

A čo to zdržanie, keďže na to porovnanie je predsa nutné mať oba súbory na jednom PC.A keď ma niekto náhodou internet s 2GB traffic limitom ? A každý deň sťahovať nejakých 10MB kvôli porovnaniu ? Netrebalo by myslieť aj na takých ? MD5 síce nie je veľmi použiteľné, ale keď sa na dvohch PC urobí SHA512 hash a ten sa pošle na server, máme malú šancu, že to niekto obíde. Ja som si chcel zjednodušiť hru, ktorá mala pre každý súbor ešte jeho pár - nejaký osolený hash, netuším aký a nebol som schopný jedninej zmeny, proste 1 bit mimo a hash je pekne ďaleko.

Keď chcete počítať, 10 * 2^20/64 je okolo 160000 možností, ale uhádnuť tú pravú, to vás dokonale zdrží na dlho.Po druhé keď niekto bude chcieť zmeniť veľkosť súboru tak radšej ani nepočítam. K tomu aj keď hráč má potuchy o tom, že čo je hash, vie si zistíť typ hashu podľa súboru a hashu, stačí súbor obklopiť jeho názvom zo začiatku aj konca(osoliť) a prehnať cez SHA512Managed a bude mať zo zmeny súboru zlé sny a aj keď nie, to by som chcel vidieť takého, čo by prelomil nejaké číslo, o ktorom vie len toľko, že je to hash.

Napadol ma aj ďalší podfuk.Pre súbor spočítať priemer z kontrolných súčtov jednotlivých bajtov a pridať za hash.

Bude to pomalé ale dôležitejšie je, že koho napadne, že je tam hash keď to bude mať 65 bajtov ? A takto by sa dalo pokračovať až do ∞.Resp. po inteligenciu toho, kto to vymýšľa.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ten další podfuk je totální kravina, každého napadne, že je tam bajt navíc a to máte 256 možností maximálně. To je jako když plivnete do moře.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Domníváte se, že onee je adekvátní název, který stručně a výstižně popisuje, čeho se váš dotaz týká. To je sakra tak těžké se na 5 sekund zamyslet a napsat téma Porovnání EXE souborů nebo něco podobného?

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

..No a jak tedy porovnat ve VBS dva obecné binární soubory? V System32 je prográmek "comp.exe", ale ten má po vykonání dotaz na porovnání dalších fajlů, a tak se pro automatické porovnávání moc nehodí. Stačila by dávka, která vrací errcode 0 při úspěchu a cokoliv jiného při chybě, ale nevím jak na to.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Musíte ručně - otevřít si dva FileStreamy, číst třeba po 64 kB a porovnávat pole.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback