Форум: "WinAPI";
Текущий архив: 2006.11.26;
Скачать: [xml.tar.bz2];
ВнизЭкспорт информации из другой программы. Найти похожие ветки
← →
DanilinS (2006-07-07 08:39) [0]Нужна помощь. Есть программа стороннего производителя. На Delphi написана. Есть ряд данных, которые необходимо вытащить из программы. Все интересующие данные хранятся - в TVirtualStringTree.
Дескриптор этого обьекта получить не проблемма. Указатель на процесс - то-же легко.
Как забрать эти данные?
Есть правда одна статейка http://forex.kbpauk.ru/showflat.php/Cat/0/Number/91439/Main/82830 но там более простой обьект ....
← →
DanilinS (2006-07-07 16:03) [1]Идея такова:
при помощи ReadProcessMemory я могу вытащить всю необходимую информацию, но мне надо знать, по какому адресу этот компонент сидит в адресном пространстве. :-(
Кто знает, как по Handle визуального обьекта выйти на сам обьект в памяти?
← →
Сергей М. © (2006-07-10 11:36) [2]
> по какому адресу этот компонент сидит в адресном пространстве
Предположим, этот адрес ты получил.
Что дальше ?
Где, по-твоему, располагается та самая "необходимая информация" относительно полученного адреса расположения экземпляра объекта класса TVirtualStringTree ?
← →
DanilinS (2006-07-11 08:45) [3]Пишешь простенькую программу с этим компонентом и определяешь, структуру и адреса хранения нужных данных. А потом по аналогии смотреть в чужом процессе. На 90 % внутри компонента инфа храниться по этому смещению. Единственная тонкость - элементы компонента, создаваемые динамически в динамической памяти. Надо искать указатели на эти компоненты.
← →
atruhin © (2006-07-11 09:23) [4]Не получится. Во первых у VST необходимые свойства не опубликованы, напрмиер GetNodeData. Т.е. вызвать их не получится. Во вторых данные в VST хранятся в произвольных местах, то есть в VST может хранится например индекс массива в котором зранятся данные, или номер записи БД. VST ничего не знает о данных и их месторасположении.
← →
Сергей М. © (2006-07-11 10:04) [5]
> DanilinS (11.07.06 08:45) [3]
cм. [4]
+ программа стороннего производителя не обязана быть построена в той же версии Делфи, на которой ты собрался писать "простенькую программу с этим компонентом". Это означает, что предполагаемые тобой "смещения" не обязаны быть точно такими же.
← →
DanilinS (2006-07-11 10:49) [6]Версию я могу определить точно. ( D7 - :-) ) Что интересно, декомпилятор DeDe легко «потрошит» EXE-шник, восстанавливая информацию о модулях, объектах и классах. И их методах. Вплоть до названий. Значит информация о объектах где-то есть.
← →
Сергей М. © (2006-07-11 11:35) [7]
> DanilinS (11.07.06 10:49) [6]
DeDe - довольно серьезный продукт. Это отнюдь не "простенькая программа".
DeDe "умеет" распознавать несколько версий Делфи, для каждой конкретной версии DeDe работает с RTTI индивидуальным образом.
← →
DanilinS (2006-07-11 13:16) [8]А почему при P:=GetWindowLong( h, GWL_WNDPROC); к чужому окну получаю ошибку 5 (отказано в доступе) ?
← →
Сергей М. © (2006-07-11 13:42) [9]
> DanilinS (11.07.06 13:16) [8]
Врешь.
Не может быть такой ошибки.
← →
DanilinS (2006-07-11 15:42) [10]В общих чертах:
по моей тест-проге данные моего TVirtualStringTree лежат в оперативке по адресу начиная с $A23D74.
Там всё что нужно.
($A23D74) +$230 - NodeDataSize
($A23D74) +$2F8 - RootNodeCount
и т.д.
Вот как - бы найти этот адрес в той проге, откуда дернуть данные хочу ....
← →
Сергей М. © (2006-07-11 15:51) [11]"Та прога" как минимум должна быть собрана точно в той же версии, что и твоя "тест-прога".
← →
DanilinS (2006-07-11 16:42) [12]
> Врешь.
> Не может быть такой ошибки.
простенькая прога:
procedure TForm1.Timer1Timer(Sender: TObject);
var
h:THandle;
MousePos:TPoint;
Text: array [0..256] of Char;
CB: longint;
begin
GetCursorPos(MousePos);
h:=WindowFromPoint(MousePos);
Label1.Caption:=IntToStr(h);
GetWindowText(h, text, 200);
Label3.Caption:= text;
GetClassName(h,text,255);
Label6.Caption:= text;
CB:=GetWindowLong(h, GWL_WNDPROC);
Label7.Caption:=IntToStr(CB);
end;
Везде CP = 0 кроме окна самой проги. Если при CP = 0 вызвать GetLastError то он возвращает 5
← →
Сергей М. © (2006-07-11 16:48) [13]И с какова цель получения тобой адреса оконной процедуры ?
Он актуален в АП только того процесса, в контексте которого интересующее окно было создано.
← →
GrayFace © (2006-07-14 12:25) [14]А TVirtualStringTree - это откуда? У меня его не наблюдается.
DanilinS (07.07.06 16:03) [1]
Кто знает, как по Handle визуального обьекта выйти на сам обьект в памяти?
Возьми код из FindVCLWindow, из инициализации модуля Classes - там создаются 2 атома, ипользуй тот, который не зависит от hInstance. Создавай аналогично атом, только с ProcessId того процесса. Все это лучше делать, внедрившись в сабжевый процесс - просто работать с компонентом, как со своим.
atruhin © (11.07.06 9:23) [4]
Во первых у VST необходимые свойства не опубликованы, напрмиер GetNodeData.
Если они в protected, то создать пустого наследника и привести к нему.
DanilinS (11.07.06 13:16) [8]
А почему при P:=GetWindowLong( h, GWL_WNDPROC); к чужому окну получаю ошибку 5 (отказано в доступе) ?
Очевидно, защита от дурака - чтобы люди, привыкшие к Win3.1 и те кто не знает об адресных пр-вах задумались. Да и для работы ни о чем не подозревающих программ 3.1 нужно. Надо внедряться.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.11.26;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.042 c