哪个 parts/sections 个 PE 文件 (.exe .dll) 包含它们的大部分行为?
Which parts/sections of PE files (.exe .dll) contain most their behaviours?
我正在通过机器学习方法进行 Windows 恶意软件研究。我看了PE格式,用dumpbin提取PE文件,发现里面有很多部分。 eg:.idata .edata .pdata .data .rdata .sxdata .text .rscr .tls... 但并不是所有的都用于actions/behaviours。我只关心他们的行为并在下一步之前减少大数据。谢谢
我找到了微软的官方文档。 Here 就在单词 files.I 下读到 .text 是代码部分。
既然您是在分析恶意软件,那么您不应该查看这些部分的名称。恶意软件开发人员更改节的名称并不困难,而且 msvc 编译器还允许您创建自定义节。
相反,您应该做的是查看版块的特征。通过读取IMAGE_SECTION_HEADER,可以看到该段是否包含可执行代码、静态数据、是否可写等。
我是@user2073973 弄明白的。他的意思是该部分在 header 部分中有单词 "Code"。
像这样:
SECTION HEADER #1
.text name
522B9 virtual size
1000 virtual address (00401000 to 004532B8)
52400 size of raw data
400 file pointer to raw data (00000400 to 000527FF)
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
60000020 flags
Code
Execute Read
他说得对,不仅 .text 部分有代码。自定义名称部分也有代码。
如果您正在寻找 powershell DLL,这里有一个不错的选择:
<#
.Synopsis
Gets the DLLs loaded by processes on the system.
.DESCRIPTION
Gets the DLLs loaded by processes on the system.
.EXAMPLE
Get-Dll -ProcessName Notepad
.EXAMPLE
Get-Dll -ModuleName mydll.dll
#>
function Get-Dll
{
[CmdletBinding()]
param(
# The process to get the DLLs of
[Parameter(ValueFromPipeline=$true, ParameterSetName="Process")]
[System.Diagnostics.Process]$Process,
# The process name to get the DLLs of
[Parameter(ValueFromPipeline=$true, ParameterSetName="ProcessName")]
[String]$ProcessName = "",
# The process ID to get the DLLs of
[Parameter(ValueFromPipeline=$true, ParameterSetName="ProcessId")]
[Int]$ProcessId = 0,
# The module name to search for
[Parameter()]
[String]$ModuleName,
# Whether to returned only unsigned modules
[Parameter()]
[Switch]$Unsigned
)
Begin{
$script:Modules = @()
$script:Processes = @()
}
Process {
if ($Process -ne $null)
{
$Modules += $Process.Modules
}
elseif (-not [String]::IsNullOrEmpty($ProcessName))
{
$Modules += Get-Process -Name $ProcessName | Select-Object -ExpandProperty Modules
}
elseif ($ProcessId -ne 0)
{
$Modules += Get-Process -Id $ProcessId | Select-Object -ExpandProperty Modules
}
elseif(-not [String]::IsNullOrEmpty($ModuleName))
{
$Processes = Get-Process | Where-Object { ($_.Modules).ModuleName -Contains $ModuleName }
}
else
{
$Modules += Get-Process | Select-Object -ExpandProperty Modules
}
}
End {
if ($Processes.Length -gt 0)
{
$Processes
return
}
if (-not [String]::IsNullOrEmpty($ModuleName))
{
$Modules = $Modules | Where-Object { $_.ModuleName -eq $ModuleName }
}
if ($Unsigned)
{
$Modules = $Modules | Where { -not [PoshInternals.AuthenticodeTools]::IsTrusted($_.FileName) }
}
$Modules
}
}
我正在通过机器学习方法进行 Windows 恶意软件研究。我看了PE格式,用dumpbin提取PE文件,发现里面有很多部分。 eg:.idata .edata .pdata .data .rdata .sxdata .text .rscr .tls... 但并不是所有的都用于actions/behaviours。我只关心他们的行为并在下一步之前减少大数据。谢谢
我找到了微软的官方文档。 Here 就在单词 files.I 下读到 .text 是代码部分。
既然您是在分析恶意软件,那么您不应该查看这些部分的名称。恶意软件开发人员更改节的名称并不困难,而且 msvc 编译器还允许您创建自定义节。
相反,您应该做的是查看版块的特征。通过读取IMAGE_SECTION_HEADER,可以看到该段是否包含可执行代码、静态数据、是否可写等。
我是@user2073973 弄明白的。他的意思是该部分在 header 部分中有单词 "Code"。 像这样:
SECTION HEADER #1
.text name
522B9 virtual size
1000 virtual address (00401000 to 004532B8)
52400 size of raw data
400 file pointer to raw data (00000400 to 000527FF)
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
60000020 flags
Code
Execute Read
他说得对,不仅 .text 部分有代码。自定义名称部分也有代码。
如果您正在寻找 powershell DLL,这里有一个不错的选择:
<#
.Synopsis
Gets the DLLs loaded by processes on the system.
.DESCRIPTION
Gets the DLLs loaded by processes on the system.
.EXAMPLE
Get-Dll -ProcessName Notepad
.EXAMPLE
Get-Dll -ModuleName mydll.dll
#>
function Get-Dll
{
[CmdletBinding()]
param(
# The process to get the DLLs of
[Parameter(ValueFromPipeline=$true, ParameterSetName="Process")]
[System.Diagnostics.Process]$Process,
# The process name to get the DLLs of
[Parameter(ValueFromPipeline=$true, ParameterSetName="ProcessName")]
[String]$ProcessName = "",
# The process ID to get the DLLs of
[Parameter(ValueFromPipeline=$true, ParameterSetName="ProcessId")]
[Int]$ProcessId = 0,
# The module name to search for
[Parameter()]
[String]$ModuleName,
# Whether to returned only unsigned modules
[Parameter()]
[Switch]$Unsigned
)
Begin{
$script:Modules = @()
$script:Processes = @()
}
Process {
if ($Process -ne $null)
{
$Modules += $Process.Modules
}
elseif (-not [String]::IsNullOrEmpty($ProcessName))
{
$Modules += Get-Process -Name $ProcessName | Select-Object -ExpandProperty Modules
}
elseif ($ProcessId -ne 0)
{
$Modules += Get-Process -Id $ProcessId | Select-Object -ExpandProperty Modules
}
elseif(-not [String]::IsNullOrEmpty($ModuleName))
{
$Processes = Get-Process | Where-Object { ($_.Modules).ModuleName -Contains $ModuleName }
}
else
{
$Modules += Get-Process | Select-Object -ExpandProperty Modules
}
}
End {
if ($Processes.Length -gt 0)
{
$Processes
return
}
if (-not [String]::IsNullOrEmpty($ModuleName))
{
$Modules = $Modules | Where-Object { $_.ModuleName -eq $ModuleName }
}
if ($Unsigned)
{
$Modules = $Modules | Where { -not [PoshInternals.AuthenticodeTools]::IsTrusted($_.FileName) }
}
$Modules
}
}