<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; JScript: парсинг исполняемого файла]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=8680&amp;type=atom" />
	<updated>2013-09-19T12:34:57Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=8680</id>
		<entry>
			<title type="html"><![CDATA[JScript: парсинг исполняемого файла]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=75473#p75473" />
			<content type="html"><![CDATA[<p>Саму проблему помогли решить на форуме ТС (нескриптовым методом), а это я уже после разбирался:</p><div class="codebox"><pre><code>var
 b=new ActiveXObject(&#039;Microsoft.XMLDOM&#039;).createElement(&#039;binObj&#039;),
 d=false,    // DLL?
 f=new ActiveXObject(&#039;Scripting.FileSystemObject&#039;),
 n,        // имя файла (аргумент)
 s=new ActiveXObject(&#039;ADODB.Stream&#039;),
 t;        // temporary
b.dataType=&#039;bin.hex&#039;;
s.type=1;
s.open();

if(WScript.Arguments.length&amp;&amp;f.fileExists(WScript.Arguments(0)))n=WScript.Arguments(0);
else fa(&#039;Файл не найден!&#039;);

if(f.getFile(n).size&lt;256)fa(&#039;Не исполняемый&#039;);    //*

s.loadFromFile(n);
b.nodeTypedValue=s.read(64);        // читаем заголовок (64 байта)
// b.text — hex строка

t=b.text.substr(0,4);            // берём первые 2 байта (сигнатура)

if(t==&#039;5a4d&#039;)fa(&#039;DOS 16 ZM (exe)&#039;);    //* ZM — не актуально?
if(t!=&#039;4d5a&#039;)fa(&#039;Не исполняемый&#039;);    // не MZ

// теперь у нас есть файл, и он, вроде как, исполняемый

t=b.text.substr(48,2);            // берём байт по смещению 0x18 (24)
if(&#039;0x&#039;+t&lt;64)fa(&#039;DOS 16 MZ (exe)&#039;);    // адрес relocation table

t=fb(60);                // берём 4 байта по смещению 0x3C (60)
// здесь находится адрес заголовка PE
if(f.getFile(n).size&lt;256+t)fa(&#039;Неизвестный формат&#039;);

s.Position=t;
b.nodeTypedValue=s.read(24);        // читаем заголовок PE (24 байта)

t=1*(&#039;0x&#039;+b.text.substr(23*2,2));    // берём последний байт (Characteristics)
if(t&amp;32)d=true;                // да, это DLL

t=b.text.substr(0,4);            // берём первые 2 байта (сигнатура)
if(t==&#039;4e45&#039;)fa(&#039;Win 16 NE &#039;+fc());    // NE
if(t==&#039;4c45&#039;)fa(&#039;Win 16 LE (VxD)&#039;);    //* LE — не актуально?
if(t==&#039;4c58&#039;)fa(&#039;OS2 16 LX (VxD)&#039;);    //* LX — не актуально?
if(t==&#039;5733&#039;)fa(&#039;Win 16 W3 &#039;+fc());    //* W3 — не актуально?
if(t==&#039;5734&#039;)fa(&#039;Win 32 W4 (VMM)&#039;);    //* W4 — не актуально?
if(t!=&#039;5045&#039;)fa(&#039;Неизвестный формат&#039;);            // не PE
if(b.text.substr(4,4)!=&#039;0000&#039;)fa(&#039;Неизвестный формат&#039;);    //* неправильный PE?

// теперь, похоже, наш файл ещё и PE

// дополнительный заголовок PE:
// заголовок COFF        28 байт?
// заголовок NT            64 байта
// массив директорий данных    128 байт?

b.nodeTypedValue=s.read(20);        // читаем 20 байт дополнительного заголовка PE
if(b.text.substr(2,2)==&#039;02&#039;)        // если 64 бита (PE32+), на этом и закончили
 fa(&#039;Win 64 PE+ &#039;+fc());

// теперь мы знаем, что наш файл 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)fa(&#039;DotNet PE &#039;+fc());        // если размер CLR заголовка &gt; 0 значит, .Net
else fa(&#039;Win 32 PE &#039;+fc());        // иначе — Win32PE


function fa(e){s.close();WScript.echo(n+&#039;\n&#039;+e);WScript.quit();}// Выход с сообщением
function fb(e){                            // вычисление двордов (DWORD)
  return(
   1*(&#039;0x&#039;+b.text.substr(2*e,2))+
   256*(&#039;0x&#039;+b.text.substr(2*e+2,2))+
   65536*(&#039;0x&#039;+b.text.substr(2*e+4,2))+
   16777216*(&#039;0x&#039;+b.text.substr(2*e+6,2))
  );
}
function fc(){return(d?&#039;(dll)&#039;:&#039;(exe)&#039;);}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Serge Yolkin]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27503</uri>
			</author>
			<updated>2013-09-19T12:34:57Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=75473#p75473</id>
		</entry>
</feed>
