Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.046 c
4-1152879465
Acidlex
2006-07-14 16:17
2006.11.26
Эмуляция нажатия клавиш в чужом окне


15-1162630178
Loginov Dmitry
2006-11-04 11:49
2006.11.26
Задачка :)


2-1162896730
abba
2006-11-07 13:52
2006.11.26
Ошибкка при записи из одного файла в другой, используя тип. файлы


15-1163011293
Колдун
2006-11-08 21:41
2006.11.26
Проблемы экологии


2-1162811723
Khabibulin
2006-11-06 14:15
2006.11.26
Нарисовать треугольник в Pascal е





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский