![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать все методы имеющиеся в объекте OleVariant ? [D7, XP]
Той © (2015-08-19 19:42:00)Добрый вечер! Имеется:
Var Obj: OleVariant;
.....
Obj.SomeProc();
.....
Есть ли какой-то способ получить список всех доступных у Obj методов?
ухты (2015-08-28 17:06:00) [1]алес капут :)
Той (2015-08-28 16:18:00) [2]Брутфорс длится жутко долго. Можно ли как-то распараллелить на несколько компов (так чтоб и без пропусков и без повторов)?
А то от 1 до 6 символов дождался, а 7 всё считается и считается. Что же дальше будет...
var
Disp: IDispatch;
const
GUID_NULL: TGUID = (D1: 0; D2: 0; D3: 0; D4: (0, 0, 0, 0, 0, 0, 0, 0));
Letters: array [0..36] Of Char = (
'_','1','2','3','4','5','6','7','8','9','0',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t', 'u','v','w','x','y','z'
);
function MethodExists(MethodName: String): BooLean;
var Ret: HResult; NameCount: Integer; WideNames: array [0..0] Of WideString; DispIDs: array [0..0] Of Integer;
begin
Result:=False;
NameCount:=1;
WideNames[0]:=WideString(MethodName);
Ret:=Disp.GetIDsOfNames(GUID_NULL, @WideNames, NameCount, LOCALE_SYSTEM_DEFAULT, @DispIDs);
if Ret=S_OK then
Result:=True;
end;
procedure Brutforce(Prev: String; Depth: Integer);
var i: Integer;
begin
if Depth=0 then
begin
if MethodExists(Prev) then
begin
Form1.Memo1.Lines.Add(Prev);
Form1.Memo1.Lines.SaveToFile('MethodExists.~txt');
end;
end
else
for i:=Low(Letters) to High(Letters) do
Brutforce(Prev+Letters[i], Depth-1);
end;
procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
begin
Application.Minimize;
Application.ProcessMessages;
Disp:=IDispatch(Enj.GetOleObject());
Memo1.Text:='';
for i:=1 to 4 do // 20 do
begin
Memo1.Lines.Add('-----------------'#9+IntToStr(i)+#9'-----------------');
Brutforce('', i);
Memo1.Lines.Add('-----------------'#9'DONE'#9'-----------------');
Memo1.Lines.SaveToFile('MethodExists.txt');
end;
Application.Restore;
Application.ProcessMessages;
ShowMessage('Done!');
end;
Той (2015-08-22 23:04:00) [3]Разумеется я читал справку.
Получить Names через функцию GetIDsOfNames нельзя.
Эта функция получает [in] Name и возвращает [out] идентификатор (число).
А мне-то надо наоборот!
Inovet (2015-08-22 02:50:00) [4]> [19] Той (22.08.15 02:16)
> А мне нафик не нужны IDs, мне нужны Names.
Ты справку-то читал?
https://msdn.microsoft.com/en-us/library/windows/desktop/ms221306%28v=vs.85%29.aspx
ну и вообще
https://msdn.microsoft.com/en-us/library/windows/desktop/hh309494%28v=vs.85%29.aspx
Той (2015-08-22 02:16:00) [5]> IDispatch распологает методами для получения информации о составе объекта?
Нет, не располагает. Там только GetIDsOfNames. А мне нафик не нужны IDs, мне нужны Names.
> Если там библиотеки нет - то остаётся только гадать
Так библиотеки как раз видимо нету. И инструкций нету.
icWasya (2015-08-21 21:27:00) [6]"как это узнаёт импорт" - когда в DLL или EXE находится библиотека типов, то при импорте делается раскодирование этой библиотеки и превращения её в текст на нужном языке программирования. Если там библиотеки нет - то остаётся только гадать(никак не получается - читай инструкцию)
Palladin (2015-08-21 16:56:00) [7]те че не понятно то? IDispatch распологает методами для получения информации о составе объекта? это давно тебе сказали. какие еще вопросы?
Той (2015-08-20 21:45:00) [8]Это важно? Внешняя функция с недоступными исходниками возвращает мне OleVariant.
Запустил брутфорс.
ухты (2015-08-20 20:47:00) [9]
> Есть переменная типа OleVariant, в которой неизвестный СОМ-
> объект.
откуда он пришел, если не известен?
Той (2015-08-20 20:08:00) [10]Как? Брутфорсить через GetIDsOfNames()? Ну ладно, я думал проще как-то можно...
кгшзх (2015-08-20 19:55:00) [11]Мне всё равно как узнать методы.
Узнавай как сказали выше и не тереби никому мозги.
Той (2015-08-20 19:53:00) [12]Есть переменная типа OleVariant, в которой неизвестный СОМ-объект. Справки и другой информации по нему нету.
Известны только 8 методов. Ещё 2 я угадал по аналогии. Мне нужно как-то узнать список хотя бы методов.
Если есть информация "как это узнаёт импорт" - то мне пригодится. Если знать как он узнаёт - то и я смогу узнать так же, нет?
кгшзх (2015-08-20 17:40:00) [13]сначала хотел узнать "как узнать"
теперь хочешь узнать "как он узнает"
он узнает, потому что сом технология так спроектирована чтобы и он узнал и она тоже.
Той (2015-08-20 17:10:00) [14]Какой вопрос? Мне всё равно как узнать методы. Хоть рантайм, хоть из справки. Просто хочу знать чем могу пользоваться. Справки мне не давали.
Там куча всякого, а нужного видимо нету. А как тогда этот "импорт" всё узнаёт?
кгшзх (2015-08-20 08:23:00) [15]кроме методов самих, есть еще параметры, про которые идиспатч тебе ничего не скажет.
поэтому проджект->импорт тайп лабрари->выбор->креате юнит.
и вот в нем уже смотртеть и методы и параметры и свойства
ухты (2015-08-20 02:19:00) [16]про СОМ и гуглить, про что еще то? а лучше справку открыть про СОМ почитать, так проще и быстрее
только вопрос, про куку, из [6], все равно остается
Той (2015-08-20 01:09:00) [17]Игорь Шевченко, да, оно потомок IDispatch, проверил. Только что же вы предлагаете? :)
Насколько я понял GetIDsOfNames только проверяет есть ли такой метод, но не даёт списка, не?
Отбрутфорсить что ли?
кгшзх, как это сделать? Я ж даже не знаю точно что за интерфейс там.
COM только начал изучать, да и то срочно по необходимости. Что мне погуглить?
кгшзх (2015-08-19 22:21:00) [18]можно ли программно "спросить" Obj какие методы в нём имеются?
ну узнаешь ты на рантайме что есть там метод "куку"
что дальше?
завершаем программу и переписываем с вызовом узнанного метода.
то же самое будет если сразу импортировать библиотеку типов, создав тлб модуль.
и будет тебе и позднее и ранее связывание и полный список.
Игорь Шевченко (2015-08-19 21:21:00) [19]
IDispatch = class(IUnknown)
public
function GetTypeInfoCount(var ctinfo: Integer): HResult; virtual; stdcall; abstract;
function GetTypeInfo(itinfo: Integer; lcid: TLCID; var tinfo: ITypeInfo): HResult; virtual; stdcall; abstract;
function GetIDsOfNames(const iid: TIID; rgszNames: POleStrList;
cNames: Integer; lcid: TLCID; rgdispid: PDispIDList): HResult; virtual; stdcall; abstract;
function Invoke(dispIDMember: TDispID; const iid: TIID; lcid: TLCID;
flags: Word; var dispParams: TDispParams; varResult: PVariant;
excepInfo: PExcepInfo; argErr: PInteger): HResult; virtual; stdcall; abstract;
end;
Той (2015-08-19 21:09:00) [20]Могу вызвать наугад Obj.ololo(); и оно ругается что мол нету такого метода. Вот и думаю - может быть можно как-то запросить список имеющихся?