Главная страница
    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.042 c
3-1158748245
Alek_1
2006-09-20 14:30
2006.11.26
Вопрос по безопасности..


2-1162886946
konstr
2006-11-07 11:09
2006.11.26
Blob и SQL


2-1162963780
Marat
2006-11-08 08:29
2006.11.26
Нужна помощь


11-1139326023
shalex
2006-02-07 18:27
2006.11.26
Выложите synapse


3-1159116348
AngeL B.
2006-09-24 20:45
2006.11.26
Как изменить запрос, чтобы получить кол-во строк?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский