Страницы

суббота, 8 июня 2013 г.

Пишем WinLocker на PowerShell.

Целью статьи не является создание вредоносного приложения. Полученный в результате код можно использовать в качестве примера создания GUI с помощью PowerShell. Пару лет назад я уже освещал тему создания подобного кода с помощью VBScript, правда тогда не обошлось без "костыля" в виде ActiveX DLL. В этот раз есть возможность решить вопрос "нативными" средствами.


Для начала нарисуем интерфейс нашего локера.
Честно говоря я не представляю себе скрипт, для создания интерфейса которого может возникнуть необходимость использовать WPF - красота тут ни к чему. В общем на любителя. По-моему проще через Windows Forms.

Открываем PowerShell ISE, рисуем:
  - форму без границ, во весь экран, поверх всех окон, слегка прозрачную, оттенка синего цвета
  - кнопку для проверки введенного кода разблокировки
  - текстовое поля для ввода кода разблокировки
  - поле, содержащее текст приглашения ввести код разблокировки

Add-Type -AssemblyName System.Windows.Forms

$Form = New-Object System.Windows.Forms.Form
$Form.TopMost = $true
$Form.FormBorderStyle = 0 # None
$Form.BackColor = '#3333ff'
$Form.WindowState = 2 # Maximized
$Form.ShowInTaskbar = $false
$Form.Opacity = 0.8

$Button = New-Object System.Windows.Forms.Button
$Button.Text = 'OK'
$Button.ForeColor = '#ffffff'
$Button.Font = New-Object System.Drawing.Font("Microsoft Sans Serif",12,1,3) # Normal, Bold
$Button.Anchor = 0 # None
$Button.Width = 200
$Button.Height = 30
$Button.Left = ($Form.ClientSize.Width - $Button.Width)/2
$Button.Top = ($Form.ClientSize.Height - $Button.Height)/2 + 60
$Form.Controls.Add($Button)

$TextBox = New-Object System.Windows.Forms.TextBox
$TextBox.Font = New-Object System.Drawing.Font("Microsoft Sans Serif",12,0,3) # Normal, Bold
$TextBox.Anchor = 0 # None
$TextBox.Width = 200
$TextBox.Left = ($Form.ClientSize.Width - $TextBox.Width)/2
$TextBox.Top = ($Form.ClientSize.Height - $TextBox.Height)/2 + 30
$Form.Controls.Add($TextBox)

$Label = New-Object System.Windows.Forms.Label
$Label.Font = New-Object System.Drawing.Font('Times New Roman',22,3,3) # Italic, Bold
$Label.ForeColor = '#ffffff'
$Label.AutoSize = $false
$Label.Dock = 5 # Fill
$Label.TextAlign = 32 # MiddleCenter
$Label.Text = "Пожалуйста, введите код:"
$Form.Controls.Add($Label)

$Form.ShowDialog() | Out-Null

Добавим логику приложения: функцию проверки введенного кода и обработчики событий
(в том числе запретим закрытие приложения до тех пор, пока пользователь не введет требуемый код).
Add-Type -AssemblyName System.Windows.Forms

$Form = New-Object System.Windows.Forms.Form
$Form.TopMost = $true
$Form.FormBorderStyle = 0 # None
$Form.BackColor = '#3333ff'
$Form.WindowState = 2 # Maximized
$Form.ShowInTaskbar = $false
$Form.Opacity = 0.8

$Button = New-Object System.Windows.Forms.Button
$Button.Text = 'OK'
$Button.ForeColor = '#ffffff'
$Button.Font = New-Object System.Drawing.Font("Microsoft Sans Serif",12,1,3) # Normal, Bold
$Button.Anchor = 0 # None
$Button.Width = 200
$Button.Height = 30
$Button.Left = ($Form.ClientSize.Width - $Button.Width)/2
$Button.Top = ($Form.ClientSize.Height - $Button.Height)/2 + 60
$Form.Controls.Add($Button)

$TextBox = New-Object System.Windows.Forms.TextBox
$TextBox.Font = New-Object System.Drawing.Font("Microsoft Sans Serif",12,0,3) # Normal, Bold
$TextBox.Anchor = 0 # None
$TextBox.Width = 200
$TextBox.Left = ($Form.ClientSize.Width - $TextBox.Width)/2
$TextBox.Top = ($Form.ClientSize.Height - $TextBox.Height)/2 + 30
$Form.Controls.Add($TextBox)

$Label = New-Object System.Windows.Forms.Label
$Label.Font = New-Object System.Drawing.Font('Times New Roman',22,3,3) # Italic, Bold
$Label.ForeColor = '#ffffff'
$Label.AutoSize = $false
$Label.Dock = 5 # Fill
$Label.TextAlign = 32 # MiddleCenter
$Label.Text = "Пожалуйста, введите код:"
$Form.Controls.Add($Label)

$notClose = $true # глобальная переменная - не позволять закрывать форму

# функция проверки введенного кода
function checkCode() { 
    $code = '12345' 
    if ($TextBox.Text -eq $code) {
        $notClose = $false
        $Form.Close()
    } 
}

# функция-обработчик события для текстового поля
function keyDown() {
    $ret = 'Return'
    if ($_.KeyCode -eq $ret) {
        Invoke-Expression "checkCode"
    }
}

# функция-обработчик события закрытия формы
function formClosing() {    
    if ($notClose) {        
        $_.Cancel = $true        
    }
}

# обработчик события для кнопки
$Button.add_Click({ Invoke-Expression "checkCode" })

# обработчик события для текстового поля
$TextBox.add_KeyDown({ Invoke-Expression "keyDown" })

# обработчик события закрытия формы
$Form.add_FormClosing({ Invoke-Expression "formClosing" })

$Form.ShowDialog() | Out-Null

Выполняем скрипт в PowerShell ISE (F5) . . .

Как запустить выполнение скрипта в "боевых" условиях - догадайтесь сами :).

Дисклеймер: за "допиливание" полученного кода с целью противозаконного использования автор ответственности не несет.