Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.08.31;
Скачать: [xml.tar.bz2];

Вниз

Как расчитать MD5 - хеш самого себя (Приложения)   Найти похожие ветки 

 
Дима   (2008-07-22 20:44) [0]

Привет Уважаемые!

Есть консольное приложение, в нем использую функцию по расчету MD5:
function md5(s: string): string;
...


Использую так:
var
FileName: String;
...
Constr
Fnam: "MyApp.exe";
...
FileName := Md5(ChangeFileExt(ExtractFileName(Fnam), ""));

Но это же расчет MD5 Имени файла а не самого приложения!

Как мне реализовать сей Сабж?

С Уважением Дима.


 
Сергей М. ©   (2008-07-22 21:31) [1]


> Как мне реализовать сей Сабж?
>


А никак.

MD5 приложения - это нонсенс.


> консольное


Да хоть розовое с бантиком.

К чему тут упоминание о "консольности" чего-то там ?


 
Дима   (2008-07-22 21:40) [2]


>
> К чему тут упоминание о "консольности" чего-то там ?


Сорри, теперь сам понял что сморозил глупость!

Поправьте если что не так! Просто в своем приложении хочу расчитать MD5-хеш!
Но не знаю как реализовать?

То есть Имя приложения к примеру неизменно, а размер может быть подправлен кем то! И получится не очень хорошо. Вот и есть желание заценить при изменении новый MD5-хеш.


 
Сергей М. ©   (2008-07-22 21:42) [3]


> Имя приложения к примеру неизменно, а размер


Сколько ж можно морозитьь глупость ?

У приложения нет и не может быть размера.

Размер может быть у файла.

Приложение <> Файл.


 
Дима   (2008-07-22 21:44) [4]


> Размер может быть у файла.


Корректирую 2 глупость! Применительно к файлу - как?


 
Сергей М. ©   (2008-07-22 21:46) [5]


> размер может быть подправлен кем то! И получится не очень
> хорошо


Чтой-то вдруг ?

Ну "подправили" этот "размер" на байт-другой - тебе что, заплохело ? Ночь наполет спать что ли не будешь - все об этих паршивых двух байтах будешь думать ?)


 
Сергей М. ©   (2008-07-22 21:47) [6]

Что мешает тебе прочитать содержимое файла в буфер строковой переменной ?


 
Дима   (2008-07-22 21:56) [7]


> Что мешает тебе прочитать содержимое файла в буфер строковой
> переменной ?

Нехватка знаний!, так как я еще Начинающий.

Морозю глупость №3:
А что Вам Премного-Уважаемый, мешает показать в коде, как сие Реализуется?


 
Дима   (2008-07-22 22:00) [8]

...
var
 Fi: file;
 pBuf: PChar;
begin
 Assign(Fi, FileName);
 Reset(Fi, 1);
 GetMem(pBuf, BufSize);
...

Так?


 
Palladin ©   (2008-07-22 22:17) [9]

что именно так?
открытие файла - так
взятие памяти - похоже не так


 
Anatoly Podgoretsky ©   (2008-07-22 22:17) [10]

function md5(s: string): string;

Это что и это чье и почему параметр string


 
Дима   (2008-07-22 22:20) [11]


> Это что и это чье и почему параметр string


Привожу листинг всей функции ниже!

// Подчет контрольной суммы Md5 hex

function md5(s: string): string;
var a: array[0..15] of byte;
 i: integer;
 LenHi, LenLo: longword;
 Index: DWord;
 HashBuffer: array[0..63] of byte;
 CurrentHash: array[0..3] of DWord;

 procedure Burn;
 begin
   LenHi := 0; LenLo := 0;
   Index := 0;
   FillChar(HashBuffer, Sizeof(HashBuffer), 0);
   FillChar(CurrentHash, Sizeof(CurrentHash), 0);
 end;

 procedure Init;
 begin
   Burn;
   CurrentHash[0] := $67452301;
   CurrentHash[1] := $EFCDAB89;
   CurrentHash[2] := $98BADCFE;
   CurrentHash[3] := $10325476;
 end;

 function LRot32(a, b: longword): longword;
 begin
   Result := (a shl b) or (a shr (32 - b));
 end;

 procedure Compress;

 var
   Data: array[0..15] of dword;
   A, B, C, D: dword;
 begin
   Move(HashBuffer, Data, Sizeof(Data));


 
Дима   (2008-07-22 22:20) [12]

A := CurrentHash[0];
   B := CurrentHash[1];
   C := CurrentHash[2];
   D := CurrentHash[3];

   A := B + LRot32(A + (D xor (B and (C xor D))) + Data[0] + $D76AA478, 7);
   D := A + LRot32(D + (C xor (A and (B xor C))) + Data[1] + $E8C7B756, 12);
   C := D + LRot32(C + (B xor (D and (A xor B))) + Data[2] + $242070DB, 17);
   B := C + LRot32(B + (A xor (C and (D xor A))) + Data[3] + $C1BDCEEE, 22);
   A := B + LRot32(A + (D xor (B and (C xor D))) + Data[4] + $F57C0FAF, 7);
   D := A + LRot32(D + (C xor (A and (B xor C))) + Data[5] + $4787C62A, 12);
   C := D + LRot32(C + (B xor (D and (A xor B))) + Data[6] + $A8304613, 17);
   B := C + LRot32(B + (A xor (C and (D xor A))) + Data[7] + $FD469501, 22);
   A := B + LRot32(A + (D xor (B and (C xor D))) + Data[8] + $698098D8, 7);
   D := A + LRot32(D + (C xor (A and (B xor C))) + Data[9] + $8B44F7AF, 12);
   C := D + LRot32(C + (B xor (D and (A xor B))) + Data[10] + $FFFF5BB1, 17);
   B := C + LRot32(B + (A xor (C and (D xor A))) + Data[11] + $895CD7BE, 22);
   A := B + LRot32(A + (D xor (B and (C xor D))) + Data[12] + $6B901122, 7);
   D := A + LRot32(D + (C xor (A and (B xor C))) + Data[13] + $FD987193, 12);
   C := D + LRot32(C + (B xor (D and (A xor B))) + Data[14] + $A679438E, 17);
   B := C + LRot32(B + (A xor (C and (D xor A))) + Data[15] + $49B40821, 22);

   A := B + LRot32(A + (C xor (D and (B xor C))) + Data[1] + $F61E2562, 5);
   D := A + LRot32(D + (B xor (C and (A xor B))) + Data[6] + $C040B340, 9);
   C := D + LRot32(C + (A xor (B and (D xor A))) + Data[11] + $265E5A51, 14);
   B := C + LRot32(B + (D xor (A and (C xor D))) + Data[0] + $E9B6C7AA, 20);
   A := B + LRot32(A + (C xor (D and (B xor C))) + Data[5] + $D62F105D, 5);
   D := A + LRot32(D + (B xor (C and (A xor B))) + Data[10] + $02441453, 9);
   C := D + LRot32(C + (A xor (B and (D xor A))) + Data[15] + $D8A1E681, 14);
   B := C + LRot32(B + (D xor (A and (C xor D))) + Data[4] + $E7D3FBC8, 20);
   A := B + LRot32(A + (C xor (D and (B xor C))) + Data[9] + $21E1CDE6, 5);
   D := A + LRot32(D + (B xor (C and (A xor B))) + Data[14] + $C33707D6, 9);
   C := D + LRot32(C + (A xor (B and (D xor A))) + Data[3] + $F4D50D87, 14);
   B := C + LRot32(B + (D xor (A and (C xor D))) + Data[8] + $455A14ED, 20);
   A := B + LRot32(A + (C xor (D and (B xor C))) + Data[13] + $A9E3E905, 5);
   D := A + LRot32(D + (B xor (C and (A xor B))) + Data[2] + $FCEFA3F8, 9);
   C := D + LRot32(C + (A xor (B and (D xor A))) + Data[7] + $676F02D9, 14);
   B := C + LRot32(B + (D xor (A and (C xor D))) + Data[12] + $8D2A4C8A, 20);

   A := B + LRot32(A + (B xor C xor D) + Data[5] + $FFFA3942, 4);
   D := A + LRot32(D + (A xor B xor C) + Data[8] + $8771F681, 11);
   C := D + LRot32(C + (D xor A xor B) + Data[11] + $6D9D6122, 16);
   B := C + LRot32(B + (C xor D xor A) + Data[14] + $FDE5380C, 23);
   A := B + LRot32(A + (B xor C xor D) + Data[1] + $A4BEEA44, 4);
   D := A + LRot32(D + (A xor B xor C) + Data[4] + $4BDECFA9, 11);
   C := D + LRot32(C + (D xor A xor B) + Data[7] + $F6BB4B60, 16);
   B := C + LRot32(B + (C xor D xor A) + Data[10] + $BEBFBC70, 23);
   A := B + LRot32(A + (B xor C xor D) + Data[13] + $289B7EC6, 4);
   D := A + LRot32(D + (A xor B xor C) + Data[0] + $EAA127FA, 11);
   C := D + LRot32(C + (D xor A xor B) + Data[3] + $D4EF3085, 16);
   B := C + LRot32(B + (C xor D xor A) + Data[6] + $04881D05, 23);
   A := B + LRot32(A + (B xor C xor D) + Data[9] + $D9D4D039, 4);
   D := A + LRot32(D + (A xor B xor C) + Data[12] + $E6DB99E5, 11);
   C := D + LRot32(C + (D xor A xor B) + Data[15] + $1FA27CF8, 16);
   B := C + LRot32(B + (C xor D xor A) + Data[2] + $C4AC5665, 23);

   A := B + LRot32(A + (C xor (B or (not D))) + Data[0] + $F4292244, 6);
   D := A + LRot32(D + (B xor (A or (not C))) + Data[7] + $432AFF97, 10);
   C := D + LRot32(C + (A xor (D or (not B))) + Data[14] + $AB9423A7, 15);
   B := C + LRot32(B + (D xor (C or (not A))) + Data[5] + $FC93A039, 21);
   A := B + LRot32(A + (C xor (B or (not D))) + Data[12] + $655B59C3, 6);
   D := A + LRot32(D + (B xor (A or (not C))) + Data[3] + $8F0CCC92, 10);
   C := D + LRot32(C + (A xor (D or (not B))) + Data[10] + $FFEFF47D, 15);
   B := C + LRot32(B + (D xor (C or (not A))) + Data[1] + $85845DD1, 21);
   A := B + LRot32(A + (C xor (B or (not D))) + Data[8] + $6FA87E4F, 6);
   D := A + LRot32(D + (B xor (A or (not C))) + Data[15] + $FE2CE6E0, 10);
   C := D + LRot32(C + (A xor (D or (not B))) + Data[6] + $A3014314, 15);
   B := C + LRot32(B + (D xor (C or (not A))) + Data[13] + $4E0811A1, 21);
   A := B + LRot32(A + (C xor (B or (not D))) + Data[4] + $F7537E82, 6);
   D := A + LRot32(D + (B xor (A or (not C))) + Data[11] + $BD3AF235, 10);
   C := D + LRot32(C + (A xor (D or (not B))) + Data[2] + $2AD7D2BB, 15);
   B := C + LRot32(B + (D xor (C or (not A))) + Data[9] + $EB86D391, 21);


 
Дима   (2008-07-22 22:22) [13]

Inc(CurrentHash[0], A);
   Inc(CurrentHash[1], B);
   Inc(CurrentHash[2], C);
   Inc(CurrentHash[3], D);
   Index := 0;
   FillChar(HashBuffer, Sizeof(HashBuffer), 0);
 end;

 procedure Update(const Buffer; Size: longword);
 var
   PBuf: ^byte;
 begin
   Inc(LenHi, Size shr 29);
   Inc(LenLo, Size * 8);
   if LenLo < (Size * 8) then
     Inc(LenHi);
   PBuf := @Buffer;
   while Size > 0 do
   begin
     if (Sizeof(HashBuffer) - Index) <= DWord(Size) then
     begin
       Move(PBuf^, HashBuffer[Index], Sizeof(HashBuffer) - Index);
       Dec(Size, Sizeof(HashBuffer) - Index);
       Inc(PBuf, Sizeof(HashBuffer) - Index);
       Compress;
     end
     else
     begin
       Move(PBuf^, HashBuffer[Index], Size);
       Inc(Index, Size);
       Size := 0;
     end;
   end;
 end;

 procedure Final(var Digest);
 begin
   HashBuffer[Index] := $80;
   if Index >= 56 then Compress;
   PDWord(@HashBuffer[56])^ := LenLo;
   PDWord(@HashBuffer[60])^ := LenHi;
   Compress;
   Move(CurrentHash, Digest, Sizeof(CurrentHash));
   Burn;
 end;

begin
 Init;
 Update(s[1], Length(s));
 Final(a);
 result := "";
 for i := 0 to 15 do
   result := result + IntToHex(a[i], 2);
 Burn;
end;


Всё! Сорри за кодэ-флуд!


 
Palladin ©   (2008-07-22 22:26) [14]

ну и на кой ты его здесь привел?


 
Anatoly Podgoretsky ©   (2008-07-22 22:27) [15]

> Дима  (22.07.2008 22:20:11)  [11]

Сделай так

function md5(var buf; Lenght: Integer): string;
или
function md5(var buf: TIP; Lenght: Integer): string;


 
turbouser ©   (2008-07-22 22:29) [16]

Орех :)


 
@!!ex ©   (2008-07-22 22:35) [17]

> [16] turbouser ©   (22.07.08 22:29)

Не смешно... Грустно. :(


 
Дима   (2008-07-22 23:17) [18]


> Anatoly Podgoretsky ©   (22.07.08 22:27) [15]


Не чего не получилось, лезут ошибки!

Эхх...


 
Anatoly Podgoretsky ©   (2008-07-22 23:34) [19]

> Дима  (22.07.2008 23:17:18)  [18]

Так изменение только прототипа недостаточно, нужны изменения и в процедурах.


 
Loginov Dmitry ©   (2008-07-22 23:49) [20]

> Assign(Fi, FileName);
> Reset(Fi, 1);
> GetMem(pBuf, BufSize);
> ...
>
> Так?


Не совсем. Так ты попытаешься открыть файл с монопольным доступом. Не выйдет, т.к. файл уже открыт.
Используй глобальную переменную FileMode (измени ее на fmOpenRead or fmShareDenyNone).
Более красивый способ - грузить файл в TMemoryStream с помощью функции LoadFromFile, после чего копировать содержимое стрима в строку в помощью SetString(), TMemoryStream.Read() или Move(), а уж после - твое md5.


 
Дима   (2008-07-23 05:07) [21]


> Loginov Dmitry ©   (22.07.08 23:49) [20]


Спасибо, сегодня попробую в коде! Разжеванно доходчиво! Респект!


 
Дима   (2008-07-23 08:38) [22]

Соорудил так:
var
InFile: TFileStream;
//InMemory: TMemoryStream;
s: String;

const
FileName = "Md5GetExe.exe";
begin
 try
begin
InFile := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone);
//InMemory := TMemoryStream.Create.LoadFromFile(FileName);
s := (MD5DigestToStr(MD5Stream(InFile)));
WriteLn(s);
end;


Расчитывает верно! Но в память загнать не хватило опыта!


 
Palladin ©   (2008-07-23 08:45) [23]

а зачем тебе его в память загонять?


 
Дима   (2008-07-23 09:04) [24]


> Palladin ©   (23.07.08 08:45) [23]


Да теперь и не нужно уже :)
> Более красивый способ - грузить файл в TMemoryStream с помощью
> функции LoadFromFile

По совету
> Loginov Dmitry ©


Что то опять накосячил с реализацией, или как?


 
Palladin ©   (2008-07-23 09:13) [25]

Понятия не имею в чем он нашел красоту загрузки всего файла в память...


 
Anatoly Podgoretsky ©   (2008-07-23 09:25) [26]

> Palladin  (23.07.2008 9:13:25)  [25]

Такие функции по определению должны быть потоковыми.


 
Dennis I. Komarov ©   (2008-07-23 09:38) [27]

> [24] Дима   (23.07.08 09:04)

Я скажу как вычислить md5 хешь файла, но сперва скажите где Вы его собрались хранить?


 
Ega23 ©   (2008-07-23 09:51) [28]

Автор, ты уверен, что тебе именно хэш нужен, а не контрольная сумма?
Первое от файла - это бред. А вот второе - уже совсем даже и не бред...


 
Dennis I. Komarov ©   (2008-07-23 10:07) [29]

> [28] Ega23 ©   (23.07.08 09:51)

А собствено почему это?


 
Ega23 ©   (2008-07-23 10:12) [30]


> А собствено почему это?


Почему md5 от файла - бред? Или что?


 
User   (2008-07-23 10:15) [31]

http://delphiworld.narod.ru/base/md5.html, - функция вычисления хеш-суммы ..., в том числе:
function MD5File(const FileName: string): TMD5Digest;


 
Anatoly Podgoretsky ©   (2008-07-23 10:15) [32]

> Dennis I. Komarov  (23.07.2008 10:07:29)  [29]

