![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Список экспортируемых ф-ций [D3, D4, D5, D6, Win95/98, WinME, NT4, Win2k, WinXP]
mcs © (2002-06-27 09:43:00)Как получить все экспортируемые ф-ции DLL-ки? Можно ли принудительно выгрузить DLL, зная только имя(или еще Handle)?
Игорь Шевченко (2002-07-01 14:25:00) [1]@andrew © (01.07.02 13:26)
Для unix - IDA. Или еще масса аналогов
@andrew (2002-07-01 13:26:00) [2]>Игорь Шевченко
Сенкс. Попробую почитатью. Если честно, то проблема в том, что мне надо, чтобы эта "прога-возвращалка экп. функций" работала под Unix, т.е. запускать Windows-only DLL-ки не катит.
Игорь Шевченко (2002-07-01 13:17:00) [3]@andrew © (01.07.02 13:07)
> Ну хорошо, не хочется делать LoadLibrary: могу я получить
> список экпортируемых функций?
tdump, очевидно, стоит запустить. Или, прочитав статью Matt Pietrek в MSDN, написать его аналог :-)
@andrew (2002-07-01 13:16:00) [4]В том смысле, что в приведенном на http://delphibase.endimus.com/?action=viewfunc&topic=filedll&id=10062коде для выполнения функции необходимо DLL-ку подгрузить, а я вообще не хочу, чтобы начинал работать хоть какой-нибудь код DLL-ки.
@andrew (2002-07-01 13:07:00) [5]Ну хорошо, не хочется делать LoadLibrary: могу я получить список экпортируемых функций?
Alx2 (2002-07-01 10:58:00) [6]>v0id © (27.06.02 14:26)
Плагиатствуем, батенька?
Приведенный Вами код полностью соответствует
http://delphibase.endimus.com/?action=viewfunc&topic=filedll&id=10062
Там же сказано: "© Mystic"
Игорь Шевченко (2002-07-01 10:46:00) [7]Cobalt © (01.07.02 09:49)
> Кстати, попробуйте прилинковать свою ДЛЛ-ку статически и
> выгрузить её. И сообщите, получилось ли?
Пробовали - получалось. Но зачем?
Cobalt (2002-07-01 09:49:00) [8]Хотел бы высказать свою точку зрения на "проблему выгрузки kernel32". Может быть дело в том, что она прилинкована статически? Или FreeLibrary такая умная, что проверяет, что ей суют.
Кстати, попробуйте прилинковать свою ДЛЛ-ку статически и выгрузить её. И сообщите, получилось ли?
Юрий Зотов (2002-06-30 08:17:00) [9]> а дальше FreeLibrary.
К вопросу о ламерстве и загибании пальцев...
FreeLibrary - это НЕ физическая выгрузка DLL. Это всего лишь уведомление системе, что данный процесс в данной DLL более не нуждается. Система при этом декрементирует счетчик ссылок на эту DLL и, если он стал равен нулю, выгружает ее физически. Только при этом условии, не раньше.
Точно так же и LoadLibrary - это НЕ физическая загрузка DLL, а всего лишь запрос на ее использовании. Физически система загрузит ее лишь в том случае, если ее еще никто не использует (счетчик ссылок стал равным единице).
Это если говорить очень упрощенно, потому что на самом деле все намного сложнее (выделение физической памяти, проецирование на адресное пространство, подгрузка страниц и пр. - там целая кухня).
Но с kernel32 даже и это не прокатит. Потому что, если программа скажет, что kernel32 ей больше не нужна, а система вдруг ее сдуру послушает и снимет проекцию, то эта самая программа тут же и умрет. Первая. Потому что без kernel32 она работать просто не сможет. А система это прекрасно понимает, поскольку она совсем не такая идиотка, какой ее почему-то часто пытаются представить разные "масдайщики".
Вот такие пироги. Извините, но если человек вслух заявляет, что он не ламер, то базовые вещи ему положено знать и понимать.
mcs (2002-06-28 23:23:00) [10]Спасибо, вроде разобрался
Digitman (2002-06-27 18:26:00) [11]>v0id
Освобождение - чего ??
Ты понимаешь, что , кр.всего прочего и - в первую очередь, для любых разделяемых ресурсов ОС есть понятие "подсчет ссылок" ?
Игорь Шевченко (2002-06-27 18:11:00) [12]FreeLibrary находится в kernel32.dll, поэтому она и не выгружается. Из-под себя табуретку выбить не получится.
v0id (2002-06-27 18:06:00) [13]Digitman -> Выгрузка - освобождение. Я получаю хендл kernel32.dll с помощью GetModuleHandle, а дальше FreeLibrary. Потом смотрю в Process Explorer, но там kernel32 все еще подгружена.
easy (2002-06-27 17:57:00) [14]...я ламер...
Игорь Шевченко (2002-06-27 15:18:00) [15]v0id © (27.06.02 14:28)
Кто ламер - рассудит история :-)
Digitman (2002-06-27 15:07:00) [16]>v0id
И что же ты понимаешь под "выгрузкой" модуля ? Как это должно, по-твоему, "действовать" ?
v0id (2002-06-27 14:28:00) [17]... не действует - не выгружается.
v0id (2002-06-27 14:26:00) [18]Игорь Шевченко -> И кто там ламер? Ты у всех только спрашиваешь зачем это надо?? Однако, хороший помошник!
mcs -> Как это сделать? Запросто!
На форму брось ListBox и Button.
Пиши:
unit Unit1;
interface
uses
ImageHlp, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function EnumSymbols(SymbolName: PChar; SymbolAddress, SymbolSize: ULONG;
Strings: Pointer): Bool; stdcall;
begin
TStrings(Strings).Add(SymbolName);
Result := True;
end;
function GetImageFunctionList(const FileName: string; Strings: TStrings):
Boolean;
var
Handle: THandle;
hProcess: THandle;
VersionInfo: TOSVersionInfo;
begin
Strings.Clear;
Result := False;
SymSetOptions(SYMOPT_UNDNAME or SYMOPT_DEFERRED_LOADS);
VersionInfo.dwOSVersionInfoSize := SizeOf(VersionInfo);
if not GetVersionEx(VersionInfo) then Exit;
if VersionInfo.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS
then hProcess := GetCurrentProcessId
else hProcess := GetCurrentProcess;
if not SymInitialize(hProcess, nil, True) then Exit;
try
Handle := LoadLibrary(PChar(FileName));
if Handle = 0 then Exit;
try
if not SymLoadModule(hProcess, 0, PChar(FileName), nil, Handle, 0)
then Exit;
try
if not SymEnumerateSymbols(hProcess, Handle, EnumSymbols, Strings)
then Exit;
finally
SymUnloadModule(hProcess, Handle);
end;
finally
FreeLibrary(Handle);
end;
finally
SymCleanup(hProcess);
end;
Result := True;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if not GetImageFunctionList("kernel32.dll", ListBox1.Items) then
Messagebox(0,"Ошибочка вышла","",0);
end;
end.
Как выгрузить DLL? FreeLibrary! В качестве параметра используй GetModuleHandle("имя.dll");
Только почему-то на kernel32.dll у меня не действует.
Игорь Шевченко (2002-06-27 13:47:00) [19]Fellomena (27.06.02 12:21)
Дык, гланды тоже можно по-разному вырезать :-)))
Fellomena (2002-06-27 12:21:00) [20]2 Игорь Шевченко © (27.06.02 11:20):
Из своего процесса - можно. Из чужого - труднее, но тоже можно.
А что если в этот чужой процесс внедрить свою DLL и из неё выгрузить ту, что необходимо??? ;)