Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Как идентифицировать бинарник .net ?

 
Post new topic   Reply to topic    Total Commander Forum Index -> Программное обеспечение printer-friendly view
View previous topic :: View next topic  
Author Message
Serge Yolkin



Joined: 25 Jul 2009
Posts: 664

Post (Separately) Posted: Fri Sep 13, 2013 20:45    Post subject: Как идентифицировать бинарник .net ? Reply with quote

Доброго времени суток всем!

Понадобился способ отличить бинарник Win32 от бинарника .net. Программы-анализаторы бинарников не подходят. Идеальный вариант - контентный плагин для TC (искал, не нашёл), но устроит описание сигнатуры, однозначно идентифицирующей исполняемый файл DotNet.
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Fri Sep 13, 2013 20:56    Post subject: Reply with quote

Serge Yolkin
PEViewer (WLX) ?
Поправил.
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.


Last edited by Flasher on Fri Sep 13, 2013 23:43; edited 1 time in total
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4811
Location: Ростов-Дон

Post (Separately) Posted: Fri Sep 13, 2013 21:14    Post subject: Reply with quote

А я тут видел что-то, что может пригодиться в данном деле. А именно, DotNetInfo...
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
Back to top
View user's profile Send private message
Serge Yolkin



Joined: 25 Jul 2009
Posts: 664

Post (Separately) Posted: Fri Sep 13, 2013 22:48    Post subject: Reply with quote

Flasher
WFX? Не нашёл...
А WLX - не вариант. Так и с PEStudio можно возиться

MVV
DotNetInfo сам на дотнете... Но, наверное, сошёл бы, как разовый инструмент, только кто бы скомпилил... (Как и сказал Alextp, бинарника нет)

А с методом определения ни у кого идей нет? Вроде, там после заголовка exe ещё заголовок среды исполнения идти должен, только визуально я его не распознал. Скрипт бы написал, и дело с концом.

 Оффтоп

Добавлено спустя 40 минут:

О! Кажется, в дотнет-бинарниках есть явное упоминание mscoree.dll. Жаль, что не в начале, а ближе к концу. Из скрипта большие файлы читать долго.

 !  Avada:
Для оффтопных вставок в постах теперь есть механизм спойлеров. Поправил.
Back to top
View user's profile Send private message
Serge Yolkin



Joined: 25 Jul 2009
Posts: 664

Post (Separately) Posted: Sat Sep 14, 2013 16:47    Post subject: Reply with quote

Avada
 Продолжение оффтопа
Back to top
View user's profile Send private message
Avada



Joined: 01 Aug 2008
Posts: 10236
Location: Россия, Саратов

Post (Separately) Posted: Sat Sep 14, 2013 16:56    Post subject: Reply with quote

Serge Yolkin
 Hidden text

_________________
Даже самая богатая фантазия
Не представит себе наши безобразия.
Back to top
View user's profile Send private message
Serge Yolkin



Joined: 25 Jul 2009
Posts: 664

Post (Separately) Posted: Thu Sep 19, 2013 14:28    Post subject: Reply with quote

Несмотря на то, что актуальная проблема была решена благодаря MVV и ProgMan13 в другой ветке, идея разбора бинарника из скрипта показалась интересной (и не такой сложной, как на первый взгляд)
Code:
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))
  );
}
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Программное обеспечение All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group