Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Power Basic

Страница: 1 |

 

  Вопрос: Запуск EXE файла из переменной, массива, и т.п. Добавлено: 19.05.04 13:52  

Автор вопроса:  alex

Вот пример запуска EXE файла из переменой. Автор функции "LoadPbDllFromMemory"
Семен Матусовский. В принципе, запуск из секции тоже самое, главное передать
правильный указатель на первый байт "lpImageDosHeader" загружаемого экзешника.

Однако при этом, в запускаемом EXE, не будут работать ресурсные API...
LoadResource и т.п. Так-как RVA секции .rsrc перестал быть валидным!
RVA любой секции вычисляется как RVA = VA – АДРЕС ЗАГРУЗКИ, где VA -
виртуальный адрес элемента в памяти, а АДРЕС ЗАГРУЗКИ берется из поля
Op-tionalHeader.ImageBase, в том случае, если он равен ImageBase,
либо вычисляется непосредственно лоадером. Короче говоря, для нормального
отображения ресурсов, надо пересчитать смещения запускаемого EXE, и
скорректировать его PE Header с учетом VA(Virtual Address) PE заголовка
лоадера...
 
На практике я это еще не проверял, но как мне кажется это верное решение.
Хотя если у кого нибудь, есть мнения и исходники по этому поводу, кидайте
сюда, обсудим!

:)))

 

 

 

'******************************************************************************
' Слегка переделанный пример загрузчика PE-файлов Семена Матусовского.
' Загружает EXE файл(созданный компилятором PB) в переменную, и запускает его.
' Ресурсные API в загруженном EXE файле не работают.
' Для примера можно запустить C:\PBWIN\BIN\PBEDIT.EXE, загрузится только форма
' без тулбара и битмапок.


#Compile Exe "LOADER.EXE"
#Register None
#Dim All
#Include "Win32Api.Inc"

%IMAGE_ORDINAL_FLAG                     = &H80000000

Type IMAGE_IMPORT_BY_NAME
   Hint                   As Word
   ImpName                As Asciiz * 254
End Type

Type IMAGE_IMPORT_DESCRIPTOR
      OriginalFirstThunk     As Dword
      TimeDateStamp          As Dword
      ForwarderChain         As Dword
      pName                  As Dword
      FirstThunk             As Dword
End Type

Type IMAGE_BASE_RELOCATION
      VirtualAddress As Dword
      SizeOfBlock As Dword
End Type

Global hExe                      As Dword
 
 
   Function LoadPbDllFromMemory (ByVal lpRawDll As Dword, ByVal RawDllSize As Dword, lpImageDll As Dword) As Dword
      Dim sSysInfo                  As Local SYSTEM_INFO
      Dim ImagePages                As Local Dword
      Dim lpImageDosHeader          As Local IMAGE_DOS_HEADER Ptr
      Dim lpImageNtHeaders          As Local IMAGE_NT_HEADERS Ptr
      Dim lpImageSectionHeader      As Local IMAGE_SECTION_HEADER Ptr
      Dim lpImageImportDescriptor   As Local IMAGE_IMPORT_DESCRIPTOR Ptr
      Dim lpImageImportByName       As Local IMAGE_IMPORT_BY_NAME Ptr
      Dim lpImageBaseRelocTable     As Local IMAGE_BASE_RELOCATION Ptr
      Dim lpDllName                 As Local Asciiz Ptr
      Dim szDllName                 As Local String
      Dim hDll                      As Local Dword
      Dim lpFuncNameRef             As Local Dword Ptr
      Dim lpFuncAddr                As Local Dword Ptr
      Dim lpTypeOffset              As Word Ptr
      Dim TpOffset                  As Word
      Dim lpLink                    As Local Dword Ptr
      Dim fOldProtect               As Local Dword
      Dim i                         As Local Dword
      Dim j                         As Local Dword
      Dim k                         As Local Dword
      Dim Protection()              As Local Byte
      Dim Addr1                     As Local Dword
      Dim Addr2                     As Local Dword
      Dim Pg            &nb

Ответить

  Ответы Всего ответов: 6  

Номер ответа: 1
Автор ответа:
 alex



Вопросов: 84
Ответов: 453
 Профиль | | #1 Добавлено: 19.05.04 13:53

