mirror of
https://github.com/horsicq/Detect-It-Easy.git
synced 2026-06-24 01:54:08 +00:00
132 lines
3 KiB
Text
132 lines
3 KiB
Text
var File=MSDOS;
|
|
|
|
includeScript("result");
|
|
|
|
|
|
// Get the "base" offset, after the header.
|
|
MSDOS.getBaseOffset = function(nOffset)
|
|
{
|
|
if(arguments.length==0)
|
|
{
|
|
nOffset=0;
|
|
}
|
|
return (MSDOS.readWord(8)<<4)+nOffset;
|
|
}
|
|
|
|
|
|
// Translate segment/offset address pair to file offset.
|
|
MSDOS.AddressToOffset = function(nSegment,nOffset)
|
|
{
|
|
if(arguments.length==1)
|
|
{
|
|
nOffset=0;
|
|
}
|
|
nOffset+=nSegment<<4;
|
|
return MSDOS.getBaseOffset(nOffset&0xFFFFF);
|
|
}
|
|
|
|
|
|
// Get the entry point offset.
|
|
MSDOS.getEntryPointOffset = function(nOffset)
|
|
{
|
|
if(arguments.length==0)
|
|
{
|
|
nOffset=0;
|
|
}
|
|
return MSDOS.AddressToOffset(MSDOS.readWord(0x16),
|
|
MSDOS.readWord(0x14))+nOffset;
|
|
}
|
|
|
|
|
|
// Get the NewExe offset (assuming it's valid).
|
|
MSDOS.getNEOffset = function(nOffset)
|
|
{
|
|
if(arguments.length==0)
|
|
{
|
|
nOffset=0;
|
|
}
|
|
return MSDOS.readDword(0x3C)+nOffset;
|
|
}
|
|
|
|
|
|
// Add the overlay functions.
|
|
|
|
MSDOS._OverlayOffset=0;
|
|
|
|
MSDOS.getOverlayOffset = function(nOffset)
|
|
{
|
|
if(arguments.length==0)
|
|
{
|
|
nOffset=0;
|
|
}
|
|
|
|
if(MSDOS._OverlayOffset==0)
|
|
{
|
|
if(MSDOS.isNE())
|
|
{
|
|
var nNE=MSDOS.getNEOffset();
|
|
var nSegments=MSDOS.readWord(nNE+0x1C);
|
|
var nShift=MSDOS.readWord(nNE+0x32);
|
|
if(nShift==0)
|
|
{
|
|
nShift=9;
|
|
}
|
|
var nTable=nNE+MSDOS.readWord(nNE+0x22);
|
|
var nLast=0,nSize,bRelocs;
|
|
for(var i=0;i<nSegments;i++)
|
|
{
|
|
var nSeg=MSDOS.readWord(nTable+i*8);
|
|
if(nSeg>nLast)
|
|
{
|
|
nLast=nSeg;
|
|
nSize=MSDOS.readWord(nTable+2+i*8);
|
|
bRelocs=MSDOS.readWord(nTable+4+i*8)&0x100;
|
|
}
|
|
}
|
|
if(nSize==0)
|
|
{
|
|
nSize=65536;
|
|
}
|
|
MSDOS._OverlayOffset=(nLast<<nShift)+nSize;
|
|
if(bRelocs)
|
|
{
|
|
MSDOS._OverlayOffset+=2+MSDOS.readWord(nLast)*8;
|
|
}
|
|
MSDOS._OverlayOffset=(MSDOS._OverlayOffset+(1<<nShift)-1)&-(1<<nShift);
|
|
}
|
|
else if(MSDOS.isLE())
|
|
{
|
|
var nLE=MSDOS.getNEOffset();
|
|
var nPages=MSDOS.readDword(nLE+0x14);
|
|
var nPageSize=MSDOS.readDword(nLE+0x28);
|
|
var nLastPage=MSDOS.readDword(nLE+0x2C);
|
|
var nDataPage=MSDOS.readDword(nLE+0x80);
|
|
MSDOS._OverlayOffset=(nPages-1)*nPageSize+nLastPage+nDataPage;
|
|
}
|
|
else
|
|
{
|
|
MSDOS._OverlayOffset=((MSDOS.readWord(4)-1)<<9)+MSDOS.readWord(2);
|
|
}
|
|
}
|
|
|
|
return MSDOS._OverlayOffset+nOffset;
|
|
}
|
|
|
|
MSDOS.getOverlaySize = function()
|
|
{
|
|
return MSDOS.getSize()-MSDOS.getOverlayOffset();
|
|
}
|
|
|
|
MSDOS.isOverlayPresent = function()
|
|
{
|
|
return MSDOS.getOverlaySize()!=0;
|
|
}
|
|
|
|
MSDOS.compareOverlay = function(sSignature,nOffset)
|
|
{
|
|
if(arguments.length==1)
|
|
{
|
|
nOffset=0;
|
|
}
|
|
return MSDOS.compare(sSignature,MSDOS.getOverlayOffset()+nOffset);
|
|
}
|