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

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

CTPAX-X _ Ресурсы _ Command & Conquer: Red Alert [Hidden Easter Egg]

Автор: -=CHE@TER=- Jun 2 2014, 13:23

QUOTE
2020.04.11 note:
Original codes found with dictionary attack performed by -=CHE@TER=-.
Special thanks to kampaster for first brute-force attack attempt!
Hidden commandline argument for hash 0xD95C68A2: FROMINSTALL
Hidden word for network chat which triggers developer easter egg quotes for hash 0x72A47EF6: FELTPLAYWORK
This topic below contains some historic details for anyone interested.

Товарищ Siberian GRemlin, у меня к тебе вопрос, как к знатоку игр Westwood.
В первом C&C:RA в исполняемом файле (RA95.EXE - только я не помню, это он такой и был, или я в него RA95.DAT переименовал) есть строчки текста типа таких:
QUOTE
Denzil L
This would be better on the Mac.
Greg H
But does it fit into 2 MB?
Я так понимаю, что это шуточные цитаты от разработчиков.
Подумал было, что они есть в титрах - просмотрел их до конца, но ничего не вылезло.
Ты не в курсе где и как этот текст в игре выводится?
Гуглунием "c&c red alert easter egg quotes" ничего не нашёл.

Автор: Siberian GRemlin Jun 2 2014, 13:35

Да, я сам видел там много приколов, но как их запустить в игре не знаю.

Автор: -=CHE@TER=- Jun 2 2014, 17:38

Смотри какая штука - там есть дикая функция, которая считает хеш от строк (привет The Neverhood).
У меня RA95.EXE выводит версию V3.03E - для других смещения будут другие.
Собственно, сама функция: sub_4F5C0C. У ней один входной параметр - это строка (в EAX).
Возвращается её хеш.
В игре эта функция используется два раза для двух хешей:
RA95.EXE:000F4DD0 - тут первый хеш: $D95C68A2 (параметр командной строки)
RA95.EXE:00108218 - тут второй хеш: $72A47EF6 (неизвестно; может имя пользователя для сетевой игры?..)
Я выдернул код подсчёта хеша и попробовал перебором подобрать - не получилось.
Там реально вырвиглазный подсчёт идёт, в том числе по таблице для каждого символа ASCII.
Зато хеш можно заменить. Например, для слова "boom" хеш будет $03432522.
Если заменить первый хеш (D95C68A2) хешем для "boom", то запустив игру:
RA95.EXE boom
Будет пропущен вступительный ролик (там ещё какая-то странная серая табличка "STAND BY" промелькнёт) и сразу стартует кампания за Советов (не знаю на какой сложности).
Со вторым хешем сложнее - я так и не понял, где и что он включает, но от него зависит как раз вывод тех строк-приколов и ещё где-то рядом надпись "SECRET UNITS ON" (даёт возможность производить секретные типы войск?..). Там ещё какая-то строчка выше по коду про инициализацию сети была, так что, подозреваю, что эти строки-приколы вызываются в меню мультиплеера, но у меня кнопка "Network" там не работает - выкидывает назад в главное меню.

Автор: Axsis Jun 3 2014, 19:41

Нашел вот по RA2 статью по ключам запуска. Возможно, что-то сработает и в первом?
_http://modenc.renegadeprojects.com/Red_Alert_2

Автор: -=CHE@TER=- Jun 3 2014, 20:18

Прикольно, только по хешу, увы, не подходит. Хотя набрать код в главном меню - это интересная идея.
Вот исходные коды с выдранным куском считающим хеш:
http://www.ctpax-x.org/uploads/ra95hash.zip
Запускать так: ra95find.exe 0 "boom"
Получим: 03432522
Вместо "boom" любое интересующее нас слово или выражение, хеш которого хотим узнать.

Кстати, я как-то пробовал перебором к The Neverhood коды подбирать.
Увы, только код "please" подбирается, т.к. в остальных есть как минимум один бит, который и включается и выключается (+2 буквы на каждый такой бит)...

P.S. Вынес сообщения в отдельную тему.

Автор: Siberian GRemlin Jun 12 2014, 17:31

QUOTE(-=CHE@TER=- @ Jun 3 2014, 01:38) *
Будет пропущен вступительный ролик (там ещё какая-то странная серая табличка "STAND BY" промелькнёт) и сразу стартует кампания за Советов (не знаю на какой сложности).
После установки игры первый запуск автоматически начинает новую игру. После чего игра запишет параметр в INI, чтобы при последующих запусках игры открывалось главное меню. Как я помню, у меня всегда начиналась первая кампания, но, возможно, я всегда устанавливал с первого диска и с него же запускал.

Автор: -=CHE@TER=- Jun 13 2014, 10:08

QUOTE(Siberian GRemlin @ Jun 12 2014, 17:31) *
После установки игры первый запуск автоматически начинает новую игру. После чего игра запишет параметр в INI, чтобы при последующих запусках игры открывалось главное меню.
Точно!
REDALERT.INI:
QUOTE
[Intro]
PlayIntro=no
Это строчка появляется после первого запуска - специально сейчас проверил.
До этого её нет и игра именно так себя и ведёт - показывает все ролики и запускает первую миссию.
По той ссылке, которую привёл товарищ Axsis выше, так и написано:
QUOTE
(Unknown switch, encrypted)
Show the intro movie (Equivalent to setting Ra2md.ini [Intro]→Play=yes.)
Я попробовал хеши от всяких "-firstrun", "-playintro", "-forceintro" (с "-" и без него), но безрезультатно...

Автор: Siberian GRemlin Oct 25 2014, 05:21

А ты как смотрел «RA95.DAT»? У меня что-то «IDA» его до конца отказывается кушать. Я обновляю перевод и мне нужно длину строки изменить, а строка в конце файла.

http://imgur.com/yUqlczV

Автор: -=CHE@TER=- Oct 25 2014, 10:13

А у тебя какая IDA? Здесь, может быть, такая же хрень как с Кирандией - новая IDA не может нормально весь файл дизассемблировать. Если совсем не поможет - запусти игру под Олькой и поставь бряк на обращение к памяти (чтение) своей строки - там где-то рядом и будет место её адреса.

Автор: Siberian GRemlin Oct 25 2014, 11:26

5.2.0.908. «Кирандию» как раз хавает. Ладно, не так важно, за той строкой идут сообщения для игры через интернет, которая сейчас не работает вроде: можно пренебречь. Как вариант — напишу прогу для поиска массива указателей по длинам тех строк.

Автор: -=CHE@TER=- Oct 25 2014, 16:49

Что за строчка-то? Можешь её полностью процитировать?

Автор: Siberian GRemlin Oct 25 2014, 17:11

QUOTE
Counterstrike Missions
Aftermath Missions
You cannot disable viewing of your own messages!

$205C60

Автор: -=CHE@TER=- Oct 25 2014, 18:18

Короче, рассказываю:
1) Открываешь свой файл через HIEW.
2) Встаёшь на первую букву любого сообщения.
3) Переходишь в ASM-режим (F4 - Decode или два раза Enter).
4) Жмёшь F6.
5) Всё.
6) Если, вдруг, строчка используется в нескольких местах, то после того как нашлось первое сразу же жмёшь CTRL+F6 и так пока все ссылки не будут найдены.

И, кстати, поиск массива указателей тебе не поможет, потому что там не массив. (*улыбается*)

Автор: -=CHE@TER=- Nov 2 2014, 14:02

Товарищ Siberian GRemlin!
Во-первых, поздравляю с очередным релизом, во-вторых, замечания принимаются?
Решил поставить перевод на свою версию C&C:RA (какой-то рип, с какого-то сборника - очень давно у меня на винте лежит, так что не смогу вспомнить где взял).
Что меня в твоём переводе удивило:
1) Путь установки был предложен как... "C:\Program Files\Far". Эээ... так и должно быть?
2) Если воспользоваться переключателями снизу, то путь меняется на "C:\WESTWOOD\REDALERT" - у меня игра и не там стоит, ну да ладно (подозреваю, что ты пытаешься настройки из реестра прочитать, а у меня рип, который ничего туда не писал... но Far-то откуда?).
3) Далее перевод отказывался установиться, ибо у меня чего-то нехватало, хотя окно требовало с меня версию 3.03 (она у меня и так стоит) или 3.05. Потом до меня дошло - переименовал RA95.EXE обратно в RA95.DAT и твой перевод встал. Можно ли как-то (пожелание) сделать сообщение об ошибке более информативным, чтобы пользователь знал на каком файле программа стопорится или что ей не нравится? Я, конечно, понимаю, что человек нормально поставивший игру и обновление на неё такой ошибки не получит, но на всякий случай решил о такой вещи упомянуть.
4) В результате обновились файлы RA95.DAT (EXE) и WOLAPI.MIX. Других изменений не заметил. Загрузил одну из своих старых игр (года два или три назад играл последний раз), но при вызове "Меню" -> "Инструкции" задание миссии всё ещё на английском. Это так и должно быть или задание сохраняется в файл вместе с сохранённой игрой, поэтому и осталось непереведённым? Если так, то, может, стоит об этом где-нибудь упомянуть при установке перевода, а то вводит в заблуждение.
Вроде бы всё.

Автор: Siberian GRemlin Nov 2 2014, 16:12

QUOTE(-=CHE@TER=- @ Nov 2 2014, 21:02) *
1) Путь установки был предложен как... "C:\Program Files\Far". Эээ... так и должно быть?
2) Если воспользоваться переключателями снизу, то путь меняется на "C:\WESTWOOD\REDALERT" - у меня игра и не там стоит, ну да ладно (подозреваю, что ты пытаешься настройки из реестра прочитать, а у меня рип, который ничего туда не писал... но Far-то откуда?).
Логика такая.
Если русификатор уже был установлен (предыдущая версия, например; только для русификаторов на «Inno»), то берётся её путь. «Inno» сам его подхватывает из своих ветвей реестра, в противном случае устанавливается путь из его глобальной переменной {sd} (системный диск). Я проверяю: если это {sd}, то нажимаю первую кнопку (обычное издание), которая ищет путь в реестре, и если его нет, тогда устанавливает пусть по умолчанию предлагаемый «Westwood Studios» при установке игры.

Либо у тебя так в системе прописан системный диск, либо это заморочки «Inno». Раньше никаких проблем не было.

3) Официальная позиция такова, что игрок должен иметь полную версию без сторонних изменений. Имена файлов не выводятся для усложнения жизни воришек переводов. Ты конечно можешь с этим спорить, но см. первое предложение сего абзаца. Да и в некоторых русификаторах пришлось бы «простыни» со списками файлов выводить на экран.

4) Допишу пока на сайте, ибо ради строки в информационном блоке, который мало кто читает, обновлять русификатор не целесообразно.

P. S.
QUOTE(-=CHE@TER=- @ Nov 2 2014, 21:02) *
релизом
Терпеть не могу это слово.

Автор: -=CHE@TER=- Nov 3 2014, 18:41

Ага, понятно.

P.S.

QUOTE(Siberian GRemlin @ Nov 2 2014, 16:12) *
Терпеть не могу это слово.
А как тогда правильно говорить? "Поздравляю с выпуском новой версии"? "Нового обновления"? Или как? Вообще, ты знаешь, я не хочу разводить бессмысленные споры (чуть было не написал "холивар"), но в любой профессиональной среде есть свой устоявщийся, скажем так, язык (сленг).
И когда ты не используешь его, то выглядишь как минимум странно, если не сказать хуже.
Знаешь, я одно время работал в коллективе с людьми в весьма солидном возрасте. Очень сложно потом было на новой работе, где были люди моего возраста и младше, говорить "клиент" вместо уже привычного "заказчик". Про всякие "тимбилдиг", "майлстоун", "коммит" и ещё хрен знает сколько других слов, от которых, поверь мне, я тоже как и ты офигеваю, но... ничего сделать не могу. Я один и ситуации не изменю, так что остаётся только подстраиваться под уже существующую среду. К тому же силы и время можно потратить на более полезные вещи, нежели бороться за чистоту русского языка.
Да и, вообще, ты не задумывался, что любой язык (если он не мёртвый) всё время пополняется новыми словами и выражениями. В данном случае, они, конечно, все заимствованные, но согласись проще сказать "коммит", чем "добавление последних изменений в центральное хранилище (репозиторий) исходных кодов"? (*улыбается*)
Про художественную литературу я ничего не говорю, но в профессиональной среде свой язык.

Автор: -=CHE@TER=- Nov 19 2017, 14:30

Короче, отриверсил я эту фигню из ассемблера.
Всё лежит там же в 5-ом сообщении. Старый код на асме на всякий случай оставил.
По ходу дела выкинул, наверное, 50% кода, ибо он никогда не исполнялся или был совершенно бесполезен.
Там, кстати, вообще, дикая наркомания творилась, например, как вам нравится такой код:

CODE
k1 = buf_hash(str, len);
strrev(str); // "ABC" -> "CBA"
k2 = buf_hash(str, len) ^ k1;
strrev(str); // "CBA" -> "ABC"
key = k2 ^ k1;

Вы поняли, да, что последняя строчка разворачивается в:
key = k2 ^ k1 ^ k1;
Из чего получается (ибо k1 xor k1 = 0):
key = k2;
Что говорит нам об особых умственных способностях того, кто писал этот алгоритм.
Я сократил всё такое лишнее, что не влияло на вычисления и код стал очень даже понятным и простым.
Но вот сама функция вычисления этой суммы - по прежнему наркомания дранная.
Я, вообще, не понимаю какой смысл был такую функцию сложную делать (её же, блин, кто-то писал, рабочее время на это тратил, а это ведь даже не защита от несанкционированного копирования).

Основное, что нужно знать про хеш:
1) Он не может быть больше 128 символов.
2) Все английские бувы перед вычислением переводятся в верхний регистр.
3) Все непечатные символы (функция isgraph()), т.е. не лежащие в диапазоне от 33 до 126 включительно заменяются на заглавные латинские буквы в зависимости от позиции в строке.
4) Строка добивается теми же латинскими заглавными буквами до 16 символов в длинну, если меньше, или до значения кратного 4.
5) После этого над строчкой делается разного рода наркомания (см. исходные коды), как например пропуск через два 8-ми байтовых массива, которые часть битов в байте делают всегда 1, а часть всегда 0 (не удивляйтесь, когда у вас 2, а и то и 5 разных строк будут давать одинаковый хеш).

Товарищ Axsis!
У тебя здорово со всякими хешам получается - можешь чего-нибудь посоветовать для упрощения перебора? Потому что влоб там не получится, разве что можно заоптимизировать выкинув маленькие буквы из диапазона [32..126], но это всё равно дофига.

Автор: -=CHE@TER=- Nov 22 2017, 18:33

QUOTE
Note: use $ERA? or @ERA! as word for network chat to activate developer quotes easter egg - it's shortest possible and easy to remember.
Мву-ха-ха-ха-ха!!!
А я взломал второй хеш перебором!
Как я уже сказал, алгоритм кривой, так что там очень много коллизий, поэтому этот хеш, я уверен, совсем не то что задумывали разработчики, но это не так уж и важно для использования.
Строчка ZGDHD даёт хеш 0x72A47EF6. НО!!! К введённому слову игра добавляет пробел в конец. Поэтому нужный хеш это слово BAPXBN - его нужно ввести в качестве текста в чате (Multiplayer game - Network) и тогда:
1) Автоматически добавятся соперники с именами разработчиков Westwood.
2) В чат посыпятся те самые цитаты.
3) Может быть ещё что-то изменится (появятся новые юниты для строительства в игре?).
Ииииххххаааа!!!
Proudly brought to you by -=CHE@TER=- after 21 year since game release!
Внимание! Чтобы войти в режим игры по сети на современных системах нужно обязательно установить http://ra.afraid.org/html/downloads/fixes.html!
P.S. Перекачайте исходные коды - я ошибся, там не isprint() была функция, а isgraph() - она ещё пробел отсекает.
P.P.S. Хеш для ключа командной строки всё ещё не могу взломать. Я только предполагаю, что он, как и все остальные ключи в игре, должен начинаться с "-" (-DESTNET, -SOCKET, -MESSAGES, etc.).
CODE
Matched strings for hash 0x72A47EF6 (6 chars, only A..Z letters).
WARNING: game adds a space character at the end
of each message entered in the chat.
So the actual string passed to the hash routine
not "BAPXBN" but "BAPXBN " (with space at the end)!
BAPXBN
LEPLML
LKXLYY
LMXLYX
LUXLYT
LWXLYS
POXTGW
PQXTGV
PYXTGR
VKXLTY
VMXLTX
VUXLTT
VWXLTS
ZAPTFN
ZCPTFM
ZOXTBW
ZQXTBV
ZYXTBR

Автор: -=CHE@TER=- Nov 25 2017, 12:25

QUOTE
Note: use RJWBADCF as word for command line key to activate initial mode - it's easy to remember.
Офигеть!!! Серьёзно!!!
Наш казначей, товарищ kampaster, просто нереально крут! Он согласился на своём компьютере заняться брутфорсом (я сделал ему программу для перебора, ибо мой компьютер слишком стар для всего этого) и ему, вы не поверите, удалось за три дня найти коллизии для второго хеша - 0xD95C68A2!
Proudly brought to you by kampaster after 21 year since game release!
CODE
Run the game with any of these as command line key like this: RA95.EXE RJWBADCF

Matched strings for hash 0xD95C68A2 (6 chars, all allowed characters).
FVE[OT
FVM[/T
T&FAH3
\7>-5C
\\'HI\
{N*].Z

Matched strings for hash 0xD95C68A2 (7 chars, all allowed characters).
!#=J`}P
!&&A9R#
!;WHM([
!>}RM+E
"#9A"8J
"#;A"8I
"#=8:@2
"#=A"8H
"#?8:@1
"#?A"8G
"#AYZ,B
"#B8I(]
"#CYZ,A
"#EYZ,@
"'B`A>}
"+B7Y,_
";8Y:"J
";:Y:"I
";<Y:"H
";>Y:"G
"?)1*62
"?+1*61
"?-1*60

Matched strings for hash 0xD95C68A2 (9 chars, all allowed characters).
!!!~'/_8=
!!"L0}KA>
!!"`"))@<
!!#='DW&%

Matched strings for hash 0xD95C68A2 (10 chars, all allowed characters).
!!!!5Q~"DG

Matched strings for hash 0xD95C68A2 (11 chars, all allowed characters).
!!!!!3+,XTJ
!!!!!9{7W~'

Matched strings for hash 0xD95C68A2 (8 chars, only A..Z letters).
GCZEBWAE
RJWBADCF
XKLDCBCZ

Few matched strings for hash 0xD95C68A2 (9 chars, only A..Z letters).
AJUHYHEUD
AVOUHFKIB

Matched strings for hash 0xD95C68A2 (11 chars, only 0..9 digits).
04246126134
08287517540
08975635245
18474608869
34184024810
41150738524
44492175931
46381858073
76984168566

Few matched strings for hash 0xD95C68A2 (12 chars, only 0..9 digits).
035923415929
038800295595
038819562294
043587072070
051453070824
058901584061
065904284415
128541931672
128770991034
137510531255
154783033536
158392813664
176945835093
178769570821
194891223927
194899223527
209979117011
248726835105
253301152031
254311009595
262545928208
265354315434
282726110041
283530133345
289789955677
337416619580
348906204448
357855960362
Почему он так крут? Потому что я попробовал перебор по словарю (взял https://github.com/dwyl/english-words, если кому-нибудь ещё нужно) и первый хеш с некоторыми изменениями слов подбирался более нескольких десятков раз, но вот этот, второй, вообще никаких коллизий не давал. И это сильно меня напрягло: а возможен ли, вообще, подбор этого хеша, если на таком количестве вариантов не было ни одной коллизии (а мы помним, что алгоритм хеша кривой и весьма распалагает к этому)? Плюс ко всему, перебор всех символов, это, на минуточку:
126 - 33 + 1 = 94 - количество символов для перебора
94 - 26 = 68 - у меня в программе пропускаются маленькие латинские буквы (т.к. хеш идёт только по заглавным)
Итого: 68 в степени количества символов в строке. С учётом того, что уже хеш из 5-ти символов подбирается со скрипом (у меня на компьютере), а товарищ kampaster прошёл все от 1 до 6 (остальные были параллельно запущены - по одному ядру на программу), то это просто офигенно круто!

В общем, тему трёхлетней давности можно считать закрытой.
Настоящие хеши мы вряд ли когда-либо узнаем, но это и не так важно - главное, что вот этими теперь можно пользоваться.
Спасибо всем!

P.S. Добавил в архив в пятом сообщении программу для перебора паролей с исходными кодами.

Автор: -=CHE@TER=- Apr 10 2020, 18:20

Не думал, что вернусь к этой теме, но... Сделал сегодня атаку по словарю с комбинацией из двух слов - и таки что вы думаете? (*улыбается*)

QUOTE
Hidden commandline argument for hash 0xD95C68A2: FROMINSTALL
Hidden word for network chat to see developers easter egg for hash 0x72A47EF6: FELTPLAYWORK
Насчёт первого хеша я уверен на 100%, а насчёт второго практически (я ещё не закончил брутфорс - там 6 часов на том компьютере с 4 ядрами, к которому у меня сейчас доступ есть, при этом я распараллелил процесс и там все ядра заняты - задача на 4 потока разбита). Подробности как закончу напишу - я, вообще-то, демо-версия C&C:RA брутфорсю (там есть новые ключи и тоже от них хеши). Кстати, я обновил статью про The Neverhood у себя на домашней страничке - там теперь человеческие хеши (плюс разобрался что коды делают, кроме одного) - вчера тоже из двух слов перебирал (35 минут ушло в силу того что там алгоритм легче и можно вместо слов уже посчитанные хеши объединять, что в разы быстрее), не все, но большую часть кодов удалось чем-то адекватным заменить.

Автор: -=CHE@TER=- Apr 11 2020, 14:53

Так, в теме про The Neverhood подробности написал, теперь давайте здесь закончим.
Короче, в начале недели написал мне http://forums.r-t-c-m.com/viewtopic.php?f=10&t=81#p484, что нашёл какой-то CD с Exhumed Demo. Я было подумал, что там какая-то особенная версия, но оказалась, что она уже известна. Как он потом объяснил, это для людей которые хотят эстетики - не просто скачать откуда-то демо-версию, а взять её с оригинального диска... Нда... ну, не важо. Помимо этого там были демки и других игр, в том числе C&C:RA1.
Заглянул я, значит, демку RA1 посмотреть, а там, ох-ты-ж-охренеть-просто, остались дебажные символы с именами переменных и функций от Watcom. Я не смог пройти мимо такого подарка и загрузил всё это дело в IDA. Увы и ах, игра безвозвратно изуродована классами и прочими объектами, так что код практически не восстанавливается толком. Зато я теперь знаю что функция считающая хеш от строк называется Obfuscate(). Мелочь, а приятно, да.
Но ещё я обнаружил, что она, помимо тех уже известных двух хешей, считает хеши и от трёх массивов, которые тоже используются как слова из командной строки (в полной версии их не было).
Вот эти списки с оригинальными именами взятые из дебажных символов игры, а также строки для них подобранные атакой по словарю:

CODE
PlayCodes[]
E0792D6D SONY
90046ECF ANTHRAXROCKAWAY
C3EE9A26 FUNK
ED382178 SLICK

CheatCodes[]
A0E2AB53 JUPITER
00532693 NATE
7DDFF824 PASSWORD
2CB5CF01 CHEATER // (*улыбается*)
B5B63531 BLUB
DFABC23A ADEN или ATEN (ещё можно ADUN или ATUN)
52B19A22 NUKE
BE79088C EARTHIMPROVED
B216AE7E SPOON
0E07B213 CARPET // см. ниже

EditorCodes[]
A2C09326 BUILD
1F944BB3 MOBIUS
DE07154D CYCLONE
0E07B213 CARPET // да, тот же самый код - он одновременно включает режимы Cheat и Editor
16B170B1 EDITOR
Сразу оговорюсь, что режимы Play и Cheat ничем не отличаются по коду (возможно, когда-то и были разные), а вот Editor не запускается, ибо требует файл сценария какой-то (возможно, в этом режиме игра грузит их из каталога, а не из .MIX архива).
Да, демка на современном компьютере запускается весьма неохотно, так что нужно несколько приседаний сделать:
CODE
RA95.EXE // set framerate to 60 FPS
001AC080: 53 B8
001AC081: 51 3C
001AC082: 52 00
001AC083: 56 00
001AC084: 57 00
001AC085: B8 C3

И заменить файл THIPX32.DLL такой пустышкой (скомпилировать перед этим), иначе оно будет пытаться вызвать какие-то функции в ядре системы, которых на Windows XP уже нет (в демке игры по сети всё равно нет, так что не страшно что заглушка очень тупая и внутреннему формату не соответствует):
CODE
library THIPX32;

function _Thipx_ThunkData32: integer;
begin
result:=1;
end;

function _IPX_Initialise: integer;
begin
result:=1;
end;

function _IPX_Open_Socket95: integer;
begin
result:=1;
end;

function _IPX_Close_Socket95: integer;
begin
result:=1;
end;

function _IPX_Get_Connection_Number95: integer;
begin
result:=1;
end;

function _IPX_Send_Packet95: integer;
begin
result:=1;
end;

function _IPX_Broadcast_Packet95: integer;
begin
result:=1;
end;

function _IPX_Get_Local_Target95: integer;
begin
result:=1;
end;

function _IPX_Start_Listening95: integer;
begin
result:=1;
end;

function _IPX_Shut_Down95: integer;
begin
result:=1;
end;

function _IPX_Get_Outstanding_Buffer95: integer;
begin
result:=1;
end;

exports
_Thipx_ThunkData32,
_IPX_Initialise,
_IPX_Open_Socket95,
_IPX_Close_Socket95,
_IPX_Get_Connection_Number95,
_IPX_Send_Packet95,
_IPX_Broadcast_Packet95,
_IPX_Get_Local_Target95,
_IPX_Start_Listening95,
_IPX_Shut_Down95,
_IPX_Get_Outstanding_Buffer95;

end.
А ещё в файле "REDALERT.INI" добавить:
CODE
[Options]
Resolution=yes
Чтобы оно в 640x480 запускалось, ибо у меня монитор 640x400 не поддерживает.

В отличие от The Neverhood здесь из-за хитровыделанного алгоритма ничего оптимизировать особо не получилось, поэтому разбив на 4 ядра пришлось ждать все 6+ часов, пока оно отбрутфорсится. Искал, как нетрудно догадаться, хеши для 90046ECF и BE79088C, но заодно и уже известные два решил тоже забрутфорсить - раз всё равно считается, то что добру пропадать, верно?
Хеш 90046ECF - смешной. Не любите Anthrax? Пожалуйста, есть Nirvana:
90046ECF NIRVANAERRANT
90046ECF NIRVANASBRAKY
90046ECF NIRVANASFRAGS
Nirvana не нравится? А, может, вы в Worms играете?
90046ECF FIREARMEDBANANA
И в Worms не играете? Ну, есть тогда несколько экзотических, на выбор:
90046ECF RAINERAMULET
90046ECF JAILOREXPRESSWAY
90046ECF BAILOREXPRESSWAY
Для BE79088C, кстати, было ещё одно нормальное (более или менее) совпадение - EUROPESAPLING.

Что касается кодов, про которые мы говорили в этой теме ранее, то, например, у кода для пасхального яйца тоже было много совпадений, но все дурацкие. Вот ещё несколько, если интересно:
72A47EF6 NONPRIZABLE // да и не надо - я человек скромный
72A47EF6 NONPROFITGOD // эх, какой код хороший (погуглите с запросом "новости взаимное безвозмездное одаривание" без кавычек)
72A47EF6 NORTHGLOOMS // ну, а что вы хотите - тут холодно и дни короткие
72A47EF6 ELECTROCONTRACTILITYCHECKROLL // приз за самое длинное словосочетание

Тот старый хеш командной строки интересен тем, что когда для других сотни совпадений (в файле с результатами практически 2 тысячи строк), то для D95C68A2 их было, натурально, всего 10:
D95C68A2 CYAATHIAHIELAMEN
D95C68A2 FRAGORJAMBING
D95C68A2 FRAZEDBOLIMBA
D95C68A2 FRISONNUCLEOLATE
D95C68A2 FROMINSTALL
D95C68A2 FROWSHOMOGENIES
D95C68A2 FRUGALLYPIMLICO
D95C68A2 OFFENSELESSNESSENCLARET
D95C68A2 ORLEANSCONVIVIALIZE
D95C68A2 RABBINATEPERLING

Такие дела. Теперь по хешам уже точно всё.
Если, конечно, не объявится кто-нибудь из разработчиков игры и не заявит, что код для хеша 72A47EF6 от пасхального яйца на самом деле был BOLDLYSIXTEEN или DADDYRAISING. (*улыбается*)

Автор: Siberian GRemlin Apr 11 2020, 15:12

А бету ты смотрел?

Автор: -=CHE@TER=- Apr 11 2020, 15:18

Это та, которая была у тебя в последней новости на сайте?
Ну, я хотел посмотреть правда ли что там можно собаками загрызть танк (в журнале Game.exe про этот баг писали), но к тому времени как я обнаружил у тебя на сайте эту новость ссылка на закачку уже протухла.
А тебе что из беты нужно? Тоже коды?

Автор: Siberian GRemlin Apr 12 2020, 07:58

QUOTE(-=CHE@TER=- @ Apr 11 2020, 22:18) *

Это та, которая была у тебя в последней новости на сайте?
Ну, я хотел посмотреть правда ли что там можно собаками загрызть танк (в журнале Game.exe про этот баг писали), но к тому времени как я обнаружил у тебя на сайте эту новость ссылка на закачку уже протухла.
А тебе что из беты нужно? Тоже коды?

Просто какой-то идиот написал жалобу на этот файл. Но образ гуляет по сети. Там, вроде как, содержатся отладочные данные, и пр., что было потом вырезано.
Лично мне ничего не нужно, но там может быть что-то полезное для тебя.

https://w3dhub.com/forum/topic/418934-red-alert-v-009c-beta/
https://www.reddit.com/r/commandandconquer/comments/dflqti/a_present_to_the_cc_community/
https://www.betaarchive.com/forum/viewtopic.php?f=16&t=40379

Автор: -=CHE@TER=- Apr 12 2020, 13:49

Поглядел бегло бету. Код для пасхального яйца есть, но вот хеша нет. Видимо, код с чатом вырезали. Сами цитаты есть, но их меньше - например, нет той строки, про макинтош, которую я в первом сообщении процитировал.
Я игру скачал по твоим ссылкам https://downloads.cnc-comm.com/?dir=red-alert/beta.
И, блин, там уже есть "rabeta_instructions_and_notes.pdf" с подобранными словами для простых хешей (с составными те кто работал над этим руководством, не заморачивались), там даже горячие клавиши описаны, которые появляются в отладочном режиме.
Ах, да, отладочные символы есть только у "GAME.DAT" для DOS, так что я только его смотрел.
Особо нового я там ничего не увидел, но всё равно спасибо!

Пардон, что не по теме, но если у тебя доступ на BetaArchive есть, то можешь достать оттуда https://www.betaarchive.com/forum/viewtopic.php?f=16&t=17750#p206645? Спасибо!

Автор: Siberian GRemlin Apr 14 2020, 15:42

QUOTE(-=CHE@TER=- @ Apr 12 2020, 20:49) *
Пардон, что не по теме, но если у тебя доступ на BetaArchive есть, то можешь достать оттуда https://www.betaarchive.com/forum/viewtopic.php?f=16&t=17750#p206645? Спасибо!

Там доступ даётся за заслуги по заливке файлов. Я так и не понял, дали его мне или нет, и как им воспользоваться.

Автор: -=CHE@TER=- Apr 15 2020, 10:36

Понятно, жаль, а то я за ней уже не один год охочусь. Ну, может, ещё где всплывёт.

А ещё меня тут попросили отбрутфорсить хеши для всяких demo/beta версия разных C&C под разные платформы (даже под Saturn). Они там в разных местах используются, в том числе в .INI файлах для включения каких-то опций. Мне лень переводить, так что я просто свой e-mail процитирую:

QUOTE
Hello!

Alright, I finished brute-forcing hashes pairs.
I must warn you that hash algo not very consistent and because of that there only few collisions for some and many for others. And most of them useless. Probably there is no right collisions for used dictionary or two words pairs (probably original phrase consists of 3 or more words).
And I assume that Saturn and other versions you're mention uses exactly the same hash routine as Red Alert 1.
Since you need to go through all the hashes manually I write below few of them which looks meaningful. But since I'm not familiar with Saturn or any other version of the game - feel free to take a look into attachment file and pick any hash that you want, which has more sense to the actions they actually do.
If I comment "no good matches" it's mean:
1) Only few collisions, no meaningful matches.
2) Or too much matches and I may miss something.
3) Maybe there is a perfect match and I've seen it, but since as I said I didn't know what these codes actually do, I may miss something thinking it's not a good fit for a code.
4) Also please note that I'm not a native English speaker so I used translate program to understand most of the words in codes and may miss something.
Please note that all codes must be entered !WITHOUT! spaces. I just separate words with spaces since English isn't my native language and sometimes it's hard to tell which two words produce this exactly result (as example: GRAY MULTIPLEX must be entered as GRAYMULTIPLEX).

7F65F13C - no good matches:
GRAY MULTIPLEX
CRASH ABSTRACTLY
OPSY UNENCRYPTED // it's funny that's why it's here
EDGESHOT PLATOONS
SNOWLESS ZOOBLAST
SNOWMAKER SKITTER
SNOWPACK ROUTINES

C2AA509B - 18 matches, only one solid, so I'm sure it's right one:
SUPER EDIT

DFABC23A - 73 matches, but this one looks ok (I guess) for debugging mode (although it's a bit rude):
ATONE SLACKER

9F38A19D - as I said before there is no more suitable than this one:
SUPER

39D01821 - same as one above:
WIZARD

2E7FE493 - no good matches, probably this one (not sure):
LOOPHOLES ROCKET

7E7C4CCA - no good matches:
OUTSEARCH LID
AIRCHECK VICTORY
SAFE COUNTRYFOLK

B1A34435 - that's one was unexpected, but I remembered this code from another Westwood game (Kyrandia II: Hand of Fate) where it's used as code for commandline argument, so I'm sure it's right one:
TARBOSH
(I've already tested KRAMER and KRAMER-TARBOSH pairs - no matches)

9CAFC93B - I don't think there is a better match than this (since you're already said it's sets Players to 6 - it's a crowd):
CROWDED

F7867BF0 - no good matches:
PUDDING PRECOMBATING
BLUEBOTTLE PARABOLIST
DILLYDALLIED HALFLIFE

DC57C4B2 - only 5 (!) matches and no good ones:
ECHO TUCKERING
FLICHTERED PERLUSTRATE
UNILATERALIST ORDINARIEST
DETERMINISM UNDERCONSUMING
ERYTHROXYLACEAE TRICHOSCHISTIC

ACB58F61 - only 15 matches, no good ones:
LEADER JAMBE
METALLICALLY FIELD

C87AD5A4 - only 3 (!) matches, no good ones:
UNANALAGOUSLY PANT
MACHINIST BARRACUDAS
INTROSPECTING UNTREADING

51842BF3 - no good matches (since you're said it sends some command, it's probably one of this):
FIXES IVA
NONSYNC FAD
NONSYNC FED
NONSYNC FID

I've used "words_alpha.txt" (words without digits) as dictionary for attack from this site:
https://github.com/dwyl/english-words
I will not brute-force three words combination since it will be:
370100 words * 6 hours (time for two-words combinations) =
2220600 hours = ((2220600 / 24) / 365) ~ 254 years
And another problem is amount of false matches which you'll need to manually examine - this may took another hundred years.

Well, that's all.

---

With best regards,
-=CHE@TER=-

Автор: -=CHE@TER=- Jun 5 2020, 16:11

QUOTE(Siberian GRemlin @ Jun 4 2020, 18:02) *
Исходники. https://github.com/electronicarts/CnC_Remastered_Collection
О-о-о! Спасибо!
Неожиданно, они опубликовали оригинальные исходные коды с минимальным количеством изменений.

Во-первых, хочу нас всех поздравить, потому что:
CODE
==> /REDALERT/INIT.CPP:
/*
** Special flag - is C&C being run from the install program?
*/
case PARM_INSTALL:
  Special.IsFromInstall = true;
  //  If uncommented, will disable the <ESC> key during the first movie run.
//  BreakoutAllowed = false;
  break;

==> /REDALERT/DEFINES.H
#define PARM_INSTALL 0xD95C68A2 // "FROMINSTALL"
Т.е. первый хеш я взломал правильно.

Во-вторых, к сожалению, строки для второго хеша, увы, нет:
CODE
/REDALERT/NETDLG.CPP
if (Obfuscate(Session.GPacket.Message.Buf) == 0x72A47EF6) {
  Session.WWChat = 1;
  Clear_Listbox (&playerlist);
  Start_WWChat(&playerlist);
}

В третьих, в файлах "DEFINES.H" от обеих игр можно посмотреть несколько других хешей (которые я по просьбе перебирал в сообщении выше), но там, увы, тоже строки только к парочке есть.

Зато я глянул в /REDALERT/INIT.CPP код функции Obfuscate() и офигел. Комментарии заставили меня хохотать в голос! Писал эту глупость JLB - Joe L. Bostic, главный (!) программист игры. Просто почитайте комментарии перед функцией и в ней самой. Пафосные рассуждения про CRC, PGP и "thwart casual hackers" особенно смешные.
Кстати, помните наркоманию про:
k = key1 xor key2 xor key1;
которая вырождалась просто в key2?
CODE
/*
** Perform a self referential transformation. This makes a reverse engineering
** by using a cause and effect attack more difficult.
*/
code = code ^ copy;
Что такое "cause and effect attack", которую данный код должен был по мощной задумке автора затруднить, я так понять и не смог, если даже по ассемблерному коду ненужность этой операции была очевидна и её можно было тупо выбросить, оставив только хеш от развёрнутой строки.

Если же говорить в общем, то в профессиональной среде очень часто замечаю за программистами такую вещь: чем больше человек пишет на ООП, классах и прочих объектах, тем меньше он понимает, умеет и может элементарных вещей. В предпоследней фирме где я работал приходилось программистам объяснять как с .BAT файлов можно автоматическую компиляцию настроить для быстрой сборки свежего выпуска новой версии. Что, вообще говоря, очень странно программистам не знать и не уметь. И, да, при этом там были классы-объекты-ООП-гроб-кладбище-сидор.
Я могу ещё более адовые примеры из практики привести, но мне всегда была непонятна эта победа упорства над здравым смыслом в попытке втащить дополнительный уровень головняка в код, при этом ещё и без внятного обоснования зачем.
Да, это я к тому, что обе игры написаны с применением ООП, при этом с вот такой вот заумно "обоснованной" дурью в простых местах.

Автор: -=CHE@TER=- Aug 5 2020, 13:48

Если, вдруг, кому интересно будет:
https://habr.com/ru/company/pvs-studio/blog/507162/
https://habr.com/ru/company/pvs-studio/blog/510656/

Автор: Siberian GRemlin Dec 10 2020, 14:47

QUOTE(-=CHE@TER=- @ Aug 5 2020, 20:48) *

Если, вдруг, кому интересно будет:
https://habr.com/ru/company/pvs-studio/blog/507162/
https://habr.com/ru/company/pvs-studio/blog/510656/

Случайно наткнулся на https://habr.com/ru/post/505842/.

Автор: -=CHE@TER=- Dec 10 2020, 17:09

QUOTE(Siberian GRemlin @ Dec 10 2020, 14:47) *
Случайно наткнулся на https://habr.com/ru/post/505842/.
Перевод, прямо скажем, ну такой себе. Плюс автор плавает во многих моментах. Вот, например:
QUOTE
Я не стал заморачиваться проверкой его работы; похоже, код сканирует элементы, указанные в командной строке в кавычках, а затем пытается интерпретировать их как разделённые кавычками (") группы. Думаю, командная строка Windows не обрабатывала бы такую схему правильно, поэтому обработка выполнена в самой игре. На самом деле я не уверен, реализована ли в cmd.exe логика работы кавычек даже сегодня.
Непонятный, на самом деле, кусок кода, там ещё комментарий сверху "Get pointers to command line arguments just like if we were in DOS", но дело в том, что в DOS не было двойных кавычек, они появились только в Windows, т.к. в DOS нельзя было использовать пробелы в имени файла, отсюда и необходимости в указании аргумента командной строки с пробелом не было. Т.е. в DOS такая строка:
test.exe "My Progam"
Вернёт три аргумента:
1 test.exe
2 "My
3 Program"
В то время как в Windows будет только два:
1 test.exe
2 My Program
Подробнее про аргументы можно https://docs.microsoft.com/en-us/cpp/cpp/main-function-command-line-args?view=msvc-160, если интересно будет.