Доброго времени суток всем!
Понадобился способ отличить бинарник Win32 от бинарника .net. Программы-анализаторы бинарников не подходят. Идеальный вариант - контентный плагин для TC (искал, не нашёл), но устроит описание сигнатуры, однозначно идентифицирующей исполняемый файл DotNet.
Как идентифицировать бинарник .net ?
Модераторы: Моторокер, Avada, CaptainFlint, Nik, d-view
-
Serge Yolkin
- Сообщения: 664
- Зарегистрирован: Сб июл 25, 2009 11:12
Последний раз редактировалось Flasher Пт сен 13, 2013 23:43, всего редактировалось 1 раз.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
А я тут видел что-то, что может пригодиться в данном деле. А именно, DotNetInfo...
-
Serge Yolkin
- Сообщения: 664
- Зарегистрирован: Сб июл 25, 2009 11:12
Flasher
WFX? Не нашёл...
А WLX - не вариант. Так и с PEStudio можно возиться
MVV
DotNetInfo сам на дотнете... Но, наверное, сошёл бы, как разовый инструмент, только кто бы скомпилил... (Как и сказал Alextp, бинарника нет)
А с методом определения ни у кого идей нет? Вроде, там после заголовка exe ещё заголовок среды исполнения идти должен, только визуально я его не распознал. Скрипт бы написал, и дело с концом.
Добавлено спустя 40 минут:
О! Кажется, в дотнет-бинарниках есть явное упоминание mscoree.dll. Жаль, что не в начале, а ближе к концу. Из скрипта большие файлы читать долго.
[mod="Avada"]Для оффтопных вставок в постах теперь есть механизм спойлеров. Поправил. [/mod]
WFX? Не нашёл...
А WLX - не вариант. Так и с PEStudio можно возиться
MVV
DotNetInfo сам на дотнете... Но, наверное, сошёл бы, как разовый инструмент, только кто бы скомпилил... (Как и сказал Alextp, бинарника нет)
А с методом определения ни у кого идей нет? Вроде, там после заголовка exe ещё заголовок среды исполнения идти должен, только визуально я его не распознал. Скрипт бы написал, и дело с концом.
Оффтоп
Месяца два, как снёс плагин для просмотра .hlp за ненадобностью. И вот, в соответствии с законом подлости, у DotNetInfo справка именно в этом формате.
О! Кажется, в дотнет-бинарниках есть явное упоминание mscoree.dll. Жаль, что не в начале, а ближе к концу. Из скрипта большие файлы читать долго.
[mod="Avada"]Для оффтопных вставок в постах теперь есть механизм спойлеров. Поправил. [/mod]
-
Serge Yolkin
- Сообщения: 664
- Зарегистрирован: Сб июл 25, 2009 11:12
Avada
Продолжение оффтопа
Прошу прощения, но здесь не нашёл, поиск по слову "спойлер" в разделе "Сайт Все о Total Commander" ничего не дал, просмотр названий тем в том же разделе - тоже. Может, эту информацию куда-нибудь прилепить? А пока, если не трудно, ткните носом, пожалуйста.
Serge Yolkin
Показать
А там, в стандартном FAQ, ничего и быть не может. Вот где надо смотреть. Как и все прочие новации. А ежели искать по спойлер*, то и поиском обнаружится.
Даже самая богатая фантазия
Не представит себе наши безобразия.
Не представит себе наши безобразия.
-
Serge Yolkin
- Сообщения: 664
- Зарегистрирован: Сб июл 25, 2009 11:12
Несмотря на то, что актуальная проблема была решена благодаря MVV и ProgMan13 в другой ветке, идея разбора бинарника из скрипта показалась интересной (и не такой сложной, как на первый взгляд)
Код: Выделить всё
var
b=new ActiveXObject('Microsoft.XMLDOM').createElement('binObj'),
d=false, // DLL?
f=new ActiveXObject('Scripting.FileSystemObject'),
n, // имя файла (аргумент)
s=new ActiveXObject('ADODB.Stream'),
t;
b.dataType='bin.hex';
s.type=1;
s.open();
if(WScript.Arguments.length&&f.fileExists(WScript.Arguments(0)))n=WScript.Arguments(0);
else fa('Файл не найден!');
if(f.getFile(n).size<256)fa(n+'\nНе исполняемый');
s.loadFromFile(n);
b.nodeTypedValue=s.read(64); // читаем заголовок (64 байта)
// b.text — hex строка
t=b.text.substr(0,4); // берём первые 2 байта (сигнатура)
if(t=='5a4d')fa(n+'\nDOS 16 ZM(exe)'); // ZM — не актуально?
if(t!='4d5a')fa(n+'\nНе исполняемый'); // не MZ
// теперь у нас есть файл, и он, вроде как, исполняемый
t=b.text.substr(48,2); // берём байт по смещению 0x18 (24)
if('0x'+t<64)fa(n+'\nDOS 16 MZ(exe)'); // адрес relocation table
t=fb(60); // берём 4 байта по смещению 0x3C (60)
// здесь находится адрес заголовка PE
if(f.getFile(n).size<256+t)fa(n+'\nНеизвестный формат');
s.Position=t;
b.nodeTypedValue=s.read(24); // читаем заголовок PE (24 байта)
t=b.text.substr(0,4); // берём первые 2 байта (сигнатура)
if(t=='4e45')fa(n+'\nWin 16 NE(exe)'); // NE
if(t=='4c45')fa(n+'\nWin 16 LE(VxD)'); // LE — не актуально?
if(t=='4c58')fa(n+'\nOS2 16 LX(VxD)'); // LX — не актуально?
if(t=='5733')fa(n+'\nWin 16 W3(exe)'); // W3 — не актуально?
if(t=='5734')fa(n+'\nWin 32 W4(VMM)'); // W4 — не актуально?
if(t!='5045')fa(n+'\nНеизвестный формат'); // не PE
if(b.text.substr(4,4)!='0000')fa(n+'\nНеизвестный формат'); // неправильный PE?
// теперь, похоже, наш файл ещё и PE
t=1*('0x'+b.text.substr(46,2)); // берём последний байт (Characteristics)
if(t&32)d=true; // да, это DLL
// дополнительный заголовок PE:
// заголовок COFF 28 байт?
// заголовок NT 64 байта
// массив директорий данных 128 байт?
b.nodeTypedValue=s.read(20); // читаем 20 байт дополнительного заголовка PE
if(b.text.substr(2,2)=='02'){ // если 64 бита (PE32+), на этом и закончили
if(d)fa(n+'\nWin 64 (DLL)');
else fa(n+'\nWin 64 (exe)');
}
// теперь мы знаем, что наш файл PE и он 32 бита
// осталось проверить на дотнетность
s.Position+=(208-20);
// перешли на смещение D0 (208) от начала дополнительного заголовка
b.nodeTypedValue=s.read(8);
// здесь должен быть The CLR header address and size
t=fb(4); // берём 4 байта по смещению 0x04 (4)
if(t){ // если размер CLR заголовка > 0 значит, .Net
if(d)fa(n+'\nDotNet DLL');
else fa(n+'\nDotNet exe');
}else{ // иначе — Win32PE
if(d)fa(n+'\nWin 32 DLL');
else fa(n+'\nWin 32 exe');
}
s.close();
function fa(e){s.close();WScript.echo(e);WScript.quit();} // Выход с сообщением
function fb(e){ // вычисление двордов (DWORD)
return(
1*('0x'+b.text.substr(2*e,2))+
256*('0x'+b.text.substr(2*e+2,2))+
65536*('0x'+b.text.substr(2*e+4,2))+
16777216*('0x'+b.text.substr(2*e+6,2))
);
}