Страница: 1 | 2 |
2 alex А как получается "@lpImageNtHeaders.OptionalHeader.AddressOfEntryPoint + lpImageDosHeader" ? Есть полный пример? Не то что бы это так уж сильно мне было нужно. Просто интересно. 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 Извиняюсь, не LoadLibarary конечно, а LoadLibraryFromMemory. Ниже привожу исходники этой процедуры, она частично эмулирует загрузчик kernel32.dll и позволяет запускать EXE и DLL файлы прямо из массива или переменной. Написана на PowerBASIC 7.2 Function LoadLibraryFromMemory (ByVal lpRawDll As Dword, ByVal RawDllSize As Dword, lpImageDll As Dword) As Dword 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 Вопрос-то был про ЕХЕшник, с DLL так, конечно, можно поступить, она в адресном пространстве приложения, да и то, некоторые недокументированные фичи загрузчика могут свести на нет весь труд, но ЕХЕшнику-то нужно свое адресное пространство, а выделить его может, если не ошибаюсь, только VMM... Поэтому вариант с FSHook, имхо, все-таки проще в реализации. С точки зрения загрузчика Windows, между EXE и DLL файлами нет никакой разницы. Структура EXE и DLL файлов совершенно одинакова. В случае инициализации DLL вызывается LibMain, в EXE - WinMain (это приводит к запуску экзешника). Вообщето, это единственный вариант запуска экзешника, про FSHook ничего сказать не могу, т.к. слышу про это первый раз в жизни... И вообще, изучение исходников UPX спасет отцов русской демократии... )) Для ЕХЕшника выделяется обычно свое адресное пространство, DLL загружается в адресное пространство вызывающего приложения: есть одно исключение: упаковщики, но они как бы не вызывают другой, скажем, сгенерированный ЕХЕ, они распаковывают его в память и просто передают управление. Если не ошибаюсь, у упаковщиков обычно нестандартная точка входа, чтобы распакованный код не затер код распаковщика. Если пишешь распаковщик - разницы действительно никакой, а вот если надо запустить ЕХЕ в другом адресном пространстве - это уже серьезный геморр. Гляньте, тут вроде есть статья про упаковщики: http://www.xtin.org/
Вопрос: Как запустить ЕХЕ из массива
Добавлено: 12.04.04 11:24
Автор вопроса: SDL | Web-сайт:
Ответы
Всего ответов: 23
Номер ответа: 16
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #16
Добавлено: 15.04.04 04:41
Номер ответа: 17
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #17
Добавлено: 15.04.04 04:53
Номер ответа: 18
Автор ответа:
alex
Вопросов: 84
Ответов: 453
Профиль | | #18
Добавлено: 15.04.04 12:42
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
Номер ответа: 20
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #20
Добавлено: 15.04.04 18:51
Номер ответа: 21
Автор ответа:
alex
Вопросов: 84
Ответов: 453
Профиль | | #21
Добавлено: 16.04.04 11:13
Номер ответа: 22
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #22
Добавлено: 16.04.04 17:59
Номер ответа: 23
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #23
Добавлено: 17.04.04 05:06