reverse-skills-max: initial public release (restored, redacted, hardened)
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
#requires -Version 5
|
||||
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$ManifestPath
|
||||
)
|
||||
|
||||
Set-StrictMode -Version Latest
|
||||
$ErrorActionPreference = 'Stop'
|
||||
[Console]::InputEncoding = [System.Text.UTF8Encoding]::new($false)
|
||||
[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new($false)
|
||||
$OutputEncoding = [System.Text.UTF8Encoding]::new($false)
|
||||
|
||||
if (-not (Test-Path -LiteralPath $ManifestPath)) {
|
||||
throw "Manifest not found: $ManifestPath"
|
||||
}
|
||||
|
||||
$xml = [xml](Get-Content -LiteralPath $ManifestPath -Raw -Encoding UTF8)
|
||||
$androidNs = 'http://schemas.android.com/apk/res/android'
|
||||
$nsMgr = [System.Xml.XmlNamespaceManager]::new($xml.NameTable)
|
||||
$nsMgr.AddNamespace('android', $androidNs)
|
||||
|
||||
function Get-AndroidAttr {
|
||||
param(
|
||||
[Parameter(Mandatory = $true)]$Node,
|
||||
[Parameter(Mandatory = $true)][string]$Name
|
||||
)
|
||||
|
||||
return [string]$Node.GetAttribute($Name, $androidNs)
|
||||
}
|
||||
|
||||
$manifest = $xml.manifest
|
||||
$packageName = [string]$manifest.package
|
||||
|
||||
"package=$packageName"
|
||||
|
||||
$permissions = @($manifest.SelectNodes('uses-permission'))
|
||||
"permission_count=$($permissions.Count)"
|
||||
foreach ($perm in $permissions) {
|
||||
$name = Get-AndroidAttr -Node $perm -Name 'name'
|
||||
if ($name) {
|
||||
"permission=$name"
|
||||
}
|
||||
}
|
||||
|
||||
$componentQueries = @(
|
||||
@{ Label = 'activity'; Path = 'application/activity' },
|
||||
@{ Label = 'service'; Path = 'application/service' },
|
||||
@{ Label = 'receiver'; Path = 'application/receiver' },
|
||||
@{ Label = 'provider'; Path = 'application/provider' }
|
||||
)
|
||||
|
||||
foreach ($query in $componentQueries) {
|
||||
$nodes = @($manifest.SelectNodes($query.Path))
|
||||
($query.Label + '_count=' + $nodes.Count)
|
||||
foreach ($node in $nodes) {
|
||||
$name = Get-AndroidAttr -Node $node -Name 'name'
|
||||
$exported = Get-AndroidAttr -Node $node -Name 'exported'
|
||||
$enabled = Get-AndroidAttr -Node $node -Name 'enabled'
|
||||
($query.Label + '=' + $name + "`t" + $exported + "`t" + $enabled)
|
||||
}
|
||||
}
|
||||
|
||||
$mainActivities = @()
|
||||
$activities = @($manifest.SelectNodes('application/activity'))
|
||||
foreach ($activity in $activities) {
|
||||
$filters = @($activity.SelectNodes('intent-filter'))
|
||||
foreach ($filter in $filters) {
|
||||
$hasMain = @($filter.SelectNodes('action')).Where({ (Get-AndroidAttr -Node $_ -Name 'name') -eq 'android.intent.action.MAIN' }).Count -gt 0
|
||||
$hasLauncher = @($filter.SelectNodes('category')).Where({ (Get-AndroidAttr -Node $_ -Name 'name') -eq 'android.intent.category.LAUNCHER' }).Count -gt 0
|
||||
if ($hasMain -and $hasLauncher) {
|
||||
$mainActivities += (Get-AndroidAttr -Node $activity -Name 'name')
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($entry in ($mainActivities | Select-Object -Unique)) {
|
||||
"main_activity=$entry"
|
||||
}
|
||||
Reference in New Issue
Block a user