Блин, ну что еще за глюк! :(

Ответить

Номер ответа: 2
Автор ответа:
 alex



Вопросов: 84
Ответов: 453
 Профиль | | #2 Добавлено: 19.05.04 13:55

 

'Вот исходник
'******************************************************************************
' Слегка переделанный пример загрузчика PE-файлов Семена Матусовского.
' Загружает EXE файл(созданный компилятором PB) в переменную, и запускает его.
' Ресурсные API в загруженном EXE файле не работают.
' Для примера можно запустить C:\PBWIN\BIN\PBEDIT.EXE, загрузится только форма
' без тулбара и битмапок.


#Compile Exe "LOADER.EXE"
#Register None
#Dim All
#Include "Win32Api.Inc"

%IMAGE_ORDINAL_FLAG                     = &H80000000

Type IMAGE_IMPORT_BY_NAME
   Hint                   As Word
   ImpName                As Asciiz * 254
End Type

Type IMAGE_IMPORT_DESCRIPTOR
      OriginalFirstThunk     As Dword
      TimeDateStamp          As Dword
      ForwarderChain         As Dword
      pName                  As Dword
      FirstThunk             As Dword
End Type

Type IMAGE_BASE_RELOCATION
      VirtualAddress As Dword
      SizeOfBlock As Dword
End Type

Global hExe                      As Dword
 
 
   Function LoadPbDllFromMemory (ByVal lpRawDll As Dword, ByVal RawDllSize As Dword, lpImageDll As Dword) As Dword
      Dim sSysInfo                  As Local SYSTEM_INFO
      Dim ImagePages                As Local Dword
      Dim lpImageDosHeader          As Local IMAGE_DOS_HEADER Ptr
      Dim lpImageNtHeaders          As Local IMAGE_NT_HEADERS Ptr
      Dim lpImageSectionHeader      As Local IMAGE_SECTION_HEADER Ptr
      Dim lpImageImportDescriptor   As Local IMAGE_IMPORT_DESCRIPTOR Ptr
      Dim lpImageImportByName       As Local IMAGE_IMPORT_BY_NAME Ptr
      Dim lpImageBaseRelocTable     As Local IMAGE_BASE_RELOCATION Ptr
      Dim lpDllName                 As Local Asciiz Ptr
      Dim szDllName                 As Local String
      Dim hDll                      As Local Dword
      Dim lpFuncNameRef             As Local Dword Ptr
      Dim lpFuncAddr                As Local Dword Ptr
      Dim lpTypeOffset              As Word Ptr
      Dim TpOffset                  As Word
      Dim lpLink                    As Local Dword Ptr
      Dim fOldProtect               As Local Dword
      Dim i                         As Local Dword
      Dim j                         As Local Dword
      Dim k                         As Local Dword
      Dim Protection()              As Local Byte
      Dim Addr1                     As Local Dword
      Dim Addr2                     As Local Dword
      Dim Pg                        As Local Dword
      Dim Pg1                       As Local Dword
      Dim Pg2                       As Local Dword
      lpImageDosHeader = lpRawDll
      If RawDllSize < SizeOf(IMAGE_DOS_HEADER) Then Function = 1:  Exit Function
      If @lpImageDosHeader.e_magic <> %IMAGE_DOS_SIGNATURE Then Function = 1:  Exit Function ' invalid DOS signature
      If RawDllSize < @lpImageDosHeader.e_lfanew + SizeOf(IMAGE_NT_HEADERS) Then Function = 1:  Exit Function
      lpImageNtHeaders = lpImageDosHeader + @lpImageDosHeader.e_lfanew
      If @lpImageNtHeaders.Signature <> %IMAGE_NT_SIGNATURE Then Function = 1:  Exit Function ' invalid

Ответить

Номер ответа: 3
Автор ответа:
 alex



Вопросов: 84
Ответов: 453
 Профиль | | #3 Добавлено: 19.05.04 13:59

Идиотизм, почему там помещается мало текста в сообщении?

Короче, ссылка вот исходник...

http://scriptcom.narod.ru/loader.bas

Ответить

Номер ответа: 4
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #4 Добавлено: 19.05.04 18:00
Ну так это есть везде-несколько топиков на PowerBasic.com, да и ресурсы запускаемого файла не отображаются...

Ответить

Номер ответа: 5
Автор ответа:
 alex



Вопросов: 84
Ответов: 453
 Профиль | | #5 Добавлено: 20.05.04 11:00

Нужен спец, который сможет реализовать востановление ресурсов в загруженном EXE.

У меня пока не получается...

Ответить

Номер ответа: 6
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #6 Добавлено: 20.05.04 17:41

Вот тут есть статья про это дело: http://rsdn.ru/article/baseserv/peloader.xml

Правда там на Паскале, и я ни хрена в нем не понял...

Про ресурсы там чего-то пишется, как сделать чтобы они не терялись. Посмотри.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам