purebasic.info

PureBasic forum
Текущее время: Пн окт 22, 2018 2:32 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 57 ]  На страницу Пред.  1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Пт фев 24, 2012 7:30 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вс ноя 07, 2010 12:19 pm
Сообщений: 281
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Volkoff
LdrRelocateImage() можно найти сигнатурно, в нём передаются статусы в аргументах STATUS_SUCCESS, STATUS_CONFLICTING_ADDRESSES и STATUS_INVALID_IMAGE_FORMAT.

Цитата:
Идея зацепиться на ранних стадиях обламывается в зародыше при NtCreateSection() без SEC_IMAGE.

С known тоже так, чекается секция. Но ничто не мешает эту проверку обойти.

Цитата:
Отдельно для Инди, - неприкладной выброс "ядерной философии" не приветствуется

:roll:

_________________
Materia Lucida


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс фев 26, 2012 4:06 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Сб июл 18, 2009 8:25 am
Сообщений: 813
Благодарил (а): 21 раз.
Поблагодарили: 4 раз.
Пункты репутации: 0
Разобрался с выравниванием секций, правами, релоками и уперся в импорт.
С одной стороны, не проблема посчитать адреса процедур модулей нужных длл, которые уже есть в процессе, еще до ее непосредственной загрузки и поправить их в IAT.
А что тогда с теми либами, которых процесс не подгрузил?
Допустим, можно в первую очередь в коде нашей длл их подгрузить, но их адреса вроде как в IAT уже есть.
Непонятно.
Теоретически все вызовы апишек в либе можно заменить на "прямые", сократив импорт, но каждую ф-цию пурика же не перепишешь.

Оказалось, что не так-то просто с лету написать этот "велосипед".
Я бы даже снова посмотрел в сторону передачи всей этой "рутины" штатному загрузчику, но инфы не хватает.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс фев 26, 2012 9:51 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вс ноя 07, 2010 12:19 pm
Сообщений: 281
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
user32.dll(тлс), COM(core) к примеру не загрузится, так как лодер её специальным образом загружает. А как быть с директорией конфигурации, мб я там к примеру аффинитет потока задан. Тех же релоков много типов, так же и импорт разный бывает. А манифесты - они активно юзаются, так же работать не будет(контекст активации). Гим конечно тоже работать не будет, ибо в загрузчик интегрирован. А как же DEP. А конфигурация загрузки, это ведь важно. Снятие колстека также не будет работать(RtlLogStackBackTrace()). Нотификация конечно не будет работать. А базовые апи, вероятно GetModuleHandle() тоже работать не будет.. список можно продолжать, они называют такое хорошей годной загрузкой :lol:

_________________
Materia Lucida


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт авг 03, 2012 12:46 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пт окт 31, 2008 4:49 pm
Сообщений: 717
Благодарил (а): 1 раз.
Поблагодарили: 4 раз.
Пункты репутации: 0
Попробовал я bass.dll засунуть в exe, с помощью кода pablov, но что-то не хочет работать. Выдает ошибку при попытке вызвать функцию:
"Невозможен доступ к памяти. (ошибка чтения по адресу 0)"
Адреса памяти функций выдает, но работать не хочет. Никто не сталкивался с таким?

Код:
1
2
3
4
5
6
 
