Кто-нибудь может объяснить поподробнее, какую конкретно информацию MS link записывает между DOS stub'ом и собственно PE-заголовком и какими ключами ее XORит? На http://board.win32asmcommunity.net поиском по lingo12 я что-то не нашел подробного описания этой неприятности, только то, как ее убрать (хотя это тоже ценно), и пару битых линков, видимо на старые посты. Google и Yandex дали такие же результаты. В содержимом .../tools/7/Rich.zip тоже не объясняется подробно, какую содержательную информацию пишет MS link в этой "печати Баала".
Вроде как, никому не удавалось это расшифровать.. Так что, скорее всего, разработчики унесут эту тайну в могилу. ИМХО, это просто левая сигнатура или просто цифры какие-то. Вряд ли это текст.. Хотя кто их знает, этих маленьких плюшевых извращенцев..
Вроде как, никому не удавалось это расшифровать.. Ты б хоть не позорился. Там обычный XOR. А поксорен compid.
Прошу прощения за глупый вопрос, а что такое compid? Или просто поксорена сама строка "compid"? Но в этом случае ключи, которыми она ксорилась, у меня какими-то странными получились...
Поксорен идентификатор железок, которые в компе стоят. Хотя там наверняка хэши используются, и вряд ли узнаешь, на каком компе PE слинкован, хотя это бы интересно было.
Сразу после слова "Rich" идет 32 бита - код для xor. Если начать xor'ить этим числом с начала печати Баала, то первым всегда пойдет идентификатор 536e6144h - это метка. Далее 12 байт не совсем понятного назначения (причем часто это вообще нули). Далее структурки по 8 байт (их может быть несколько) - это и есть идентификаторы "железок".
Да нету там никаких железок , даже compid никаким боком не лежит , хотя строку "@comp.id" иногда встречал , проскакивала там по хипу . Три часа просидел в отладчике Ж) Короче первое , что будет играть роль при формировании печати , так это результат возвращаемый ф-цией VirtualAlloc . Потом к этому адресу прибавляеться количество байт он начала .obj файла до первого имени секции в нём (.text к примеру) . Ещё кое-какие подробности я пропускаю , они особой роли не играют . В общем назовём это числом A (оно не определённое) . Второй т.н. ключ будет число 00789DEAh (там зашит) , обозвём его B . Далее играет роль вшитый в линковщике дефолтный MZ+DOS заголовок размером 128 байт . Который в цикле ролиться (ROL) и суммируеться (ADD) в одно число . Весь этот алгоритм приводить думаю смысла нет , таким способом всегда получаеться одно число , это 884F3421h , обозвём его С . Число A ролиться несколько (зависящих от него) раз и потом суммируеться с числом C . Его надо обозвать D . Число D ксориться (XOR) с числом 536E6144h и получеться E . Вот это число E есть первый дворд печати . Три следующие дворда печати - это число D . Пятый дворд обьяснять долго , просто скажу , что это немного изменённое число A и потом поксореное с числом D . Шестой дворд это количество "циклов" изменения числа A для пятого дворда поксореное с числом D . Седьмой - число B XOR D . Восьмой - количество "циклов" (у меня на минимальной проге получилось - 1) XOR D . Девятый - Rich (68636952h) Десятый - число D . Вышесказанное справедливо для link.exe версии 8.0.40426.16 Спрашиваеться - нафига это всё ?
Ха , уж больно я сомневаюсь , что мелкософтовцы сделали эту печать просто так , для фонаря . В конце концов они ведь могли хоть CRC файла , хоть entrypoint дублировать (прятать) таким образом . Да много чего можно . От этого хоть кому-то могла быть польза . А так , я не понимаю .
Разобрался с этим числом . В общем ml.exe версии 6.12.7164 к .obj файлу никакой лабуды не добавлял . А ml.exe версии 6.14.8444 уже добавляет строку "@comp.id" и один дворд 001220FC (зашит в нём) . Вот этот дворд и есть как я говорил "немного изменённое число А" . Старшие версии ml.exe тоже добавляют такую фигню , только числа попадаються разные (все они определённые и зашиты туда) . Например в ml.exe версии 8.0.40426.16 это число - 007D9DEA . Интересно то , что оно странно похоже с числом B (вшитом в link.exe той же версии) - 00789DEA . Есть ещё маленькие различия между старым link.exe и новым , например в том , что раньше эти извращенцы прятали слово "Rich" , т.е. вместо него было вшито число C236F034 , которое при формировании печати ксорилось с AA559966 и так получалось 68636952 (Rich) Узнал немного истории В ml.exe 6.11 версии , сразу за MZ строка : "Copyright (C) 1986-1991 Phar Lap Software, Inc. C5S2S2PM"
И метку 'DanS' тоже прятали: Код (Text): mov eax, const1 ; 0F93BF822h xor eax, edi ; edi==дворд после Rich mov [esi+4], edi xor eax, 0AA559966h mov [esi], eax А "прячущую" константу 0AA559966h они явно с юмором написали: AA55 - это ж последние два байта mbr
Да , встречал такое в старых версиях Пытался проанализировать эти константы , даже наклепал по шустрому прогу (в аттаче) , была мысль , что микрософт использует свои ID компиляторов ("@comp.id") , но правда ли и для чего ? Я дальше не разбирался . 1925930365__derich.zip
Ёперный театр ! А я мучался ... Это называеться "The compiler decorates an identifier when it creates the .OBJ file" , а расшифровываеться просто : dumpbin.exe /symbols %filename% . Читать можно ещё тут , тут , можно ещё гуглить по словам "COMDAT","COMDEF" .
К сожалению это работает только с /DEBUG. А вот у меня "замангленные" имена для DLL не выдает. А попробовать их разманглить в IDA руки не доходят. Да и собственно не нужны мне они - разве число параметров посмотреть.
Кстати, а в исходниках утилит из "winnt src" лежат masm & link. Кто-нибудь смотрел, что там за механизм создания "печати" и есть ли он? WinNT4\sdktools\masm WinNT4\sdktools\vctools\link
В XP и выше есть утилитка undname.exe, и вроде можно скачать отдельно. Код (Text): E:\>undname -f ?func1@a@@AAEXH@Z Microsoft(R) Windows NT(R) Operating System UNDNAME Version 5.00.1768.1Copyright (C) Microsoft Corp. 1981-1998 >> ?func1@a@@AAEXH@Z == private: void __thiscall a::func1(int)