![]() |
Добро пожаловать, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
Siberian GRemlin |
![]()
Сообщение
#1
|
![]() Advanced Member ![]() ![]() ![]() Группа: CTPAX-X Сообщений: 537 Регистрация: 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; |
jTommy |
![]()
Сообщение
#2
|
Наблюдающий ![]() ![]() ![]() Группа: CTPAX-X Сообщений: 197 Регистрация: 4-February 08 Из: деревня Москва Пользователь №: 6 Спасибо сказали: 19 раз(а) ![]() |
К сожалению нереально. Здесь операция сложения и известна только конечная сумма. Вариантов разложения на слагаемые очень много и какой из них правильный - неизвестно.
|
Xplorer |
![]()
Сообщение
#3
|
Advanced Member ![]() ![]() ![]() Группа: CTPAX-X Сообщений: 52 Регистрация: 4-February 08 Пользователь №: 8 Спасибо сказали: 30 раз(а) ![]() |
Есть три способа узнать имена файлов:
1. поискать их в exe-файле 2. модифицировать exe-файл так, чтобы он сам выдавал имена файлов, для которых вычисляется ID 3. написать прогу, которая будет по ID выдавать подходящие имена файлов (brute force) |
-=CHE@TER=- |
![]()
Сообщение
#4
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,360 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 313 раз(а) ![]() |
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*" поставить, чтобы системные обращения в лог не валились. Спасибо сказали:
|
![]() ![]() |
Упрощённая версия | Сейчас: 9th September 2024 - 13:54 |