Добро пожаловать, гость ( Вход | Регистрация )
Дата поста: | В теме: | За сообщение: | Спасибо сказали: | ||
---|---|---|---|---|---|
Nov 11 2011, 20:39 | Delphi, Asm, C, WinAPI, PHP, ... | Похоже долго ты на Java писал. (*улыбается*) Нет, насколько я помню, Delphi хранит указатели на сложные типы данных и количество переменных ссылающихся на них. Как только количество = 0, то переменная уничтожается. Если же ты делаешь T:=S;, то у тебя в T не хранится строка S, а только указатель на неё. Реально память выделяется, если я правильно помню, только когда ты начинаешь изменять T, например: T:=T + 's'; Уже не помню, где об этом читал, где-то статья была, может даже здесь (на форуме) ссылку давали. О, нашёл - там нет якорей, так что крути вниз до главы "Как же это происходит?". Так это происходит или нет, судить не берусь, но, вроде бы, в этой главе походит на правду. |
Siberian GRemlin, | ||
Nov 11 2011, 15:15 | Delphi, Asm, C, WinAPI, PHP, ... | У Delphi такой смешной оптимизатор (компилирую программу через DCC32HACK - там глюки и косяки сразу хорошо видно, т.к. программа маленькая и без мусора): CODE Const Chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; Делает копию этой строки в каждом (!) месте программы где она используется. Если же написать так: CODE Const Chars: String = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; То только в первом - все остальные на неё ссылаются. А вот так: CODE Const Chars: String[36] = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; Вообще загоняет строку отдельно в секцию DATA. |
Siberian GRemlin, | ||
Oct 17 2011, 09:29 | Costume Quest | Смотрел только маленький архив. Смещение $20 - судя по всему количество файлов в архиве ($DF). Заголовок таблицы: DWORD - SLEN длинна имени структуры CHAR[SLEN] - строчка с именем (BLOB) - выравнивается до ближайшей кратной 4 границы DWORD - неизвестно (?) DWORD - точно не количество файлов, потому что файлов $DF, а тут $BD DWORD - неизвестно (не используется, походу filler $CC) Далее идёт таблица. На глаз структура таблицы примерно следующая: DWORD - USIZE - (USIZE >> 9) = размер распакованного файла DWORD - PSIZE - (PSIZE >> 1) = размер упакованного файла DWORD - FOFFS - (FOFFS >> 3) - смещение файла в архиве DWORD - NOFFS - (NOFFS >> 11) = смещение до начала имени файла, относительно начала секции строк: 0, 30, 58, ... >> - битовый сдвиг вправо (shr) Т.е. читаем, к примеру, поле USIZE, затем, чтобы получить размер распакованного файла, сдвигаем это поле вправо на 9 бит. Если USIZE = PSIZE (!!!без сдвигов - как было в файле!!!) - файл не упакован и любое из этих полей сдвинутое вправо на 9 даст размер файла. Поля имеют какие-то байты FOFFS (всегда 1), NOFFS (2 или 4), которые при сдвиге отбрасываются, но за что они отвечают - я не знаю. Точно не за сжатие. |
Siberian GRemlin, | ||
Aug 6 2011, 13:54 | Взлом старых версий Diablo 2 | Спасибо за файлы, я попробовал, но увы. В общем, извини, но я тут уже не смогу помочь. Если интересно, вот версии SecuROM: Game (1.07).exe - SecuROM 4.47.00 Game (1.08).exe - SecuROM 4.49.00 Game (1.09).exe - SecuROM 4.54.00 Game (1.09b).exe - SecuROM 4.54.00 Game (1.09d).exe - SecuROM 4.62.00 |
Raf-9600, | ||
Aug 5 2011, 13:59 | Взлом старых версий Diablo 2 | QUOTE(Raf-9600 @ Aug 4 2011, 14:04) [snapback]3156[/snapback] Эм.. тоесть реализовать сложно? Теоретически есть программы, которые могут вообще в автоматическом режиме снимать эту защиту. Но работают только со старыми версиями SecuROM - 50/50 вероятность, что сработает. Попробуй, если найдёшь, UnSecuromNTv1.0 - он должен под Windows XP, как минимум, работать. В общем, я попробую как время будет, чего-нибудь сделать, но ничего не гарантирую. |
Raf-9600, | ||
Apr 14 2011, 18:26 | Delphi, Asm, C, WinAPI, PHP, ... | Если тебе просто что-то надо вставить, а не файл, то можно так: CODE var st = '<a href="http://www.google.com/">Google</a>'; var test = document.getElementById("test"); test.innerHTML = st; // содержимое элемента с id="test" будет заменено на то, что было в переменной st Если же тебе именно файл надо загрузить, то тут смотри в сторону AJAX или jQuery. Кстати, загружать что-то на JavaScript можно только с того же домена, где выполняется скрипт. Иначе политика безопасности не позволит. Т.е. JavaScript выполняемый на сайте example.com не сможет загрузить что-либо с сайта microsoft.com. Для XML (для HTML там надо, видимо, XML убрать) на java script: CODE var st = './testfile.xml'; var http_request = false; http_request = new XMLHttpRequest(); if(!http_request){ alert('XMLHTTPERROR'); return; } http_request.open("GET", st, false); http_request.send(null); st = http_request.responseText; // ответ сервера - XML документ На jQuery всё вообще в одну строчку (данный пример загружает в div с id="test" содержимое файла newpage.htm с сервера): CODE $('#test').load('./newpage.htm'); Если #test заменить на body - то будет заменено содержимое страницы. Кстати, include() в PHP используется для подключения файлов с исходными кодами. Упаси тебя боже использовать его для вывода страницы, особенно, если это не твой файл, а, скажем, скачанные данные из Интернета - вредоносный PHP код туда всунуть как два байта переслать. Насчёт же подключения в HTML я бы frame или iframe посоветовал, но их баннерорезки часто рубят. |
Siberian GRemlin, | ||
Apr 14 2011, 11:50 | !Вирусы! | Dr.Web Заколачиваю последний гвоздь в крышку гроба этого антивируса - до кучи к моим предыдущим проблемам: 1) Дебильная система обновления: один раз обновились файлы "drweb_en.chm" и "drweb_ru.chm", после чего программа потребовала перезагрузки компьютера (!), т.к. были установлены критические (!!) обновления. Походу у них всё, что не антивирусные базы требует перезагрузки, неважно нужна она или нет. 2) Почему-то Dr.Web помимо программ на Delphi ещё и люто ненавидит Opera - при открытии любой вкладки, даже пустой, программа подвисала на 3-5 секунд. После удаления Dr.Web всё опять стало летать. 3) Когда у меня кончился ключ, Dr.Web продолжал показывать окно с количеством дней до его истечения. Только если раньше было 30, 15, 10, 9... 0, то теперь оно пошло в обратную сторону: 1, 2, 3, 4, 5... и т.д. Слов нет - тупо до невозможности. 4) После удаления этого ублюдского антивируса, я скачал с их FTP программу для окончательного удаления всего за собой (они рекомендуют ей пользоваться если, вдруг, выйдет новая версия их программы, чтобы старая за собой всё убрала) - называется "drw_remover.exe". Запустил, ввёл капчу, она чего-то поделала и предложила перезагрузиться. Перезагрузился. Как было в системе от Dr.Web насрано - так и осталось. Куча какого-то дерьма в Program Files, в %AppData% вообще какие-то .EXE с .DLL валяются, а самое главное - остался EventLog "Doctor Web"! И его ещё хрен удалишь!!! Вот, нашёл как вручную его снести, для тех кто имел несчастие поставить себе это дерьмо под названием Dr.Web: http://www.jinweijie.com/windows/delete-event-log-manually/ Я искренне желаю всем сотрудникам этой ублюдочной фирмы вечно гореть в Аду! Microsoft Forefront Endpoint Protection Упёр с работы этот антивирус. Решил поставить и, что бы вы думали? Он потребовал с меня планировщик! Удалил без зазрений совести. Microsoft Security Essentials Решил попробовать его младшего, бесплатного и не такого навороченного брата. Поставить-то поставил, но вот дальше начался гемморой. Как я уже говорил, я держу службу Автоматического обновления всё время выключенной из-за того что она безбожно жрёт процессор. Включаю раз в месяц посмотреть какие новые обновления появились и их поставить. Этот же гадский антивирус сделал морду лопатой и по-тихому включил службу, да не просто включил, а с настройкой загружать и устанавливать не спрашивая никого об этом. Увидев такое дело я вынес через XPLite все скачанные обновления, потому что там был 8-ой Internet Explorer, который я ставить в упор (как и 7) не хочу, потому что мне нужен 6-ой для тестирования сайтов которые я делаю под ним (для Интернета я использую FireFox). Но и тут меня поджидал сюрприз - при отключении службы обновления... отключается и антивирус! Ну надо же! И это убожество тоже пришлось удалять. ESET NOD32 Antivirus Поставил это штуку. При установке главное выбрать ручную инсталляцию компонентов и отключить установку ублюдского Яндекс.Бара. После установки в памяти всего два процесса, как Axsis и говорил - ekrn.exe (ядро - 20 Мб) и egui.exe (оболочка - 1,5 Мб). Что, надо заметить, весьма по-божески кушает память в отличие от всех предыдущих антивирусов, не говоря уже о количестве процессов! Насчёт скорости работы, то тоже не могу не удивиться - быстро работает, зараза. Для интереса даже вышел на какой-то подозрительный сайт в гугле ("этот сайт может нанести вред вашему компьютеру") - так всплыло окно, что NOD32 заблокировал какой-то опасный элемент на этом сайте. Т.е. всё работает и, главное, быстро! В общем, остановился на этом антивирусе - пока полёт нормальный, особых нареканий по работе нет. Разве что при ручном обновлении программа чего-то уж сильно долго думает на первом файле "update.ver". Чёрт подери, неужели таки нашёл нормальный антивирус? Аж самому не верится. (*улыбается*) |
Siberian GRemlin, | ||
Apr 1 2011, 18:50 | Meet The Robinsons [.HOG] | Переношу все междусобойчики из ЛС сюда. У меня уже места для писем нет, запарился себе размер яшика увеличивать, да и неудобно в ЛС. Товарищ Siberian GRemlin, пожалуйста, в будущем создавай тему, а не пиши мне. Я всегда смотрю файлы которые кто-либо из нас выкладывает, так что если ты или кто-то другой что-то спросил, а я не ответил, это значит только что я ничего не могу сказать по этому формату. Мне нечего добавить и т.д. Надеюсь на понимание и что мне никто в будущем не будет писать в ЛС, а создавать отдельную тему... Но вернёмся к игре. Siberian GRemlin жаждет узнать алгоритм подсчёта контрольной суммы. Нужно это ему, видимо, для перепаковки архива и создания русификатора. Далее идёт описание формата (я его немного дополнил, кстати), так что я сразу задам свои вопросы ему: 1) Зачем тебе сдалась эта контрольная сумма? Я поменял её у пары файлов из "Data\say.hog", но игра на это никак не отреагировала. Т.е. никакой ошибки не было. 2) noDVD игры упакован UPX'ом со стёртой сигнатурой, но я его распаковал. Получилось из 8 Мб целых 28. Если кто-нибудь ещё будет смотреть игру - могу выложить его, чтобы не распаковывать. Так вот под отладчиком я нашёл место где читается, к примеру, тот же "Data\say.hog" (он целиком в память засовывается), но проблема в том, что, видимо, из-за криво снятой защиты я не могу поставить бряк на обращение к этой памяти. В частности к ячейке с контрольной суммой. При попытке это сделать Олька говорит что мой бряк инвалид и она поэтому она его убивает. 28 Мб - это не фигушки воробьям показывать и найти там код проверки вручную очень сложно. Так что вернёмся к вопросу №1: зачем нужна контрольная сумма, если игра её игнорирует? Если не игнорирует, скажи где и что поменять, чтобы игра выбросила сообщение-ошибку. Тогда уже можно будет идти-отлаживать от него вверх и найти место подсчёта контрольной суммы. Формат .HOG файлов такой: DWORD - singature/version // сигнатура или версия - игра всегда проверяет, чтобы было равно $20001 (см. код на .5DA88C) DWORD - TOC offs // смещение до таблицы содержимого (TOC) DWORD - zero // всегда ноль, вроде бы DWORD - hash/crc(1) // контрольная сумма для заголовка (???) DWORD - files count // количество файлов в архиве DWORD - unknown // неизвестно, какой-то размер похоже, но я не понял что это (???) DWORD - hash/crc(2) // второе непонятное число (???) Формат TOC: DWORD - name // смещение до начала ACSIIZ имени файла - это то, что ты принял за ID DWORD - offs // смещение до данных файла DWORD - size // размер файла DWORD - hash/crc(3) // это самое, что непонятно как считается (???) Далее идут друг за другом ASCIIZ имена. С именами, кстати, всё просто - если ты делаешь FileMapping() или прочитал весь файл в память, то не нужно читать по одному байту, пока не 0, можно проще: PTR_START, FileName: PChar; ... FileName:=PTR_START; // присваиваем указатель на начало архива Inc(FileName, TOC[I].name); // сдвигаем его до имени файла WriteLn(FileName); // получили имя текущего, I-того, файла Ссылки на игру: _ttp://ifolder.ru/22688282 _ttp://ifolder.ru/22687944 _ttp://ifolder.ru/22688054 _ttp://ifolder.ru/22687760 _ttp://ifolder.ru/22688384 Код распаковщика за авторством Siberian GRemlin'а: [cut=показать] CODE Program unpk; [/cut]{$APPTYPE CONSOLE} Uses Windows, SysUtils, Classes; { [!] SecuROM Detected - Version 07.31.0011 [CompilerDetect] -> Visual C++ 7.1 (Visual Studio 2003) } type Tmass = record ID, CRC, FileOffset, FileSize: dword; FileName: String; end; Procedure Extract(name:string); var Mstr,OutStr: TFileStream; i, Offset{, Unknown}: Integer; FilesMass: array of TMass; // path,p: string; b:byte; begin if FileExists(name) then begin Mstr:=TFileStream.Create(name, fmOpenRead); Mstr.Position:=$4; Mstr.ReadBuffer(Offset, 4); //начало таблицы или размер заголовка Mstr.Position:=$10; Mstr.ReadBuffer(i, 4); //кол-во файлов SetLength(FilesMass,i); Mstr.Position:=Offset; for i:=0 to Length(FilesMass)-1 do begin Mstr.ReadBuffer(FilesMass[i].ID, 4); Mstr.ReadBuffer(FilesMass[i].FileOffset, 4); Mstr.ReadBuffer(FilesMass[i].FileSize, 4); Mstr.ReadBuffer(FilesMass[i].CRC, 4); end; for i:=0 to Length(FilesMass)-1 do begin FilesMass[i].FileName:=''; Repeat Mstr.ReadBuffer(B,1); if B<>0 then FilesMass[i].FileName:=FilesMass[i].FileName+chr(B); Until B=0; WriteLn(FilesMass[i].FileName,' : CRC = ',IntToHex(FilesMass[i].CRC,8)); end; for i:=0 to Length(FilesMass)-1 do begin Mstr.Position:= FilesMass[i].FileOffset; OutStr:=TFileStream.Create(FilesMass[i].FileName, fmCreate); OutStr.CopyFrom(Mstr,FilesMass[i].FileSize); OutStr.Free; end; Mstr.Free; end; writeln('Completed!'); end; Begin If ParamCount = 1 Then Extract(ParamStr(1)); End. |
Siberian GRemlin, | ||
Mar 27 2011, 06:22 | Westwood Studios .MIX | Siberian GRemlin! Что-то у тебя не так с алгоритмом. Твой код, например, для имени "conquer.eng" (первый C&C, архив LOCAL.MIX) выдаёт $1ADE15FC, а должно быть $A22515FC. Вот исправленный: CODE Function HashFromStr(Name: String): Longword; Var I: Integer; Begin While (Length(Name) < 12) Do Name:=Name + #0; Name:=Copy(Name, 1, 12); For I:=1 To 12 Do Name[I]:=UpCase(Name[I]); Name:=Name + #0; result:=0; I:=1; While (Name[I] <> #0) Do Begin result:=((result ShL 1) Or (result ShR 31)) + PLongword(@Name[I])^; I:=I + 4; End; End; Кстати, помимо предложенных Xplorer'ом способов есть ещё один: можно использовать FileMon.exe от SysInternals (правда сейчас они объеденили его с RegMon.exe в Process Monitor, но я им не пользовался), потому что, скажем, игра Blade Runner сначала пытается открыть файл в текущем каталоге, а потом уже лезет в .MIX - имена без проблем перехватываются. Главное фильтр типа "*blade.exe*" поставить, чтобы системные обращения в лог не валились. |
Siberian GRemlin, | ||
Mar 25 2011, 07:00 | Strippers | Иногда после использования JPEGCrop (см. выше) результирующий файл несмотря на lossless преобразование почему-то занимает больше, чем оригинал. Товарищ Grom PE подсказал, что надо делать вот такое: jpegtran -copy none -optimize -progressive input.jpg output.jpg И действительно, файл резко худеет без потери качества. |
Siberian GRemlin, | ||
Mar 15 2011, 03:32 | Сжатие LZX / LZSS | QUOTE Сравнение файлов 1.xmi и DUMP FC: различия не найдены Axsis! Ты мозг! Спасибо громадное! Просто я уже в нескольких старых игрушках натыкался на это сжатие и подумал, что было бы неплохо иметь программу для распаковки. Добавлено: Исправляюсь - может и не во многих, но в некоторых что-то похожее. |
Siberian GRemlin, | ||
Mar 14 2011, 07:55 | Сжатие LZX / LZSS | Спасибо большое! Изменил на вот такое - всё равно в 64 байтах различие. Что я забыл? [codebox]Program unlzx; {$APPTYPE CONSOLE} Var Fl: File; B: Byte; buff: Array[0..(1024*6)-1] Of Byte; loop: Array[0..$fff] Of Byte; lidx: Integer; i, p, o, l, x: Integer; Begin FillChar(buff, 1024*6, 0); AssignFile(Fl, '1.zlx'); FileMode:=0; Reset(Fl, 1); FileMode:=2; p := 0; lidx:=0; FillChar(loop, $fff + 1, 0); While Not EOF(Fl) Do Begin b := 0; BlockRead(Fl, B, 1); If b = 0 Then Break; For I := 1 To 8 Do Begin // if bit is set - read byte to output buffer If (b And 1 <> 0) Then Begin BlockRead(Fl, buff[p], 1, x); loop[lidx]:=buff[p]; lidx:=(lidx + 1) And $fff; p := p + 1; End Else Begin // else - read word, size&offs // buffer shift value o := 0; BlockRead(Fl, o, 2, x); l := (o ShR 12) + 3; // length o := o And $fff; // addr // loop While l > 0 Do Begin buff[p] := buff[o]; p:=p + 1; loop[lidx] := buff[o]; lidx:=(lidx + 1) And $fff; o := ((o + 1) And $fff); l:=l - 1; End; End; // go to next bit b := b ShR 1; End; End; CloseFile(Fl); p := 4969; buff[p-1] := 0; AssignFile(Fl, 'dump'); ReWrite(Fl, 1); BlockWrite(Fl, buff, p); CloseFile(Fl); End.[/codebox] |
Siberian GRemlin, | ||
Mar 12 2011, 12:47 | Сжатие LZX / LZSS | Всё ещё нужна помощь. Код распаковщика на Asm'е (DOS) выдранный из игры (с моими комментариями): [codebox] ; si - input buffer ;es:[di] - output buffer ;[bx] - window buffer? ;edx - uncompressed size? ; ----------------------- ; DS - сегмент данных. ; SI, DI - индекс. ; DS и SI/DI связаны. ; [ds:si]=[si] ; [ds:di]=[di] sub_10349 proc near push ds push si ; initialization - nothing interesting xor eax, eax mov cx, 400h xor si, si mov ds, word ptr ds:2A1Ch @label1_01: ; $400 * 4 => 4096 fill buffer with zero (eax=0) -> memset()? mov [si], eax add si, 4 dec cx jnz label1_01 xor bx, bx xor cx, cx mov edx, [si] add si, 4 @start_decode: ;start decode routine shr cx, 1 or ch, ch ; see above (*) jnz label1_04 mov cl, [si] ; get next byte inc si jnz label1_03 ; check si overflow call buffer_overflow ; error handling?.. @label1_03: mov ch, 0FFh ; (*) it's a trick: check if we run first time, or get from loop above @label1_04: test cx, 1 jz label1_07 ; "read-byte" bit is not set mov al, [si] inc si jnz label1_05 ; check si overflow call buffer_overflow @label1_05: mov [bx], al inc bx and bx, 0FFFh mov es:[di], al inc di jnz label1_06 mov ax, es add ax, 1000h mov es, ax @label1_06: ; edx =0 - end of stream dec edx jz exit_from_proc jmp start_decode ; --------------------------------------------------------------------------- @label1_07: push cx mov cl, [si] inc si jnz label1_08 ; check si overflow call buffer_overflow @label1_08: mov ch, [si] inc si jnz label1_09 ; check si overflow call buffer_overflow @label1_09: push si ; label1_07 to label1_09 - read WORD from input stream mov si, cx and si, 0FFFh ; si = (cx & 0xfff) ; si - addr and cx, 0F000h rol cx, 4 add cx, 3 ; cx = (cx >> 12) + 3 ; cx - size @slide_window_decode: mov al, [si] inc si and si, 0FFFh mov [bx], al inc bx and bx, 0FFFh mov es:[di], al inc di jnz label1_11 mov ax, es add ax, 1000h mov es, ax @label1_11: ; edx =0 - end of stream dec edx jz exit_from_proc_clear_stack ; while cx != 0 - copy next byte dec cx jnz slide_window_decode pop si pop cx jmp start_decode ; --------------------------------------------------------------------------- @exit_from_proc_clear_stack: add sp, 4 ; remove si and cx from stack @exit_from_proc: pop si pop ds retn sub_10349 endp [/codebox] Он же на Delphi (не работает как надо): [codebox]Program unlzx; {$APPTYPE CONSOLE} Var Fl: File; B: Byte; buff: Array[0..(1024*6)-1] Of Byte; i, p, o, l, s, x: Integer; Begin FillChar(buff, 1024*6, 0); AssignFile(Fl, '1.zlx'); FileMode:=0; Reset(Fl, 1); FileMode:=2; p := 0; s := 0; While Not EOF(Fl) Do Begin b := 0; BlockRead(Fl, B, 1); If b = 0 Then Break; For I := 1 To 8 Do Begin // if bit is set - read byte to output buffer If (b And 1 <> 0) Then Begin BlockRead(Fl, buff[p], 1, x); p := p+1; End Else Begin // else - read word, size&offs // buffer shift value o := 0; BlockRead(Fl, o, 2, x); l := (o ShR 12) + 3; // length o := o And $fff; // addr // not sure about this if p > $1000 Then s := p - $1000 else s := 0; While l > 0 Do Begin buff[p] := buff[s + o]; o := ((o + 1) And $fff); p:=p+1; l:=l-1; End; End; // go to next bit b := b ShR 1; End; End; CloseFile(Fl); p := 4969; buff[p-1] := 0; AssignFile(Fl, 'dump'); ReWrite(Fl, 1); BlockWrite(Fl, buff, p); CloseFile(Fl); End.[/codebox] |
Siberian GRemlin, | ||
Dec 16 2010, 02:18 | InstallShield CAB View | Есть такая утилита как InstallShield 5.x/6.x Cabinet Compression & Maintenance Util (i5comp.exe / i6comp.exe). У меня к ней даже где-то исходные коды на сях валяются, попробую поковырять... Добавлено: Ha-ha! I tricked you! © Laura, Silent Hill 2 Распаковщик: i6compx.zip Unicode, правда, не поддерживается (тупо переводится в ANSI с заменой на "_" левых символов), но главное, что оно всё правильно распаковывает. Флаг 0x04000000 я поставил от балды, т.к. не знаю какой там должен быть правильный, чтобы по нему определить наличие отсутствия Unicode. Кстати, это новая версия (у меня её не было) и там нет необходимости в ZD*.DLL файлах для распаковки - соответствующая библиотека статически слинкована с программой, что очень удобно. |
Axsis, | ||
Aug 9 2010, 10:11 | FireFox: addons, extensions, tweaks, etc. | Так, возвращаемся на несколько каталогов вверх и удаляем в файле "chrome.manifest" последнюю строчку: CODE overlay chrome://mozapps/content/downloads/unknownContentType.xul chrome://getfilesize/content/dialogOverlay.xul В противном случае GetFileSize будет вызываться при попытке скачать любой файл! А это чревато обломом, особенно на всяких файловых обменниках (где после начала закачки ссылка становится невалидной), потому что GetFileSize вызывался ДО начала скачивания файла FireFox'ом. |
Siberian GRemlin, | ||
Aug 7 2010, 18:38 | FireFox: addons, extensions, tweaks, etc. | QUOTE(-=CHE@TER=- @ Jul 4 2010, 20:10) [snapback]2945[/snapback] Кто-нибудь знает, как скрестить FireFox и вот это (взять программу можно здесь)? В Opera это одной строчкой делалось, а как в меню FireFox вставить - хрен знает. Про соответствующее расширение знаю, но оно не работает с FTP и сильно ограничено по сравнению с полноценной программой. Заранее спасибо. Итак, свершилось! Что нужно сделать: 1) Установить расширение для FireFox Get File Size. 2) Установить программу Get File Size. 3) После этого закрываем FireFox и лезем вот сюда: C: \ Documents and Settings \ USERNAME \ Application Data \ Mozilla \ Firefox \ Profiles \ HPROFILE.default \ extensions \ getfilesize@skakunov.alexander \ chrome \ content\ где: USERNAME - имя пользователя HPROFILE - абстрактный хэш выданный FireFox'ом Далее открываем файл "load.js" и заменяем там функцию get_file_meta() на вот такое: [codebox]function get_file_meta( url, callback, strings ) { var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile); file.initWithPath("C:\\Program Files\\GetFileSize\\GetFileSize.exe"); var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess); process.init(file); var args = ["/url:" + url]; process.run(false, args, args.length); }[/codebox] Чтобы пункт меню "Get file size" появлялся не только на файлах, но и на картинках - открываем файл "overlay.js", находим там: CODE document.getElementById("context-getfilesize").hidden = !gContextMenu.onLink || gContextMenu.onMailtoLink; Меняем на: CODE document.getElementById("context-getfilesize").hidden = !(gContextMenu.onLink || gContextMenu.onImage) || gContextMenu.onMailtoLink; Далее находим: CODE url = gContextMenu.linkURL; Меняем на: CODE url = (gContextMenu.onLink ? gContextMenu.linkURL : gContextMenu.imageURL || gContextMenu.mediaURL); Всё! Жизнь удалась!!! |
Siberian GRemlin, | ||
Jul 27 2010, 17:38 | Delphi, Asm, C, WinAPI, PHP, ... | Блин, ставил по работе на удалённый сайт Joomla - застрелиться. Сама CMS в архиве .tar.gz, но хостер (сюрприз!) не даёт доступ по SSH, а также запускать через PHP exec() / system() чтобы выполнить команду распаковки. В Интернете погуглил - ничего кроме использования двух упомянутых выше команд посоветовать не могут. Короче, распаковал я Жумлу и стал копировать по FTP на сайт... 2 часа с гаком - un-freaking-believable! Скорость заливки-то большая, да вот при создании нового файла удалённый сайт почему-то тупил по несколько секунд, а в Жумле этих файлов, как снега зимой. В общем, в конце копирования я уже озверел и решил написать свою программу, которая бы соединяла файлы в один (один файл быстро заливается) и чтобы этот файл можно было потом на сервере распаковать вызвав через HTTP скрипт на PHP для распаковки. Формат файла filedump: DWORD - размер файла (size) DWORD - размер строки имени файла (nlen) CHARS - имя и путь файла (nlen байт) BYTES - содержимое файл (size байт) Повторить до конца файла. Маленькое замечание: т.к. надо было ещё и пустые каталоги на всякий случий паковать и создавать на сервере, то с именем файла такое дело - если оно заканчивается на '/' - то это каталог, нужно его создать. Файлы при паковке сортируются, так что ситуации, когда надо распаковать файл, каталога для которого ещё нет, по идее, не должны встречаться. Опционально в эти скрипты можно добавить сжатие gz (если хостер поддерживает) и дату со временем. pack.php - пакует в архив filedump всё в текущем каталоге и его подкаталогах. unpk.php - распаковывает filedump в текущий каталог. Т.к. скрипты дописал практически одновременно с окончанием копирования - проверить времени не было, но, по идее, должны работать. Кстати, там с правами под иксы может быть косяк - все файлы будут пользователю Apache принадлежать - это можно поковырять и chmod() при распаковке добавить для файлов. [cut=Код программ] pack.php CODE <?php set_time_limit(0); Function GetFileList($dirpath){ $dirs = array(); if(is_dir($dirpath)){ if($dh = opendir($dirpath)){ while($file = @readdir($dh)){ if(($file != '.') && ($file != '..')){ if((filetype($dirpath.$file) == 'file')){ $dirs[] = $dirpath.$file; }else{ $dirs[] = $dirpath.$file.'/'; $dirs = array_merge($dirs, GetFileList($dirpath.$file.'/')); } } } closedir($dh); natcasesort($dirs); } } return($dirs); } // optional: add filedatetime and compression // $tm = filemtime($file); // getfiletime // touch($file, $tm); // setfiletime // $file = gzcompress($file, 9); // $file = gzdecompress($file); @unlink('./filedump'); $list = GetFileList('./'); for($i = 0; $i < count($list); $i++){ // echo $list[$i]."\r\n"; $fl = fopen('./filedump', 'ab'); if($fl){ $name = substr($list[$i], 2); $nlen = strlen($name); $size = 0; $file = ''; if($name[$nlen-1] != '/'){ $size = filesize('./'.$name); $file = file_get_contents('./'.$name); } $size = pack('V', $size); $nlen = pack('V', $nlen); fwrite($fl, $size, 4); fwrite($fl, $nlen, 4); $size = unpack('V', $size); $nlen = unpack('V', $nlen); fwrite($fl, $name, $nlen[1]); fwrite($fl, $file, $size[1]); } fclose($fl); } ?> unpk.php CODE <?php set_time_limit(0); $fend = filesize('./filedump'); $fl = fopen('./filedump', 'rb'); while(ftell($fl) < $fend){ $size = 0; $nlen = 0; $name = ''; $file = ''; $size = fread($fl, 4); $nlen = fread($fl, 4); $size = unpack('V', $size); $nlen = unpack('V', $nlen); $size = $size[1]; $nlen = $nlen[1]; $name = fread($fl, $nlen); if($size != 0){ $file = fread($fl, $size); } if($name[$nlen-1] == '/'){ @mkdir('./'.$name, 0777); }else{ @file_put_contents('./'.$name, $file); } } fclose($fl); ?> [/cut] |
Siberian GRemlin, | ||
Jul 21 2010, 16:00 | Delphi, Asm, C, WinAPI, PHP, ... | QUOTE(-=CHE@TER=- @ Jul 20 2007, 13:48) [snapback]1101[/snapback] Xplorer! RasGetConnectionStatistics - это как раз в точности то, что мне нужно было! Большое, нет просто ГРОМАДНОЕ спасибо! Опять всплыл вопрос, только на этот раз хочу получить количество принятых / переданных байт для сетевой карты. RasGetConnectionStatistics() тут уже не помогает. Сделал программу через GetIfTable, но, почему-то, если не сильно активен, там обычно на полмегабайта меньше трафика, чем отображается по команде "netstat -e". Кто-нибудь знает, в чём прикол? Добавлено: А! Всё, понял - "netstat -e" показывает суммарный трафик на адаптере - т.е. сколько пришло и ушло со всех интерфейсов. А т.к. интерфейса два (+loopback), то нужно было тупо трафик суммировать. Хотя это даже удобно - если не учитывать loopback, то можно получить "чистый трафик", который уходит во внешку. |
Siberian GRemlin, | ||
Jul 7 2010, 15:17 | !Вирусы! | Ну, у знакомых стоит на лицензионной 7-ке лицензионный же кашпировский. Тоже пару раз BSoD получали. Просили разобраться, я грешным делом думал что это 7-ка сырая, все обновления поставил - хрен там. Теперь, кажется, я понял что к чему. (*улыбается*) Я хочу тоже выплеснуть тут немного гнева, но по поводу Dr.Web. Короче, попользовался пару месяцев этим т.н. "антивирусом" - количество негативных эмоций просто хлещет через край. Итак, финальный список. Минусы: 1) Ублюдский установщик, который требует планировщик, хотя антивирусу эта служба для работы вообще никуда не упёрлась. 2) Ублюдская система сканирования файлов, когда при открытии даже текстовых файлов система впадает на полминуты в ступор не отвечая ни на что. 3) Ублюдский эврестический анализ - я неделю ругался со службой поддержи, потому что их антивирус убивал .EXE файл программы на Delphi после того как я применял StripReloc (там НИЧЕГО не было, кроме CreateFile и FileMapping, причём я им даже исходные коды выслал!). Они это поправили - затем (та же программа!!!) стала удаляться если при компиляции после StripReloc ещё и UPX сжать! Опять пришлось ругаться - внесли в исключения, но недавно убили ещё одну мою старую программу на Delphi, которую я писал для скачивания сайтов. Ругаться и писать в службу поддержки я перестал - это, как я понял, бесполезно, т.к. сам по себе антивирус просто ущербный. 4) Ублюдская система карантина - в корне того диска, где найден вирус создаётся скрытый (а в случае NTFS ещё и без прав доступа - не удалишь!) каталог "Drweb Quarantine", куда складируются вирусы. Причём каталог создаётся даже если вирус был удалён как неизлечимый! Чтобы снести этот каталог приходится лезть в свойства и делать себя владельцем. А если ваш знакомый притащил Flash накопитель с вирусом? Не вопрос! Он теперь будет наслаждаться на своей Flash ещё и скрытым каталогом "Drweb Quarantine", несмотря на то, что у него дома вообще другой антивирус стоит - программистам из Dr.Web на это плевать, как и на пользователей. У всех нормальных антивирусов есть каталог "Quarantine Files", где-нибудь в %APPDATA%, но Dr.Web - это русский антивирус - бессмысленный, безжалостный и беспощадный!!! 5) ТОРМОЗНАЯ (да-да! у Dr.Web именно ТОРМОЗНАЯ) система проверки файлов - не поверите, когда писал распаковщик для Zanzarah: The Hidden Portal (в последних обновлениях на сайте есть) - я охренел дожидаться пока архив распакуется, но как только отключил SpiDer Guard - файлы распаковались просто с бешеной скоростью! Та же самая вещь с установкой и удалением программ - переустановка Apache, например, занимает с включённым антивирусом просто дикое количество времени. Нахрен такой антивирус, который постоянно приходится выключать?! Вот, несмотря на то что Symantec был прожорлив и тормозил сильно при загрузке, скорость распаковки файлов с ним не сильно снижалась, при этом вирусы он не пропускал. А ведь я перешёл на Dr.Web именно из-за усиленно распространяемых непонятно кем (отделом по пиару?..) "слухов" про его "быстродействие"! И, кстати, у меня лиц.версия - мне знакомые люди ключ подарили, с намёком, что Dr.Web "быстрый", мол, тебе пригодится с твоим компьютером... Плюсы: 1) Не удаляет keygen и crack... хотя на фоне того, что он удаляет мои программы, где никогда вирусов не было - это жиденький плюс. 2) Грузится и обновляется немного быстрее, чем Symantec... Короче, я сейчас присматриваюсь к другим антивирусам. Вероятность того что я буду переходить с этого ужаса летящего на крыльях ночи под названием Dr.Web равна 500%. И, кстати, почитал форум Dr.Web - там им пользователи много во что носом тыкали, чтобы исправили. Думаете хотя бы зачесались? Хрен там - только отшучиваются в ответ. Конструктивный диалог невозможен - желаю растерять им всю свою аудиторию и разориться. |
Siberian GRemlin, | ||
Jun 19 2010, 12:03 | Обмен любезностями | QUOTE(Axsis @ Jun 19 2010, 11:16) [snapback]2940[/snapback] Ну почему же? Выпуская по одной игре серии в год, раз в пятилетку получается весьма достойный экземпляр. Но не факт, что выпускай они по одной игре в раз пять лет, получалось бы каждый раз выпускать хит. Всё познаётся в сравнении Это точно. Ладно, поживём - увидим.QUOTE(Axsis @ Jun 19 2010, 11:16) [snapback]2940[/snapback] PS: со 2 по 14 июня принимал участие с бета-тестировании NFS:World - тоже довольно интересная штука, помимо гонок с онлайновыми соперниками можно и от копов поудирать. Карта довольно большая, состоит из 3 частей (все соединены между собой, конечно) - первая часть - полностью карта из most wanted, вторая - из carbon, а третья - новая. Вроде как и сэкономили, а вроде как и ничего плохого в этом нет - знакомые трассы и знаешь где можно срезать путь или избавиться от погони Это Online-версия NFS что-ли? Massively multiplayer online racing simulator? Хе-хе.Кстати, узнал случайно про вот такую игру - эдакая смесь из Portal и Mirror's Edge. Tag_Setup.exe занимает 58,215,165 байт - это кто качать с офсайта будет. Почему-то закачка рвётся, а размер при скачивании сервер не указывает. Посмотрел видео на трубе (осторожно - это прохождение - спойлеры!) захотелось самому попробовать, но обломался - игра требует шейдеры версии 2.0a, а у меня вообще никаких нет... |
useretail, | ||
Jun 15 2010, 10:25 | Обмен любезностями | EA анонсировала новую часть Need for Speed Вот интересно, как потом будут различать старую Hot Pursuit и новую? Особенно это бесит когда ищешь что-нибудь в Интернете - ищешь старую вещь, а тебе только новую лажу с тем же названием поисковик выплёвывает... P.S. Оружие в NFS... да... Вообще, в выпусках всяких продолжений самое главное - это вовремя остановиться. |
Axsis, | ||
Jun 1 2010, 17:46 | Delphi, Asm, C, WinAPI, PHP, ... | Иногда бывает надо при распаковке игровых архивов попутно создавать необходимые каталоги. Например для файла: DATA\TEXTURES\ENVIRONMENT\SKY_01.TGA их нужно создать аж 3 штуки. Вот небольшие куски кода на Delphi и C для таких вещей. Обрабатываются обе косые черты. В обоих случаях идентификатор S не должен являться константой. CODE For I:=1 To Length(S) Do If ((S[I] = '\') Or (S[I] = '/')) Then Begin CreateDirectory(PChar(Copy(S, 1, I - 1)), Nil); { Delphi понимает только слэш } S[I]:='\'; End; CODE char *s; ... s = filenamepath; while(*s){ if((*s == '\\') || (*s == '/')){ *s = 0; mkdir(filenamepath); /* а C понимает только такой */ *s = '/'; } s++; } |
Siberian GRemlin, | ||
May 3 2010, 10:08 | Замена системных модулей для Delphi | Вопрос - чем можно воспользоваться в Delphi для увеличения длины строки до нужного размера? Если писать так: CODE SetLength(S, Len); То при использовании DCC32HACK в готовый код пихается куча всякого барохла, в частности строчка имени программы указанная в: CODE Program PrgName; Т.е. в исполняемый файл зачем-то пихается строчка "PRGNAME", если не писать "Program...", то на месте "PRGNAME" будет слово "PROGRAM". Зачем это делается - знают только в фирме Borland. Если использовать: CODE S:=#32; While Length(S) < Len Do S:=S + S[1]; То это долго. Можно конечно и так: CODE S:=#32; While Length(S) < Len Do S:=S + S; S:=Copy(S, 1, Len); Но при большом Len это будет занимать в два раза больше чем надо памяти на финальном шаге - как следствие жуткие тормоза при реаллоцировании. Есть какие-нибудь ещё способы удобные? Для тех случаев, когда нужна именно строка - когда нужен просто буфер, то там и GetMem()'ом обойтись можно... Или тогда вопрос к Grom PE ты можешь в DCC32HACK как-нибудь перехватить работу с SetLength()?.. |
Grom PE, | ||
Apr 22 2010, 10:05 | Delphi, Asm, C, WinAPI, PHP, ... | Чтобы долго не писать чего да как - приведу [cut=лог чата] QUOTE ******: можно тогда тебя отвлеч глупым вопросом? -=CHE@TER=-: Давай. ******: есть девайс. типа ноут. ******: есть оборудование - типа жпс приёмник. ******: оно типа встроено и его не видно ******: покуда не будет запущена утилита и не поставлена галочка ******: вопрос -=CHE@TER=-: Даже Everest не видит? А в BIOS девайс этот включён? -=CHE@TER=-: А, понял. ******: можно ли как то отследить что делает эта утилита ******: тоесть покуда она не занесёт какой то битик в памяти - девайс не виден даже в эвересте -=CHE@TER=-: Теоретически возможно всё. ******: а помню на двк была прога... типа оболочки -=CHE@TER=-: А после закрытия утилиты и выгрузки её из памяти - девайс продолжает работать? ******: и можно было пошагово отслеживать выполнение программы ******: да. продолжает ******: если утилиту запустить повторно - то девайс исчезает :) -=CHE@TER=-: Возможно она свой драйвер ставит, который после перезагрузки отваливается (так и задумано). ******: неее ******: драйверами не пахнет 100% -=CHE@TER=-: Дай мне эту тулзу. -=CHE@TER=-: И скажи чего ты там и где ставишь. ******: ща ******: я кинул ******: жпс активатор написал не знаю кто ******: изначально и этого даж не было ******: DEVICE_SWITCH.EXE поидеи запускается жпс активатором, автоматом передвигает курсор и жмёт применить ******: Enable gsc3f GPS -=CHE@TER=-: Прикол. -=CHE@TER=-: Оно у меня не запускается. ******: угу, вначале проверяет есть ли оборудование? -=CHE@TER=-: Видимо, да. -=CHE@TER=-: Т.е. оно запускается и тут же выходит. -=CHE@TER=-: Даже ничего не сообщает. ******: поидеи папка тулс должна находиться в корне диска ц -=CHE@TER=-: А какая разница? ******: покрайней мере когда она там... мне сообщает на обычном компе что девайс не может быть выключен -=CHE@TER=-: У-у-у... Оно тут через DeviceIoControl работает... ******: переведи на земной язык :) -=CHE@TER=-: Это проще будет документацию по устройству найти и написать свою программу, чем разбираться в исходном коде. -=CHE@TER=-: Тут сильно замороченный алгоритм её включения / выключения. -=CHE@TER=-: Нужна спецификация: в какой порт чего пихать, что должно прийти, что означает и т.д. -=CHE@TER=-: http://mikhail.krivyy.com/2004/07/28/asus-l3c-led/ -=CHE@TER=-: Вот например - человек включает и выключает лампочку светодиода. -=CHE@TER=-: Нужно тоже самое, но для твоего GPS. -=CHE@TER=-: Ща тогда тебе ломанный файл дам - просто сграблю значения. -=CHE@TER=-: Лови. -=CHE@TER=-: Скопируй к себе на ноут и запусти, затем дай содержимое файла KERNEL.LOG, который появится. -=CHE@TER=-: После запуска нажми, чтобы оно разрешило твоё устройство. ******: угу ******: готово DeviceIoControl(232,2237444,INBUFF:1 1381453892 0 0 0 ,20,OUTBUFF768,) DeviceIoControl(232,2237444,INBUFF:2 1447380049 1 8 1237008 ,20,OUTBUFF768,) CBFARR(0 4 2) DeviceIoControl(232,2237444,INBUFF:2 1313817683 1 8 1240192 ,20,OUTBUFF768,) CBFARR(0 4 2) DeviceIoControl(232,2237444,INBUFF:1 1381453892 0 0 0 ,20,OUTBUFF768,) DeviceIoControl(232,2237444,INBUFF:2 1447380049 1 8 1237008 ,20,OUTBUFF768,) CBFARR(0 4 2) DeviceIoControl(232,2237444,INBUFF:2 1179599955 1 8 1240192 ,20,OUTBUFF768,) CBFARR(0 4 2) -=CHE@TER=-: Я сделал прогу. ******: что где тестить*? -=CHE@TER=-: Лови gsc3fgps.exe -=CHE@TER=-: Если просто запустишь - то включит, если с каким-либо параметром (любым) - то выключит. ******: ура! работает :) -=CHE@TER=-: Сунь тогда прогу в автозагрузку - будет сразу при включении компьютера подключать твой GPS. Код программы: CODE program gsc3fgps; {$IFNDEF DCC32HACK}uses Windows;{$ENDIF} // http://mikhail.krivyy.com/2004/07/28/asus-l3c-led/ // http://mikhail.krivyy.com/wp/wp-content/uploads/2006/10/asusled.cpp // http://www.scintilla.utwente.nl/~timl/devicepower/v1.1/devicepower.c const ATKACPI_IOCTL_CODE = $222404; // ioctl command codes DPWR = $52575044; // Device Power list QDEV = $56454451; // Query Device SDON = $4E4F4453; // Set Device On SDOF = $464F4453; // Set Device Off type ioctl_arg = packed record dummy: word; arg_bytes: word; value: longword; end; pioctl_arg = ^ioctl_arg; ioctl_cmd = packed record ctype: longword; cmd_code: longword; has_arg: longword; arg_bytes: longword; arg: pioctl_arg; end; function CtrlACPI(ATKACPIhandle: THandle; code, hasArg, arg: longword): longbool; var iarg: ioctl_arg; icmd: ioctl_cmd; bout: longword; buff: array[0..191] of longword; begin bout := 0; iarg.dummy := 0; iarg.arg_bytes := 4; iarg.value := 2; icmd.ctype := hasArg; icmd.cmd_code := code; icmd.has_arg := arg; icmd.arg_bytes := 8 * arg; icmd.arg := pioctl_arg(longword(@iarg) * arg); result := DeviceIoControl(ATKACPIhandle, ATKACPI_IOCTL_CODE, @icmd, sizeof(icmd), @buff[0], sizeof(buff), bout, nil); end; // enable gsc3f GPS var ATKACPIhandle: THandle; begin ATKACPIhandle := CreateFile('\\.\ATKACPI', GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0); if ATKACPIhandle <> INVALID_HANDLE_VALUE then begin CtrlACPI(ATKACPIhandle, DPWR, 1, 0); CtrlACPI(ATKACPIhandle, QDEV, 2, 1); if ParamCount <> 0 then CtrlACPI(ATKACPIhandle, SDOF, 2, 1) // OFF else CtrlACPI(ATKACPIhandle, SDON, 2, 1); // ON CloseHandle(ATKACPIhandle); end; end. |
Siberian GRemlin, | ||
Dec 5 2009, 16:36 | Delphi, Asm, C, WinAPI, PHP, ... | QUOTE(-=CHE@TER=- @ Jun 25 2009, 04:10) [snapback]2704[/snapback] Однако! Первая строчка с получением 0 байт у меня работает нормально (XP SP3), а на соседней машине (2003 SP2) появляется BSoD с DRIVER_IRQL_NOT_LESS_OR_EQUAL. При этом сама машина с 2003 работает нормально и BSoD там никогда не было. Как оказалось BSoD был совсем не там...Короче, перед CloseSocket(), особенно для UDP-соединений нужно делать shutdown(), желательно с SD_BOTH, иначе на некоторых сетевых картах, драйвера к которым писали криворукие имбецилы, очень быстро забивается буфер и случается BSoD (т.к. приложение уже не забирает пакеты из буфера и вообще закрыло сокет, а тупой драйвер всё ещё продолжает их туда пихать). На сетевых картах, драйвера к которым писали вменяемые люди, при таком раскладе буфер самоочищается и сокет самозакрывается - т.е. сделана жёсткая проверка "на дурака". |
Siberian GRemlin, | ||
Упрощённая версия | Сейчас: 25th September 2024 - 17:15 |