Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: Как запустить ЕХЕ из массива Добавлено: 12.04.04 11:24  

Автор вопроса:  SDL | Web-сайт: StarTeleport.Narod.Ru | ICQ: 272678283 

Ответить

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

Номер ответа: 16
Автор ответа:
 @CyRax PTR



ICQ: 204447456 

Вопросов: 28
Ответов: 664
 Web-сайт: basicproduction.nm.ru/
 Профиль | | #16
Добавлено: 15.04.04 04:41

2 alex

А как получается

"@lpImageNtHeaders.OptionalHeader.AddressOfEntryPoint + lpImageDosHeader" ?

Есть полный пример?

Не то что бы это так уж сильно мне было нужно. Просто интересно.

Ответить

Номер ответа: 17
Автор ответа:
 @CyRax PTR



ICQ: 204447456 

Вопросов: 28
Ответов: 664
 Web-сайт: basicproduction.nm.ru/
 Профиль | | #17
Добавлено: 15.04.04 04:53

2 sne

А ты в API-Guide смотрел?

Create a new project and add this code to Form1

Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long

Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long

Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long

Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Any, ByVal wParam As Any, ByVal lParam As Any) As Long

Private Sub Form_Load()

On Error Resume Next

'KPD-Team 1999

'URL: http://www.allapi.net/

'E-Mail: KPDTeam@Allapi.net

'We're going to call an API-function, without declaring it!

Dim lb As Long, pa As Long

'map 'user32' into the address space of the calling process.

lb = LoadLibrary("user32")

'retrieve the address of 'SetWindowTextA'

pa = GetProcAddress(lb, "SetWindowTextA")

'Call the SetWindowTextA-function

CallWindowProc pa, Me.hWnd, "Hello !", ByVal 0&, ByVal 0&

'unmap the library's address

FreeLibrary lb

End Sub

Ответить

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



Вопросов: 84
Ответов: 453
 Профиль | | #18 Добавлено: 15.04.04 12:42

Извиняюсь, не  LoadLibarary конечно, а LoadLibraryFromMemory.

Ниже привожу исходники этой процедуры, она частично эмулирует загрузчик kernel32.dll и позволяет запускать EXE и DLL файлы прямо из массива или переменной.

Написана на PowerBASIC 7.2 

 

 

Function LoadLibraryFromMemory (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 NT signature
      If @lpImageNtHeaders.FileHeader.SizeOfOptionalHeader <> SizeOf(@lpImageNtHeaders.OptionalHeader) Or _
         @lpImageNtHeaders.OptionalHeader.Magic <> %IMAGE_NT_OPTIONAL_HDR32_MAGIC Then Function = 1: Exit Function
      If @lpImageNtHeaders.FileHeader.NumberOfSections < 1 Then Function = 1: Exit Function
      For i = 0 To %IMAGE_NUMBEROF_DIRECTORY_ENTRIES - 1
         If @lpImageNtHeaders.OptionalHeader.DataDirectory(i).VirtualAddress <> 0 Then
            Select Case As Long i
               Case %IMAGE_DIRECTORY_ENTRY_EXPORT     ' Export Directory
               Case %IMAGE_DIRECTORY_ENTRY_IMPORT     ' Import Directory
               Case %IMAGE_DIRECTORY_ENTRY_RESOURCE   ' Resource Directory
               Case %IMAGE_DIRECTORY_ENTRY_BASERELOC  ' Base Relocation Table
               Case %IMAGE_DIRECTORY_ENTRY_IAT        ' Import Address Table
               Case Els

Ответить

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



Вопросов: 84
Ответов: 453
 Профиль | | #19 Добавлено: 15.04.04 12:46

Case Else ' Strange for PB

Function = 2: Exit Function

End Select

End If

Next

lpImageSectionHeader = lpImageNtHeaders + SizeOf(IMAGE_NT_HEADERS)

k = lpImageSectionHeader - lpImageDosHeader + SizeOf(IMAGE_SECTION_HEADER) * @lpImageNtHeaders.FileHeader.NumberOfSections

j = k

For i = 0 To @lpImageNtHeaders.FileHeader.NumberOfSections - 1

j = Max(j, @lpImageSectionHeader[i].VirtualAddress + @lpImageSectionHeader[i].SizeOfRawData)

Next

GetSystemInfo sSysInfo

ImagePages = j \ sSysInfo.dwPageSize: If (j Mod sSysInfo.dwPageSize) Then Incr ImagePages

lpImageDll = VirtualAlloc(ByVal 0, CDwd(ImagePages * sSysInfo.dwPageSize), %MEM_COMMIT, %PAGE_EXECUTE_READWRITE)

If lpImageDll = 0 Then Function = 5: Exit Function

MoveMemory ByVal lpImageDll, ByVal lpRawDll, k

For i = 0 To @lpImageNtHeaders.FileHeader.NumberOfSections - 1

MoveMemory ByVal CDwd(lpImageDll + @lpImageSectionHeader[i].VirtualAddress), _

ByVal CDwd(lpRawDll + @lpImageSectionHeader[i].PointerToRawData), @lpImageSectionHeader[i].SizeOfRawData

Next

' Switch to new image

lpImageDosHeader = lpImageDll

lpImageNtHeaders = lpImageDosHeader + @lpImageDosHeader.e_lfanew

lpImageSectionHeader = lpImageNtHeaders + SizeOf(IMAGE_NT_HEADERS)

' Import section

lpImageImportDescriptor = @lpImageNtHeaders.OptionalHeader.DataDirectory(%IMAGE_DIRECTORY_ENTRY_IMPORT).VirtualAddress

If lpImageImportDescriptor <> 0 Then

lpImageImportDescriptor = lpImageImportDescriptor + lpImageDosHeader

While @lpImageImportDescriptor.OriginalFirstThunk <> 0 ' Dlls

lpDllName = @lpImageImportDescriptor.pName + lpImageDosHeader

szDllName = @lpDllName

hDll = GetModuleHandle(ByVal StrPtr(szDllName))

If hDll = 0 Then hDll = LoadLibrary(ByVal StrPtr(szDllName))

If hDll = 0 Then Function = 2: Exit Function ' Can't find

lpFuncNameRef = @lpImageImportDescriptor.OriginalFirstThunk + lpImageDosHeader

lpFuncAddr = @lpImageImportDescriptor.FirstThunk + lpImageDosHeader

While @lpFuncNameRef <> 0

lpImageImportByName = @lpFuncNameRef + lpImageDosHeader

If (@lpFuncNameRef And %IMAGE_ORDINAL_FLAG) Then _

@lpFuncAddr = GetProcAddress(hDll, ByVal @lpFuncNameRef And &HFFFF???) Else _

@lpFuncAddr = GetProcAddress(hDll, @lpImageImportByName.ImpName)

If @lpFuncAddr = 0 Then Function = 2: Exit Function

Incr lpFuncAddr

Incr lpFuncNameRef

Wend

Incr lpImageImportDescriptor

Loop

End If

lpImageBaseRelocTable = @lpImageNtHeaders.OptionalHeader.DataDirectory(%IMAGE_DIRECTORY_ENTRY_BASERELOC).VirtualAddress

If lpImageBaseRelocTable <> 0 Then

lpImageBaseRelocTable = lpImageBaseRelocTable + lpImageDosHeader

While @lpImageBaseRelocTable.VirtualAddress <> 0

lpTypeOffset = lpImageBaseRelocTable + SizeOf(IMAGE_BASE_RELOCATION)

While lpTypeOffset < lpImageBaseRelocTable + @lpImageBaseRelocTable.SizeOfBlock

TpOffset = @lpTypeOffset And &HF000??

If TpOffset = &H3000 Then

lpLink = lpImageDosHeader + @lpImageBaseRelocTable.VirtualAddress + (@lpTypeOffset And &HFFF??)

@lpLink = @lpLink - @lpImageNtHeaders.OptionalHeader.ImageBase + lpImageDosHeader

ElseIf TpOffSet = 0 Then

Else

Function = 3: Exit Function ' Uknown type

End If

Incr lpTypeOffset

Wend

lpImageBaseRelocTable = lpImageBaseRelocTable + @lpImageBaseRelocTable.SizeOfBlock

Wend

End If

ReDim Protection(ImagePages - 1)

For i = 0 To @lpImageNtHeaders.FileHeader.NumberOfSections

If i = @lpImageNtHeaders.FileHeader.NumberOfSections Then

Addr1 = 0: Addr2 = k: j = &H60000000??? ' %PAGE_EXECUTE_READ

Else

Addr1 = @lpImageSectionHeader[i].VirtualAddress

Addr2 = @lpImageSectionHeader[i].SizeOfRawData

j = @lpImageSectionHeader[i].Characteristics

End If

Addr2 = Addr1 + Addr2 - 1

Pg1 = Addr1 \ sSysInfo.dwPageSize

Pg2 = Addr2 \ sSysInfo.dwPageSize

For Pg = Pg1 To Pg2

If (j And &H20000000???) Then Protection(Pg) = Protection(Pg) Or 1 ' Execute

If (j And &H40000000???) Then Protection(Pg) = Protection(Pg) Or 2 ' Read

If (j And &H80000000???) Then Protection(Pg) = Protection(Pg) Or 4 ' Write

Next

Next

Addr1 = lpImageDosHeader

For Pg = 0 To ImagePages - 1

Select Case As Long Protection(Pg)

Case 2: fOldProtect = %PAGE_READONLY

Case 3: fOldProtect = %PAGE_EXECUTE_READ

Case 6: fOldProtect = %PAGE_READWRITE

Case Else: fOldProtect = %PAGE_EXECUTE_READWRITE ' Ignore strange combinations

End Select

If fOldProtect <> %PAGE_EXECUTE_READWRITE Then _

If VirtualProtect (ByVal Addr1, sSysInfo.dwPageSize, fOldProtect, fOldProtect) = 0 Then Function = 4: Exit Function

Addr1 = Addr1 + sSysInfo.dwPageSize

Next

i = @lpImageNtHeaders.OptionalHeader.AddressOfEntryPoint + lpImageDosHeader

Call Dword i Using EntryPoint (lpImageDosHeader, %DLL_PROCESS_ATTACH, 0)

End Function

Ответить

Номер ответа: 20
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #20
Добавлено: 15.04.04 18:51

Вопрос-то был про ЕХЕшник, с DLL так, конечно, можно поступить, она в адресном пространстве приложения, да и то, некоторые недокументированные фичи загрузчика могут свести на нет весь труд, но ЕХЕшнику-то нужно свое адресное пространство, а выделить его может, если не ошибаюсь, только VMM... Поэтому вариант с FSHook, имхо, все-таки проще в реализации.

Ответить

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



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

С точки зрения загрузчика Windows, между EXE и DLL файлами нет никакой разницы.

Структура EXE и DLL файлов совершенно одинакова. В случае инициализации DLL вызывается LibMain, в EXE - WinMain (это приводит к запуску экзешника).

Вообщето, это единственный вариант запуска экзешника, про FSHook ничего сказать

не могу, т.к. слышу про это первый раз в жизни...

И вообще, изучение исходников UPX спасет отцов русской демократии...

:)))

Ответить

Номер ответа: 22
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #22
Добавлено: 16.04.04 17:59

Для ЕХЕшника выделяется обычно свое адресное пространство, DLL загружается в адресное пространство вызывающего приложения: есть одно исключение: упаковщики, но они как бы не вызывают другой, скажем, сгенерированный ЕХЕ, они распаковывают его в память и просто передают управление. Если не ошибаюсь, у упаковщиков обычно нестандартная точка входа, чтобы распакованный код не затер код распаковщика. Если пишешь распаковщик - разницы действительно никакой, а вот если надо запустить ЕХЕ в другом адресном пространстве - это уже серьезный геморр.

Ответить

Номер ответа: 23
Автор ответа:
 @CyRax PTR



ICQ: 204447456 

Вопросов: 28
Ответов: 664
 Web-сайт: basicproduction.nm.ru/
 Профиль | | #23
Добавлено: 17.04.04 05:06

Гляньте, тут вроде есть статья про упаковщики:

http://www.xtin.org/

Ответить

Страница: 1 | 2 |

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



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