BaseDll.l = LoadLibraryEx(?StartFile, ?EndFile)  
Global BASS_StreamCreateFile=GetProcAddressEx(BaseDll,"BASS_StreamCreateFile")
 
 FileName.s = OpenFileRequester("","","*.*|*.*",0)
 Handle=CallFunctionFast(BASS_StreamCreateFile,0,@FileName, 0,0, #UNICODE)


_________________
мой форум http://spaceminers.mybb2.ru
Dungeon Raider (Ogre). Game video: http://www.youtube.com/watch?v=ZlhBgPJhAxI


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Загрузка виртуалной DLL из exe
СообщениеДобавлено: Сб сен 28, 2013 12:05 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Переделал код под PureBasic 5.11 и выше
Убрал некоторые недочеты
Во вложении файлы:
1. DllFromMememory.pbi - собстна сама приблуда
2. CreatePakFile.pb - код для упаковки dll (не пакуйте если dll уже упакована!!!)
3. test_dll.pb - код dll для попробовать
4. test_dll.dll - скомпиленная dll
5. Test2.pb - типа пример использования


Вложения:
DllFromMememory.rar [12.68 KiB]
Скачиваний: 230

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение
Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Загрузка виртуалной DLL из exe
СообщениеДобавлено: Сб сен 28, 2013 9:47 pm 
Не в сети
профессор

Зарегистрирован: Вт янв 13, 2009 2:41 pm
Сообщений: 370
Благодарил (а): 3 раз.
Поблагодарили: 17 раз.
Пункты репутации: 8
Попробовал тестовую dll-ку запаковать upx-ом, загрузилась нормально.
Спасибо, вещь нужная.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Загрузка виртуальной DLL из exe
СообщениеДобавлено: Вс окт 27, 2013 6:18 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1699
Откуда: Алматы
Благодарил (а): 15 раз.
Поблагодарили: 46 раз.
Пункты репутации: 5
мой проект что-то ругался на 5.11... потому я сидел на 5.00. но тут засел переделывать специально с прицелом захвата сей замечательной штуки.

однако когда попытался использовать ругается: константа типа не определена #PB_PackerPlugin_LZMA - по всей видимости моя LZMA не подходит. помница качал я с сайта гнозала и там была пометка что это для 5.00. где можно взять это дело под 5.11?


закоментировал PeekW(StartFile) = $005D то теперь вылетает на:
Код:
1
MoveMemory(StartFile, *VirtMemOffset, SizePakDll)   ; прямо копируем в память



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Загрузка виртуальной DLL из exe
СообщениеДобавлено: Вс окт 27, 2013 6:30 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
#PB_PackerPlugin_LZMA это стандартная константа пурика. Вот: http://www.purebasic.com/documentation/packer/compressmemory.html

UPD: Нарыл, она появилась в PB 5.10

_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Загрузка виртуальной DLL из exe
СообщениеДобавлено: Вс окт 27, 2013 6:36 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1699
Откуда: Алматы
Благодарил (а): 15 раз.
Поблагодарили: 46 раз.
Пункты репутации: 5
а у меня нету такой... это для 5.20?
Изображение


вылет нашелся... ктож знал что оказывается в файл DllFromMememory.pbi надо вносить еще изменения... я думал все подается еще на входе в Test2.pb
размер библиотеки изменять над. так ладно... а все остальное стандартно? в смысле объявление функций через прототипы?


Последний раз редактировалось SereZa Вс окт 27, 2013 6:44 pm, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Загрузка виртуальной DLL из exe
СообщениеДобавлено: Вс окт 27, 2013 6:46 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1699
Откуда: Алматы
Благодарил (а): 15 раз.
Поблагодарили: 46 раз.
Пункты репутации: 5
а в окошке "о программе" в самом низу у тебя:
IDE build on 03/19/2013 [07:47] by Fred
Branch: v5.10 Revision: 1472

или это мне бету под видом релиза подсунули?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Загрузка виртуальной DLL из exe
СообщениеДобавлено: Вс окт 27, 2013 6:47 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
Нашёл! :)

Цитата:
Changed: Packer plugin constant renamed to #PB_PackerPlugin_XXX


Так что всё хорошо. В 5.2 изменили название

_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Загрузка виртуальной DLL из exe
СообщениеДобавлено: Вс окт 27, 2013 7:05 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1699
Откуда: Алматы
Благодарил (а): 15 раз.
Поблагодарили: 46 раз.
Пункты репутации: 5
черт с ней. ту часть кода закоментировал и по всей видимости у меня левый 5.11... впрочем сжимать библиотеку не планировал, по плану получившийся ехе сжимать. вернемся к нашим баранам: http://dmarket.pusku.com/MNP/bzip2.dll как энту библиотеку подключить? вываливается в IMA и все тут...
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
XIncludeFile "C:\DllFromMememory.pbi"
 
Prototype.i ProtoBZ2_bzBuffToBuffDecompress(*DestBuff, *DestSize, *SourceBuff, iSourceSize, small, verbosity)
Global BZ2_bzBuffToBuffDecompress.ProtoBZ2_bzBuffToBuffDecompress
 
hdll = LoadLibraryEx(?StartDllBZ, ?EndDllBZ)
 
If hdll
  ;BZ2_bzBuffToBuffDecompress = GetFunction(hdll,"BZ2_bzBuffToBuffDecompress")
  BZ2_bzBuffToBuffDecompress = GetProcAddressEx(hdll, "BZ2_bzBuffToBuffDecompress")
EndIf
 
DataSection
  StartDllBZ:
    IncludeBinary "C:\bzip2.dll"                  
  EndDllBZ:
EndDataSection



