IPB

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

> Westwood Studios .MIX, ID и имена файлов
Siberian GRemlin
Jul 20 2006, 05:48
Сообщение #1


Advanced Member
***

Группа: CTPAX-X
Сообщений: 533
Регистрация: 4-February 08
Пользователь №: 2
Спасибо сказали: 221 раз(а)



Есть алгоритм получения ID по имени файла, реально ли сделать обратный алгоритм?!
CODE
function ROL(l:longint):longint;
begin
  ROL:=(l shl 1) or (l shr 31);
end;

function CalcID(name:string):longint;
type PLong = ^longint;
var l,i:integer;
    Calc:longint;
begin

  l:=length(name);
  if l>12 then l:=12;
  for i:=1 to l do Name[i]:=UpCase(Name[i]);
  for i:=l+1 to 13 do name[l]:=#0;

  Calc:=0;
  l:=1;
  while name[l]<>#0 do
  begin
    Calc:=ROL(Calc)+PLong(@name[l])^;
    Inc(l,4);
  end;

  CalcID:=Calc;
end;
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
 
Reply to this topicStart new topic
Ответов
-=CHE@TER=-
Mar 27 2011, 06:22
Сообщение #2


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,355
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 311 раз(а)



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*" поставить, чтобы системные обращения в лог не валились.


Спасибо сказали:
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

Сообщения в этой теме


Reply to this topicStart new topic
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0 -

 



Упрощённая версия Сейчас: 27th April 2024 - 10:07