Версия для печати темы

Нажмите сюда для просмотра этой темы в оригинальном формате

CTPAX-X _ Программы _ Westwood Studios .MIX

Автор: Siberian GRemlin Jul 20 2006, 05:48

Есть алгоритм получения 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;

Автор: jTommy Jul 20 2006, 15:05

К сожалению нереально. Здесь операция сложения и известна только конечная сумма. Вариантов разложения на слагаемые очень много и какой из них правильный - неизвестно.

Автор: Xplorer Jul 20 2006, 15:38

Есть три способа узнать имена файлов:
1. поискать их в exe-файле
2. модифицировать exe-файл так, чтобы он сам выдавал имена файлов, для которых вычисляется ID
3. написать прогу, которая будет по ID выдавать подходящие имена файлов (brute force)

Автор: -=CHE@TER=- Mar 27 2011, 06:22

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 в http://technet.microsoft.com/en-us/sysinternals/bb896645, но я им не пользовался), потому что, скажем, игра Blade Runner сначала пытается открыть файл в текущем каталоге, а потом уже лезет в .MIX - имена без проблем перехватываются. Главное фильтр типа "*blade.exe*" поставить, чтобы системные обращения в лог не валились.