Страница: 1 |
Для этого, насколько мне известно, надо заставить свою программу исполнять функции ОС: - чтение и дешифровка заголовка EXE-файла - создание новой нити и объявление процесса - занесение в стек всех параметров - размещение в памяти секций данных, ресурсов и кода - передать управление запущенному процессу, как своей нити (иначе могут возникнуть проблемы с ОС) Другими словами, надо не наживать геморрой, а придумать что-то другое ASProtect, насколько мне известно, пишет на диск... Хотя можно еще попытаться попросить ОС запустить прогу с диска, перехватить ее обращение к нему и подставить взамен сектор памяти, где находится твой string (и при этом не забыть, что VB хранит строки в UNICODE...) Да, к сожалению это очень сложно. Я пробовал через поток запустить, но никак не получается даже файл с простеньким примером, Option Explicit А это код модуля. Public Const CREATE_SUSPENDED = &H4 Public Sub ThreadProc() Страница: 1 |
Вопрос: Как выполнить Shellcode функциями API
Добавлено: 14.06.03 15:57
Автор вопроса: Сергей Юдин
Имеется exe файл размещенный в памяти как String или массив.
Как его запустить на выполнение.
Запись файла на диск и запуск с помощью Shell или ShellExecute
не возможны по условиям безопасности.
Нечто подобное делает Asprotect после дешифровки файла.
Ответы
Всего ответов: 2
Номер ответа: 1
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #1
Добавлено: 15.06.03 15:22
Номер ответа: 2
Автор ответа:
Сергей Юдин
Вопросов: 8
Ответов: 81
Профиль | | #2
Добавлено: 15.06.03 19:43
который для простоты целиком считывается с диска.
Хотя сам поток запускается, даже в программе откомпилированной в нативе коде, а не только
P-коде, как рекомендуют.
Если кому интересно ложу свой пример, где поток запускает программу размещенную в модуле.
Поток можно запустить(кнопка1), приостановить (3), продолжить (4). Кнопка 2-выход.
На форме должно быть два текстбокса.
Dim file$, lFileLength As Long, BinaryData() As Byte
Dim dwFlags As Long, ThreadID As Long, thread1 As Long, Adres As Long
Private Sub Command1_Click()
file$ = App.Path + "\Primer.exe"
lFileLength = FileLen(file$)
ReDim BinaryData(lFileLength - 1)
Open file$ For Binary Access Read As #1
Get 1, , BinaryData()
Close #1
Adres = VarPtr(BinaryData(0))
Text2.Text = Adres
dwFlags = CREATE_SUSPENDED
'thread1 = CreateThread(ByVal 0&, ByVal 0&, Adres, ByVal 0&, dwFlags, ThreadID)
thread1 = CreateThread(ByVal 0&, ByVal 0&, AddressOf ThreadProc, ByVal 0&, dwFlags, ThreadID)
If thread1 = 0 Then End
Command4_Click
End Sub
Private Sub Command3_Click()
SuspendThread thread1
End Sub
Private Sub Command2_Click()
Unload Me
End Sub
Private Sub Command4_Click()
ResumeThread thread1
End Sub
Public Declare Function SuspendThread Lib "kernel32" (ByVal hThread As Long) As Long
Public Declare Function ResumeThread Lib "kernel32" (ByVal hThread As Long) As Long
Public Declare Function CreateThread Lib "kernel32" (ByVal lpThreadAttributes _
As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, _
lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long
Dim x&
For x = 1 To 1000
Form1.Text1.Text = x
Next x
End Sub