А потому что лишнее, для проверки целостности, более чем достаточно быстро работающей процедуры расчета CRC32 вместо этого монстра.


 
Dennis I. Komarov ©   (2008-07-23 10:16) [33]

> Почему md5 от файла - бред? Или что?

угу


 
Dennis I. Komarov ©   (2008-07-23 10:18) [34]

> [32] Anatoly Podgoretsky ©   (23.07.08 10:15)

Возможно излишнее, но не бред :)


 
Ega23 ©   (2008-07-23 10:21) [35]


> Возможно излишнее, но не бред :)


Да бред. Это всё равно что пассатижи в качестве маникюрных щипчиков использовать.


 
User   (2008-07-23 10:29) [36]

MD5 вроде надежнее: http://www.insidepro.com/kk/163/163r.shtml -Обходи мента сзади, а Patch-Guard - спереди, хотя и долгий, на мелких файлых работа незаметна, на тяжеловесных ощутимо (пробовал pagefile.sys 1 Gb -около минуты считал) ...


 
Anatoly Podgoretsky ©   (2008-07-23 10:41) [37]

> Dennis I. Komarov  (23.07.2008 10:18:34)  [34]

Пока не озвучены другие критерии, то бред. Тут даже простой контрольной суммы хватило бы.


 
Anatoly Podgoretsky ©   (2008-07-23 10:42) [38]

> User  (23.07.2008 10:29:36)  [36]

Надежность для заявленой темы не нужна. Надежности даже CRC16, или CheckSum32/64 с избытком/


 
User   (2008-07-23 10:46) [39]

> Надежность для заявленой темы не нужна. - откуда мы знаем, для чего задающему вопрос нужен ответ? ...

> Надежности даже CRC16, или CheckSum32/64 с избытком/
http://www.insidepro.com/kk/118/118r.shtml - Как подделывают CRC16/32


 
Ega23 ©   (2008-07-23 10:53) [40]


> Как подделывают CRC16/32


А ты его через RSA закрой, а юзеру - только публичный ключ выдавай.  :)


 
McSimm ©   (2008-07-23 11:23) [41]


> где Вы его собрались хранить?

мне тоже любопытно


 
Ega23 ©   (2008-07-23 11:24) [42]


> > где Вы его собрались хранить?
>
> мне тоже любопытно
>


В ini-файле, где же ещё...   :)))


 
Anatoly Podgoretsky ©   (2008-07-23 11:40) [43]

> User  (23.07.2008 10:46:39)  [39]

Страшилки оставь в покое, зачем пытаться ломать CRC когда проще откусить защиту. Кроме того кроме подделки CRC придется еще и длину подделывать, да и мало ли что еще. И я на 100% уверен, что поделка автора никому не интересна, кроме самого автора.
А откусывать защиту, что для CRC8, что MD5 одинакова. Был бы интерес.


 
User   (2008-07-23 12:08) [44]

> Кроме того кроме подделки CRC придется еще и длину подделывать
- не обязательно, тк в файле (исполняемом) имеется уйма места, куда никакие указатели не ссылаются, к тому же имеется выравнивание секций и т.п. (для любителе ужастиков - данные материалы освещает http://www.wasm.ru и др. аналогичные), нолики заменяются на символы = CRC сошлась ...
> А откусывать защиту, что для CRC8, что MD5 одинакова - если CRC8 или MD5 хранить отдельно от файла - нечего будет кусать: проверил контрольную сумму, сравнил с оригиналом КС - делаешь выводы об идентичности ...

ЗЫ: полемика вышла за рамки постановки вопроса ;-)


 
Dennis I. Komarov ©   (2008-07-23 12:16) [45]

> [44] User   (23.07.08 12:08)

Это вопрос вышел...


 
Дима   (2008-07-23 18:09) [46]


> Я скажу как вычислить md5 хешь файла, но сперва скажите
> где Вы его собрались хранить?


В ini-файле и храню и CRC32 тоже + (есть кое какие наметки) + соответствующая запись (Зашифрованная и в ini тоже) в Лог-файле! ИМХО- так соблаговолила моя душа :) Это все полемика, важна реализация не кривая а Корректная и правильная!


> Anatoly Podgoretsky ©   (23.07.08 11:40) [43]
> И я на 100% уверен, что поделка автора никому не интересна,
>  кроме самого автора.


