IPB

Добро пожаловать, гость ( Вход | Регистрация )

История благодарностей участнику -=CHE@TER=- ::: Спасибо сказали: 311 раз(а)
Дата поста: В теме: За сообщение: Спасибо сказали:
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]
Эм.. тоесть реализовать сложно? unsure.gif

Теоретически есть программы, которые могут вообще в автоматическом режиме снимать эту защиту.
Но работают только со старыми версиями 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;
{$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.
[/cut]
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]
Ну почему же? Выпуская по одной игре серии в год, раз в пятилетку получается весьма достойный экземпляр. Но не факт, что выпускай они по одной игре в раз пять лет, получалось бы каждый раз выпускать хит. Всё познаётся в сравнении wink.gif
Это точно. Ладно, поживём - увидим.

QUOTE(Axsis @ Jun 19 2010, 11:16) [snapback]2940[/snapback]
PS: со 2 по 14 июня принимал участие с бета-тестировании NFS:World - тоже довольно интересная штука, помимо гонок с онлайновыми соперниками можно и от копов поудирать. Карта довольно большая, состоит из 3 частей (все соединены между собой, конечно) - первая часть - полностью карта из most wanted, вторая - из carbon, а третья - новая. Вроде как и сэкономили, а вроде как и ничего плохого в этом нет - знакомые трассы и знаешь где можно срезать путь или избавиться от погони smile.gif
Это 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.
[/cut]

Код программы:
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,
Nov 4 2009, 14:42 Hitman 2 и 3
У меня ни той, ни другой игры нет, так что помочь не смогу.
А сколько каждая из них в архиве занимает?
Я просто не знаю где могут заголовки храниться, но, если в отдельном файле лежат, то он может быть, к примеру, зашифрован.
Ещё, маловероятно, но всё же, они могут быть прямо в .EXE файле игры. Тупо, конечно, но вот, скажем, Silent Hill 2, шрифты свои в sh2pc.exe хранит как массив байт.
useretail,
Oct 8 2009, 15:35 Обмен любезностями
Обновил свой сайт сегодня - мне товарищ из далёкой Бразилии (!) помог дожать патч ко второму турку, чтобы музыка под Vista / Seven тоже нормально работала. Плюс туда же добавил патч для мультипроцессорных систем. Ко всему этому доступны исходные коды. Все подробности на сайте.
Siberian GRemlin,

7 Страниц V « < 3 4 5 6 7 >
Упрощённая версия Сейчас: 19th April 2024 - 10:48