забыл добавить - галка юникода и тредсейв в компиляторе!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Загрузка виртуальной DLL из exe
СообщениеДобавлено: Пн окт 28, 2013 8:17 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
; Author:            pablov
; Date:              September 24, 2011
; Update:            October 28, 2013
; OS:                Microsoft Windows
; Compiler:          PureBasic 5.10 and >
; По мотивам  http://rsdn.ru/article/baseserv/peloader.xml
;########################################################################################
;###                                                                                  ###
;###                               АХТУНГ!!!!!!!                                      ###
;###          Имена функций вызываемых из DLL РЕГИСТРОЗАВИСИМЫ !!!!!!!!!!             ###
;###                                                                                  ###
;########################################################################################
; Если библиотека не упакована сторонними пакерами, ее можно упаковать
; средствами PureBasic, для уменьшения веса приложения. Распаковка предусмотрена для LZMA (можно использовать другой пакер)
 
#IMAGE_REL_BASED_ABSOLUTE = 0
#IMAGE_ORDINAL_FLAG32     = $80000000
 
;{ Structures
CompilerIf Defined(IMAGE_SECTION_HEADER, #PB_Structure) = 0
  Structure IMAGE_SECTION_HEADER
    SecName.b[8]
    StructureUnion
      PhysicalAddr.l
      VirtualSize.l
    EndStructureUnion
    VirtualAddress.l
    SizeOfRawData.l
    PointerToRawData.l
    PointerToRelocations.l
    PointerToLinenumbers.l
    NumberOfRelocations.w
    NumberOfLinenumbers.w
    Characteristics.l
  EndStructure
CompilerEndIf
 
CompilerIf Defined(IMAGE_SECTION_HEADERS, #PB_Structure) = 0
  Structure IMAGE_SECTION_HEADERS
    ish.IMAGE_SECTION_HEADER[64]
  EndStructure
CompilerEndIf
 
Structure ImageBaseRelocation
    VirtualAddress.l
    SizeOfBlock.l
EndStructure
 
Structure _IMAGE_IMPORT_DESCRIPTOR
    OriginalFirstThunk.l
    TimeDateStamp.l                     ;  0, если импортирование осуществляется без привязки (binding)
                                        ;  При импортировании с привязкой содержит отметку времени файла, из которого
                                        ;  импортируем, но: Если -1, то здесь использовался новый стиль привязки
    ForwarderChain.l                    
    Name.l                              ;  Виртуальный адрес ASCIIZ-строки с именем файла, из которого импортируем
    FirstThunk.l                        ;  Виртуальный адрес подтаблицы импортируемых символов
EndStructure
 
Structure DLL_INFO                      ; Глобальные переменные
  BaseVirtDll.l
  EntryPoint.l
  loadDLL.l
EndStructure  
;}
 
Global Dim LibraryLoad(0)               ; Сюда заносим хендлы библиотек загруженых для нашей вирт. DLL
Global DllInfo.DLL_INFO
 
ProcedureDLL FreeLibraryEx()            ; Выгружает dll и освобождает зааллоченую память  
    CallFunctionFast(DllInfo\BaseVirtDll + DllInfo\EntryPoint, DllInfo\BaseVirtDll, #DLL_PROCESS_DETACH, 0)
    For i.w = 0 To DllInfo\loadDLL - 1
       FreeLibrary_(LibraryLoad(i))
    Next i
    If DllInfo\BaseVirtDll : VirtualFree_(DllInfo\BaseVirtDll, 0, #MEM_RELEASE) :EndIf
EndProcedure
 
ProcedureDLL GetProcAddressEx(BaseAddress.l, ProcName.s)
    Protected PExports.IMAGE_EXPORT_DIRECTORY
    Protected _step = 0
    Protected *DOS_HEADER.IMAGE_DOS_HEADER            
    Protected *NT_HEADERS.IMAGE_NT_HEADERS
    *DOS_HEADER      = BaseAddress
    *NT_HEADERS      = BaseAddress + *DOS_HEADER\e_lfanew          
    RtlMoveMemory_(PExports, *NT_HEADERS\OptionalHeader\DataDirectory[#IMAGE_DIRECTORY_ENTRY_EXPORT]\VirtualAddress + BaseAddress , SizeOf(IMAGE_EXPORT_DIRECTORY))
    NameAddr.l = PExports\AddressOfNames + BaseAddress
    OrdinalAddres.l = PExports\AddressOfNameOrdinals + BaseAddress
    FuncAddr.l      = PExports\AddressOfFunctions + BaseAddress
    For index.l = 0 To PExports\NumberOfNames - 1
        NameAddr + _step
        OrdinalAddres + _step/2                   ; Делим на два, потому что Ordinal -> WORD
        If ProcName = PeekS(PeekL(NameAddr) + BaseAddress, #MAX_PATH, #PB_Ascii)
           ProcAddress.l = PeekL(FuncAddr + PeekW(OrdinalAddres)*4 ) + BaseAddress
           Break
        EndIf  
        _step = 4                                 ; Увеличиваем на DWORD
    Next index
 ProcedureReturn ProcAddress  
EndProcedure
 
ProcedureDLL ImportProc(BaseAddress.l, *NT_HEADERS.IMAGE_NT_HEADERS)
  Protected PImport._IMAGE_IMPORT_DESCRIPTOR
  Protected PRVA_Import
  Protected LibsUsed.s   = Space(#MAX_PATH)
  Protected Name_func.s  = Space(#MAX_PATH)
  Protected Name_funcA.s = Space(#MAX_PATH) ; Ascii
  n.w = 0
  If *NT_HEADERS\OptionalHeader\DataDirectory[#IMAGE_DIRECTORY_ENTRY_IMPORT]\VirtualAddress  ; Если нет иморта, пропускаем
    SizeImportStruct.b = SizeOf(_IMAGE_IMPORT_DESCRIPTOR)
    RtlMoveMemory_(PImport, *NT_HEADERS\OptionalHeader\DataDirectory[#IMAGE_DIRECTORY_ENTRY_IMPORT]\VirtualAddress + BaseAddress , SizeImportStruct)
    While PImport\FirstThunk <> 0                             ; Пока не пройдем по всем библиотекам
 
       LibsUsed = PeekS(PImport\Name + BaseAddress, 100, #PB_Ascii)
          hModule = GetModuleHandle_(LibsUsed)
          If hModule = 0                                      ; Если наше приложение не подгрузило нужных библиотек
            hModule = LoadLibrary_(LibsUsed)                  ; загрузим их сами
            ReDim LibraryLoad(DllInfo\loadDLL)
            LibraryLoad(DllInfo\loadDLL) = hModule
            DllInfo\loadDLL + 1
          EndIf
          If PImport\TimeDateStamp = 0                        ; Привязка есть?          
               PRVA_Import = pImport\FirstThunk + BaseAddress
          Else
               PRVA_Import = pImport\OriginalFirstThunk + BaseAddress          
          EndIf
        While PeekL(PRVA_Import) <> 0  ; Пока не пройдем по всем импорируемым функциям из данной библиотеки
          If PeekL(PRVA_Import) & #IMAGE_ORDINAL_FLAG32 <> 0                       ; Если импорт по ординалу
             PokeL(PRVA_Import, GetProcAddress_(hModule, PeekL(PRVA_Import) & $FFFF))
           Else                                                                     ; Иначе по имени
             Name_func = PeekS(PeekL(PRVA_Import) + 2 + BaseAddress, #MAX_PATH, #PB_Ascii)
             CompilerIf #PB_Compiler_Unicode
                 WideCharToMultiByte_(#CP_ACP, 0, @Name_func, -1, @Name_funcA, #MAX_PATH, #Null, #Null)
                 If GetProcAddress_(hModule, Name_funcA)
                   PokeL(pImport\FirstThunk + n + BaseAddress, GetProcAddress_(hModule, Name_funcA))
                 Else
                   ProcedureReturn -1
                 EndIf  
             CompilerElse
                 If GetProcAddress_(hModule, Name_func)
                   PokeL(pImport\FirstThunk + n + BaseAddress, GetProcAddress_(hModule, Name_func))
                 Else
                   ProcedureReturn -1
                 EndIf  
             CompilerEndIf
          EndIf
            n + 4
            PRVA_Import + 4
        Wend
        n = 0
         RtlMoveMemory_(PImport, *NT_HEADERS\OptionalHeader\DataDirectory[#IMAGE_DIRECTORY_ENTRY_IMPORT]\VirtualAddress + BaseAddress + _step.w + SizeImportStruct, SizeImportStruct)
         _step + SizeImportStruct
    Wend
  EndIf
EndProcedure
 
ProcedureDLL RelocProc(BaseAddress.l, *NT_HEADERS.IMAGE_NT_HEADERS)
  Protected *PReloc.ImageBaseRelocation
  Protected ModCount
  Protected ImageBaseDelta = BaseAddress - *NT_HEADERS\OptionalHeader\ImageBase   ; Вычисляем дельту  
  If ImageBaseDelta     ; Если память под вирт. DLL выделена по ImageBase (дельта = 0), релоки править не надо
    RelocsSize.l = *NT_HEADERS\OptionalHeader\DataDirectory[#IMAGE_DIRECTORY_ENTRY_BASERELOC]\Size
    *PReloc = *NT_HEADERS\OptionalHeader\DataDirectory[#IMAGE_DIRECTORY_ENTRY_BASERELOC]\VirtualAddress + BaseAddress
    P.w
    j.l
    tempSize.l = 0
    startAdrReloc = *NT_HEADERS\OptionalHeader\DataDirectory[#IMAGE_DIRECTORY_ENTRY_BASERELOC]\VirtualAddress + BaseAddress + 8
    While tempSize < RelocsSize                                          
       ModCount = (*PReloc\SizeOfBlock - 8) / 2
       For j = 0 To ModCount-1
          P = PeekW(startAdrReloc)
          If P & $f000 <> #IMAGE_REL_BASED_ABSOLUTE
             RelocValue = PeekL(BaseAddress + *PReloc\VirtualAddress + (P & $0fff)) + ImageBaseDelta
             PokeL(BaseAddress + *PReloc\VirtualAddress + (P & $0fff), RelocValue)        ;  Исправляем ссылку
             startAdrReloc + 2
          Else
             startAdrReloc + 2
          EndIf
       Next j  
       tempSize        + *PReloc\SizeOfBlock
       *PReloc         + *PReloc\SizeOfBlock
       startAdrReloc   + 8
    Wend
  EndIf
EndProcedure
 
ProcedureDLL LoadLibraryEx(StartFile.l, EndFile.l, SizeDll.l)   ; SizeDll - Этот размер берем от незапакованной Dll !!!!!!!!!!!!
  Protected *DOS_HEADER.IMAGE_DOS_HEADER            
  Protected *SECTION_HEADERS.IMAGE_SECTION_HEADERS  
  Protected BaseVirtDll
  Protected *NT_HEADERS.IMAGE_NT_HEADERS
  Protected SizePakDll =  EndFile - StartFile
  *VirtMemOffset = AllocateMemory(SizeDll)
  FillMemory(*VirtMemOffset, SizeDll)
  If PeekW(StartFile) = $005D                 ; Если файл запакован средствами PureBasic(#PB_PackerPlugin_LZMA)
      Result = UncompressMemory(StartFile, SizePakDll, *VirtMemOffset, SizeDll,   #PB_PackerPlugin_LZMA)
      If Not Result
         If *VirtMemOffset : FreeMemory(*VirtMemOffset) : EndIf  
         ProcedureReturn 0
       EndIf  
  ElseIf PeekW(StartFile) = $5A4D                           ; Если не запакован (сигнатура "MZ")
      MoveMemory(StartFile, *VirtMemOffset, SizePakDll)     ; прямо копируем в память
  Else
      MessageRequester("Error", " No valid PE File  ", #MB_OK|#MB_ICONERROR)
      ProcedureReturn 0
  EndIf  
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  Загрузка образа DLL в выделенную память   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
   ; Инициируем структуры
   *DOS_HEADER      = *VirtMemOffset
   *NT_HEADERS      = *VirtMemOffset + *DOS_HEADER\e_lfanew          
   *SECTION_HEADERS = *NT_HEADERS\OptionalHeader + *NT_HEADERS\FileHeader\SizeOfOptionalHeader
   ; Выделяем память под виртуальную dll
   BaseVirtDll = VirtualAlloc_(#Null, *NT_HEADERS\OptionalHeader\SizeOfImage, #MEM_COMMIT, #PAGE_EXECUTE_READWRITE)
   If BaseVirtDll  
      DllInfo\EntryPoint = *NT_HEADERS\OptionalHeader\AddressOfEntryPoint
      ; Грузим PE Header (заголовок)
      ; В большинстве случаев, заголовок можно не грузить, но в некоторых случаях грузить необходимо,
      ; т.к. присутствует проверка целостности образа в памяти. Как в примере с BASS.dll
 
      RtlMoveMemory_(BaseVirtDll, *VirtMemOffset, *NT_HEADERS\OptionalHeader\SizeOfHeaders)      
      ; Грузим секции на родину
      For i = 0 To *NT_HEADERS\FileHeader\NumberOfSections - 1
         RtlMoveMemory_(BaseVirtDll + *SECTION_HEADERS\ish[i]\VirtualAddress, *VirtMemOffset  + *SECTION_HEADERS\ish[i]\PointerToRawData, *SECTION_HEADERS\ish[i]\SizeOfRawData)      
      Next i
      RelocProc(BaseVirtDll, *NT_HEADERS)                       ; Правка релоков    
 
      If ImportProc(BaseVirtDll, *NT_HEADERS) = -1                     ; Заполнение таблицы импорта
        ProcedureReturn 0
      EndIf
    ; @@@@@@@@@@@@@@@@@@@@@@@@@@  Выставляем секциям флаги доступа  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  
       For i = 0 To *NT_HEADERS\FileHeader\NumberOfSections - 1
          SC.l = *SECTION_HEADERS\ish[i]\Characteristics
          protect.l = #PAGE_READONLY
          If  SC & $80000000 : protect = #PAGE_READWRITE  : EndIf          
          If  SC & $20000000 : protect = #PAGE_EXECUTE_READ : EndIf        
          If  SC & $20000000 And SC & $80000000 : protect = #PAGE_EXECUTE_READWRITE : EndIf
          VirtualProtect_(*SECTION_HEADERS\ish[i]\VirtualAddress + BaseVirtDll, *SECTION_HEADERS\ish[i]\VirtualSize, protect, @TempAddr.l)
       Next i
    ; @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@     Инициируем DLL    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
       If DllInfo\EntryPoint                       ; Если DllMain присутствует
 
         If CallFunctionFast(BaseVirtDll + *NT_HEADERS\OptionalHeader\AddressOfEntryPoint, BaseVirtDll, #DLL_PROCESS_ATTACH, 0)
         Else
           FreeLibraryEx()
           ProcedureReturn 0
         EndIf
       EndIf
    ; @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
       If *VirtMemOffset : FreeMemory(*VirtMemOffset) : EndIf  
       DllInfo\BaseVirtDll = BaseVirtDll            
    ProcedureReturn BaseVirtDll
 EndIf
    If *VirtMemOffset : FreeMemory(*VirtMemOffset) : EndIf  
    ProcedureReturn 0
EndProcedure


_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Последний раз редактировалось pablov Чт ноя 07, 2013 3:08 pm, всего редактировалось 3 раз(а).

Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Загрузка виртуальной DLL из exe
СообщениеДобавлено: Вт окт 29, 2013 12:16 am 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1699
Откуда: Алматы
Благодарил (а): 15 раз.
Поблагодарили: 46 раз.
Пункты репутации: 5
pablov, предлагаю чуточку изменить LoadLibraryEx(StartFile.l, EndFile.l) на нечто LoadLibraryEx(StartFile.l, EndFile.l, OriginalSize.i), дабы для использования не требовалось изменения оригинального DllFromMememory.pbi (всмысле дабы не менять OutputSize = 69120 внутри DllFromMememory.pbi, а сделать этот параметр "входящим" при вызове функции)

а если еще и закоментить
Код:
1
2
3
4
5
6
  ;If PeekW(StartFile) = $005D                 ; Если файл запакован средствами PureBasic(#PB_PackerPlugin_LZMA)
  ;    Result = UncompressMemory(StartFile, SizePakDll, *VirtMemOffset, OutputSize,   #PB_PackerPlugin_LZMA)
  ;    If Not Result
  ;       If *VirtMemOffset : FreeMemory(*VirtMemOffset) : EndIf  
  ;       ProcedureReturn 0
  ;     EndIf


то работает и в 5.0


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Загрузка виртуальной DLL из exe
СообщениеДобавлено: Вт окт 29, 2013 5:56 am 
Не в сети
профессор

Зарегистрирован: Вс июн 10, 2012 8:18 am
Сообщений: 1294
Благодарил (а): 60 раз.
Поблагодарили: 49 раз.
Пункты репутации: 14
SereZa писал(а):
pablov, предлагаю чуточку изменить LoadLibraryEx(StartFile.l, EndFile.l) на нечто LoadLibraryEx(StartFile.l, EndFile.l, OriginalSize.i), дабы для использования не требовалось изменения оригинального DllFromMememory.pbi (всмысле дабы не менять OutputSize = 69120 внутри DllFromMememory.pbi, а сделать этот параметр "входящим" при вызове функции)

А зачем передавать размер? Разве его нельзя получить?


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 57 ]  На страницу Пред.  1, 2, 3, 4  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB