uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, BTMemoryModule;
type TShp = procedure (hk: HHOOK) stdcall;
type
TForm1 = class(TForm)
Load_Button: TButton;
do_button: TButton;
procedure Load_ButtonClick(Sender: TObject);
procedure do_buttonClick(Sender: TObject);
private
{ Private declarations }
public
m_DllDataSize:int64;
mp_DllData:Pointer;
procedure TForm1.Load_ButtonClick(Sender: TObject);
var
ms : TMemoryStream;
rs : TResourceStream;
begin
if 0 <> FindResource(hInstance, 'SPDLL', RT_RCDATA) then
begin
rs := TResourceStream.Create(hInstance, 'SPDLL', RT_RCDATA);
ms := TMemoryStream.Create;
try
ms.LoadFromStream(rs);
ms.Position := 0;
m_DllDataSize := ms.Size;
mp_DllData := GetMemory(m_DllDataSize);
ms.Read(mp_DllData^, m_DllDataSize);
finally
ms.Free;
rs.Free;
end;
end;
end;
LoadLibrary из ресурса
Всем привет! Подскажите пожалуйста. В ресурсе, подключенному к проекту есть DLL. Возможно ли каким-то образом выполнить LoadLibrary для DLL, находящейся в ресурсе!? Спасибо.
Угу, сохранить ресурс на диск и загрузить через LoadLibrary
необходимо выгрузить ее во временный файл (или выполнить меппинг)
Есть ещё res://-протокол,но не уверен,что он подойдёт для данной задачи(но может подойти для чего-то ещё,близкого по теме)
сохранять из ресурсов а потом грузить с диска не совсем уместно. интересует именно загрузка DLL из памяти и установка хука. В принципе, с загрузкой DLL из ресурса в память уже разобрался. Но возник другой вопрос. В SetWindowHookEX один из передаваемых параметров Hmod. Скажите пожалуйста, возможно ли его получить другим образом (именно из памяти), а не через LoadLibrary (с указанием пути к DLL)
Ну куда отмапал,там и будет значение.Это ж базовый адрес загрузки модуля
Код:
Код:
procedure TForm1.do_buttonClick(Sender: TObject);
var
btMM: PBTMemoryModule;
m_TestCallstd:Pointer;
p: pointer;
sh: TShp;
hk: HHOOK;
h:THandle;
begin
btMM := BTMemoryLoadLibary(mp_DllData, m_DllDataSize);
h:=THandle(btMM.codeBase);
try
if btMM = nil then Abort;
p := BTMemoryGetProcAddress(btMM, 'HookProc');
@sh:=BTMemoryGetProcAddress(btMM, 'SetHK');
if ((p=nil) or (@sh=nil)) then
begin
MessageBox(0, PAnsiChar('Библиотека не содержит необходимых процедур!'),
0, MB_OK+MB_ICONERROR);
exit;
end;
hk:=SetWindowsHookEx(WH_CALLWNDPROC, p, h, 0);
if hk=0 then
begin
MessageBox(0, PAnsiChar('Невозможно установить ловушку!'),
0, MB_OK+MB_ICONERROR);
FreeLibrary(h);
exit;
end;
sh(hk);
MessageBox(0, 'Ловушка установлена! Нажмите OK для снятия.',
0, MB_OK);
UnhookWindowsHookEx(hk);
FreeLibrary(h);
except
Showmessage('Ошибка загрузки DLL: ' + BTMemoryGetLastError);
end;
if Assigned(btMM) then BTMemoryFreeLibrary(btMM);
end;
var
btMM: PBTMemoryModule;
m_TestCallstd:Pointer;
p: pointer;
sh: TShp;
hk: HHOOK;
h:THandle;
begin
btMM := BTMemoryLoadLibary(mp_DllData, m_DllDataSize);
h:=THandle(btMM.codeBase);
try
if btMM = nil then Abort;
p := BTMemoryGetProcAddress(btMM, 'HookProc');
@sh:=BTMemoryGetProcAddress(btMM, 'SetHK');
if ((p=nil) or (@sh=nil)) then
begin
MessageBox(0, PAnsiChar('Библиотека не содержит необходимых процедур!'),
0, MB_OK+MB_ICONERROR);
exit;
end;
hk:=SetWindowsHookEx(WH_CALLWNDPROC, p, h, 0);
if hk=0 then
begin
MessageBox(0, PAnsiChar('Невозможно установить ловушку!'),
0, MB_OK+MB_ICONERROR);
FreeLibrary(h);
exit;
end;
sh(hk);
MessageBox(0, 'Ловушка установлена! Нажмите OK для снятия.',
0, MB_OK);
UnhookWindowsHookEx(hk);
FreeLibrary(h);
except
Showmessage('Ошибка загрузки DLL: ' + BTMemoryGetLastError);
end;
if Assigned(btMM) then BTMemoryFreeLibrary(btMM);
end;