Огульно! 99% нет не нужна не кому, но всеже 1% за мной и пользователями а это хоть какой но аргумент!


 
Медвежонок Пятачок ©   (2008-07-23 18:13) [47]

импортировать 6 функций из advapi32 и хеш у тебя в кармане


 
Дима   (2008-07-23 18:16) [48]


> Медвежонок Пятачок ©   (23.07.08 18:13) [47]


А по подробнее?


 
Медвежонок Пятачок ©   (2008-07-23 18:20) [49]

А по подробнее?
А поможет?

function CryptAcquireContext     ;external ADVAPI32 name "CryptAcquireContextA"
function CryptReleaseContext     ;external ADVAPI32 name "CryptReleaseContext";
function CryptGetHashParam       ;external ADVAPI32 name "CryptGetHashParam";
function CryptCreateHash         ;external ADVAPI32 name "CryptCreateHash";
function CryptHashData           ;external ADVAPI32 name "CryptHashData";
function CryptDestroyHash        ;external ADVAPI32 name "CryptDestroyHash";


 
Дима   (2008-07-23 18:20) [50]


> User   (23.07.08 10:15) [31]


Ее родную и применил. Не ту что в горячке привел в начальных постах!


 
Дима   (2008-07-23 18:31) [51]


> Медвежонок Пятачок ©   (23.07.08 18:20) [49]
>
> А поможет?


А по чему бы и нет? Что, все так безнадежно?
Я думаю Гуру ты или "Чайнег" - а тягу к самообразованию, еще не кто не отменял!

+ Спросить всегда не зазорно было, плохо тупить в гордом одиночестве и прожить пусто но как Гуру-одиночка. ИМХО!


 
Медвежонок Пятачок ©   (2008-07-23 18:42) [52]

Вот пример использования.
Только подставить id нужного алгоритма.

function CalculateHash(const AFileName : string; AlgID : Cardinal; var AData : Pointer; var ADataSize : Cardinal) : boolean;
var pBuff : Pointer; aBuffLen,ReadCount : Cardinal; fStream : TFileStream;
   hProv : HCRYPTPROV; hHash : HCRYPTHASH;
begin
Result := False; pBuff := nil; fStream := nil;
if FileExists(AFileName) then
 begin
  if CryptAcquireContext(@hProv,nil,nil,PROV_RSA_FULL,CRYPT_VERIFYCONTEXT) then
   begin
    if CryptCreateHash(hProv,AlgID,0,0,@hHash) then
     try
      fStream := TFileStream.Create(AFileName,fmOpenRead or fmShareDenyNone);
      if fStream.Size >= BUFF_SIZE then aBuffLen := BUFF_SIZE else aBuffLen := fStream.Size;
      GetMem(pBuff,aBuffLen);
      repeat
       ReadCount := Min(aBuffLen,fStream.Size - fStream.Position);
       if ReadCount > 0 then
        begin
         fStream.ReadBuffer(pBuff^,ReadCount);
         Result := CryptHashData(hHash,pBuff,ReadCount,0);
         if not Result then Break;
        end
       else
        Break;
      until ReadCount <= 0;
      if Result then
       begin
        if CryptGetHashParam(hHash,HP_HASHVAL,nil,@ADataSize,0) then
         begin
          GetMem(AData,ADataSize);
          Result := CryptGetHashParam(hHash,HP_HASHVAL,AData,@ADataSize,0);
         end;
       end;
     finally
      if Assigned(pBuff) then FreeMem(pBuff,aBuffLen);
      CryptDestroyHash(hHash);
      CryptReleaseContext(hProv,0);
      fStream.Free;
     end;
   end;
 end;
end;


 
Anatoly Podgoretsky ©   (2008-07-23 18:49) [53]

> Дима  (23.07.2008 18:09:46)  [46]

Значит 99% за реализацию на CRC и 1 за MD5



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.08.31;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.61 MB
Время: 0.006 c
10-1145287099
Yanis
2006-04-17 19:18
2008.08.31
Добавить свой track bar в Volume Control


4-1195858527
periskops
2007-11-24 01:55
2008.08.31
пульт


15-1215495711
Костик
2008-07-08 09:41
2008.08.31
Помогите разобраться с .NET


2-1216898995
i
2008-07-24 15:29
2008.08.31
загрузка сохранения множества


1-1197376743
newbie2
2007-12-11 15:39
2008.08.31
как работает TEvent?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский