Сейчас на форуме: Rio, vsv1, site-pro (+7 невидимых)

 eXeL@B —› Софт, инструменты —› Посоветуйте ПО для определения адреса TLabel в чужом ПО
. 1 . 2 . >>
Посл.ответ Сообщение

Ранг: 1.8 (гость)
Активность: 0.010
Статус: Участник

Создано: 19 апреля 2014 17:53
· Личное сообщение · #1

Здравствуйте!
Посоветуйте инструмент (программу), которая позволит осуществить следующее:

В чужом ПО, написанном на Delphi, мне нужно получить текст метки. Я бы мог это сделать с помощью ReadProcessMemory, зная, что это TLabel и зная его смещение. Чем определить класс я уже нашел (но пока не определил, доступ к жертве в понедельник):
1) rtdoi (Run time Delphi / C++ Builder forms object inspector
2) Delphi Application Peeper
обе работают по принципу щелкнул мышью по контролу - получил инфу.

А нет ли такой программы, чтобы получить и адрес этого контрола ?
Желательно чтоб работала без инсталляции.

В принципе давно использую по мелочам WinHex версии 15.4. Может с помощью него это возможно ? Если да, то подскажите как. А то я с его помощью даже не смог найти в памяти приложения текст нужной метки.
Также, пробовал декомпилировать программу в DeDe - тоже не нашел.

Или может посоветуйте другие способы ?
Спасибо.



Ранг: 33.8 (посетитель), 38thx
Активность: 0.060
Статус: Участник

Создано: 19 апреля 2014 18:04
· Личное сообщение · #2

travnik, если нужно изменить текст - открывайте в любом редакторе ресурсов, например restorator и меняйте



Ранг: 1.8 (гость)
Активность: 0.010
Статус: Участник

Создано: 19 апреля 2014 18:10
· Личное сообщение · #3

dimka_newнет, мне нужно написать программу, которая будет следить за другой программой и оповещать сотрудников.
Кстати, искал с помощью Restorator 2007 ту злосчастную форму, на которой желанный лейбл, - не нашел.



Ранг: 33.8 (посетитель), 38thx
Активность: 0.060
Статус: Участник

Создано: 19 апреля 2014 18:13 · Поправил: dimka_new
· Личное сообщение · #4

То есть вы хотите отслеживать текст лабела и производить какие-то дейтвия ? Тогда курите FindWindow.
А вообще если имеется делфи под рукой, напишите программку с лабелом (желательно текст на английском и изучайте). Еще почитайте про AutoIt

В аттаче скрин с ресторатора - простая программа с одним лабелом.

1f44_19.04.2014_EXELAB.rU.tgz - label.jpg



Ранг: 1.8 (гость)
Активность: 0.010
Статус: Участник

Создано: 19 апреля 2014 18:24
· Личное сообщение · #5

В чужом ПО открывается форма, моя программа обнаруживает создание формы и должна прочитать текст метки на этой форме и оповестить пользователя.

Лейблы не имеют хендла, поэтому FindWindow их не найдет.

Тестовую программу для себя конечно сделал, и успешно читаю метки функцией ReadProcessMemory, зная его смещение (которое определил с помощью DeDe)



Ранг: 33.8 (посетитель), 38thx
Активность: 0.060
Статус: Участник

Создано: 19 апреля 2014 18:25 · Поправил: dimka_new
· Личное сообщение · #6

Попробуйте определить адрес утилитой InqSoft Window Scanner

Скрин для того, чтобы понять где искать



Ранг: 1.8 (гость)
Активность: 0.010
Статус: Участник

Создано: 19 апреля 2014 18:25 · Поправил: travnik
· Личное сообщение · #7

спасибо за совет, попробовал, тоже не видит метки, как и WinSpy.
в целом всё, что делают эти программы я и сам могу. даже начинал когда то подобную прогу писать

e9ed_19.04.2014_EXELAB.rU.tgz - wndcmd.png
а что это скрины как кощеево сердце заворачиваются ?



Ранг: 33.8 (посетитель), 38thx
Активность: 0.060
Статус: Участник

Создано: 19 апреля 2014 18:48 · Поправил: dimka_new
· Личное сообщение · #8

Приколы сервера, а для исследования программ на делфи лучше использовать - Interactive Delphi Reconstructor, темка где-то есть на форуме, dede уже устарел
Ну если прога не секретная можешь отправить в личку с описанием чего надо, попробую может чем помогу.

| Сообщение посчитали полезным: travnik

Ранг: 1.8 (гость)
Активность: 0.010
Статус: Участник

Создано: 19 апреля 2014 18:59
· Личное сообщение · #9

проги у меня нет. доступ будет только в понедельник и то через удаленный рабочий стол с позволения админа. копировать не разрешает, да и прога-монстр, ее не так просто запустить




Ранг: 52.0 (постоянный), 146thx
Активность: 0.030.08
Статус: Участник

Создано: 19 апреля 2014 19:17
· Личное сообщение · #10

Dephi/C++Builder не используют стандартный контрол для TLabel... сами прорисовывают на форме...



Ранг: 1.8 (гость)
Активность: 0.010
Статус: Участник

Создано: 19 апреля 2014 19:48 · Поправил: travnik
· Личное сообщение · #11

UniSoft
конечно, был бы Static не было бы вопросов.

dimka_new
спасибо за Interactive Delphi Reconstructor, действительно помощнее DeDe.
Теперь я вооружен, будем пробовать в понедельник



Ранг: 138.7 (ветеран), 135thx
Активность: 0.110
Статус: Участник

Создано: 19 апреля 2014 22:05
· Личное сообщение · #12

travnik пишет:
Лейблы не имеют хендла, поэтому FindWindow их не найдет.

Это вы зря,в виндах каждое окошко имеет хендл (а лейбл это тоже окошко) FindWindowEx поможет вам



Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

Создано: 19 апреля 2014 22:52
· Личное сообщение · #13

crc1 пишет:
а лейбл это тоже окошко

нет. посмотрите вцл. класс TLabel наследник по сути TGraphicControl, а не TWinControl



Ранг: 262.5 (наставник), 337thx
Активность: 0.340.25
Статус: Участник

Создано: 19 апреля 2014 23:05
· Личное сообщение · #14

crc1 пишет:
FindWindowEx поможет вам

Не поможет. Инфа сотка.

Мельком глянул под отладчиком где находится текст TLabel, при присваивании нового текста, адреса постоянно меняются, но в целом находятся в небольшой области, скорее всего где-то есть указатель на текущий адрес содержимого лэйбла, но искать лениво было)



Ранг: 1.8 (гость)
Активность: 0.010
Статус: Участник

Создано: 19 апреля 2014 23:39
· Личное сообщение · #15

TryAga1n пишет:
при присваивании нового текста, адреса постоянно меняются

TryAga1n пишет:
скорее всего где-то есть указатель на текущий адрес содержимого
всё верно



Ранг: 138.7 (ветеран), 135thx
Активность: 0.110
Статус: Участник

Создано: 20 апреля 2014 00:04
· Личное сообщение · #16

TryAga1n пишет:
Не поможет. Инфа сотка.

Не знаю что такое сотка, но лично мне FindWindowEx помогает



Ранг: 1.8 (гость)
Активность: 0.010
Статус: Участник

Создано: 20 апреля 2014 00:23 · Поправил: travnik
· Личное сообщение · #17

crc1 Это хорошо, что помогает, но вы заблуждаетесь. В делфи TLabel действительно графический контрол, при его создании не вызывается CreateWindow(Ex), RegisterClass(Ex) и соответственно не имеет хендла. Те лейблы, которые находит FindWindow(Ex) - это окна с классом Static (ну может еще какие-то есть).
А в TLabel в делфях просто рисуется функцией DrawText. Еще в VB вроде также.



Ранг: 262.5 (наставник), 337thx
Активность: 0.340.25
Статус: Участник

Создано: 20 апреля 2014 00:25
· Личное сообщение · #18

Как говорилось выше, тебе помогает со Static, а не TLabel.
Если же хочешь доказать обратное, выкладывай рабочий пример для приаттаченой проги.

По щелчку на форме текст меняется, если ты сможешь написать программу, которая получает текст лэйбла через FindWindowEx, то признаю себя идиотом

2c2b_20.04.2014_EXELAB.rU.tgz - Project1.exe



Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

Создано: 20 апреля 2014 00:27 · Поправил: tihiy_grom
· Личное сообщение · #19

crc1 пишет:
Не знаю что такое сотка, но лично мне FindWindowEx помогает

crc1, покажите ваш кодес, который найдет хэндл TLabel через FindWindowEx



Ранг: 1.8 (гость)
Активность: 0.010
Статус: Участник

Создано: 20 апреля 2014 00:35
· Личное сообщение · #20

tihiy_grom пишет:
TextOutA перехватывать
никогда
это как из пушки по воробьям. не хочу, чтобы мой хук стал причиной зависаний и падения программы



Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

Создано: 20 апреля 2014 01:18
· Личное сообщение · #21

travnik пишет:
это как из пушки по воробьям. не хочу, чтобы мой хук стал причиной зависаний и падения программы

Про TextOut я ошибся.
Сделайте тестовой приложение, в котором будет менять Caption у TLabel - и посмотрите в IDR что и как при этом происходит.
Ищите нужное место, инжектируйте туда свой код, который будет передавать строку вашему приложению - ничего сложного в этом нет



Ранг: 20.2 (новичок), 16thx
Активность: 0.020.01
Статус: Участник

Создано: 20 апреля 2014 13:03
· Личное сообщение · #22

Делюсь секретом.

Самый простой и надежный способ - выяснить версию Delphi, которой собран exe. Далее собрать dll в той же версии компилятора, заинжектить её в процесс и поставить хук на TCustomForm.Show

Одна и таже версия Delphi позволит без особых извратов общаться к RTTI, т.е. прямо в захуканной ф-ии можно привести передаваемые ук-ль к TForm, и через TForm.Components, перечислив все имеющиеся на ней контролы получить текст с TLabel.

Ну а далее либо по таймеру мониторить нужный Label, либо запомнить его хендл и хукать ф-ю, меняющую текст на нем, уже не помню, что там, SetControlText, кажется.



Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 20 апреля 2014 14:02
· Личное сообщение · #23

А может есть смысл не ловить смену текста TLabel, а просто поставить хук на функции в которых происходит смена текста?



Ранг: 1.8 (гость)
Активность: 0.010
Статус: Участник

Создано: 20 апреля 2014 15:05 · Поправил: travnik
· Личное сообщение · #24

GroundHog пишет:
Одна и таже версия Delphi позволит без особых извратов общаться к RTTI, т.е. прямо в захуканной ф-ии можно привести передаваемые ук-ль к TForm, и через TForm.Components, перечислив все имеющиеся на ней контролы получить текст с TLabel.

а сработает, если в этом ПО практически нет стандартных компонентов, даже вместо TForm какой-то специфичный наследник от TTntForm ?



Ранг: 33.8 (посетитель), 38thx
Активность: 0.060
Статус: Участник

Создано: 20 апреля 2014 15:54
· Личное сообщение · #25

travnik, а вы не трольте, а блин совета просите, и это инфы давайте побольше, иначе получается игра в одни ворота



Ранг: 20.2 (новичок), 16thx
Активность: 0.020.01
Статус: Участник

Создано: 20 апреля 2014 16:19
· Личное сообщение · #26

travnik пишет:
а сработает, если в этом ПО практически нет стандартных компонентов, даже вместо TForm какой-то специфичный наследник от TTntForm ?


TntForms.pas пишет:
TTntForm = class(TForm{TNT-ALLOW TForm})

Техника от этого не меняется, хендл компонета при показе формы всё равно получите, класс через Component.ClassName тоже. IDR поможет найти метод, который меняет текст на этом нестандартном контроле. Хук на метод + фильтр по хендлу = текст.

А вообще надо точнее ставить задачу, а то сначала Form, Label, а теперь оказывается unicode-компоненты TTntxxx



Ранг: 1.8 (гость)
Активность: 0.010
Статус: Участник

Создано: 20 апреля 2014 17:07
· Личное сообщение · #27

dimka_new пишет:
а вы не трольте


даже не думал. спросил серьезно, т.к. не очень разбираюсь.

GroundHog пишет:
А вообще надо точнее ставить задачу, а то сначала Form, Label, а теперь оказывается unicode-компоненты TTntxxx


Не сочтите за хамство…
Я вопрос поставил довольно точный в первом сообщении: получить адрес TLabel в чужом ПО
Про Form не говорил, но говорил и продолжаю говорить про TLabel, т.к. пока я работаю со своей тестовой жертвой.

В принципе частично разобрался, еще есть несколько вопросов:
IDR дал такой код:
Code:
  1. type
  2.   TJertvaForm = class(TForm)
  3.     Edit1:TEdit;//f2F8
  4.     Label1:TLabel;//f2FC
  5.     Edit2:TEdit;//f300
  6.     StaticText1:TStaticText;//f304
  7.     Label2:TLabel;//f308
  8.     Button1:TButton;//f30C
  9.   public
  10.     f310:String;//f310
  11.   end;

В комментариях, как я понимаю, относительные адреса, например //f2FC.
Но реально я нахожу все эти контролы по адресам $02FC и т.д., т.е. … 0 вместо F.
DeDe тоже дал $02FC. Не подскажите, почему в IDR f2FC ? На первый взгляд не существенно, но вдруг от Вас что важное узнаю



Ранг: 1.8 (гость)
Активность: 0.010
Статус: Участник

Создано: 20 апреля 2014 17:50 · Поправил: travnik
· Личное сообщение · #28

Еще вопрос, если позволите (их много впереди ).
С помощью WinHex ищу в памяти своей тестовой программки строку (текст метки). WinHex находит его в нескольких адресах. Можно ли определить какой из адресов относится к Label а какой просто мусор ?
Или еще упрощу вопрос:
код тестовой программки:
Code:
  1. var
  2.   Form1: TForm1;
  3.   S: String;
  4.  
  5. implementation
  6.  
  7. {$*.dfm}
  8.  
  9. procedure TForm1.FormCreate(Sender: TObject);
  10. begin
  11.   S := '51515151';
  12. end;

В памяти строка '51515151' находится по двум адресам (один адрес статичной строки, присваиваемой переменной S, а второй собственно адрес значения переменной S).
Как с помощью WinHex, глаз и рук (и небольшого кол-ва мозга) определить по какому адресу находится значение переменной S ?



Ранг: 20.2 (новичок), 16thx
Активность: 0.020.01
Статус: Участник

Создано: 20 апреля 2014 18:06
· Личное сообщение · #29

travnik
К сожалению, мы с Вами говорим на разных языках.
Вы пытаетесь найти статичное смещение в коде программы и читать из него значение Label.

Если это текстовое значение меняется(а скорее всего это так, иначе зачем получать его значение), то строка каждый раз будет выделяться динамически в памяти и полю объекта Text будет присваиваться адрес строки.

Могу ответить на конкретные вопросы по технике, что описал выше, но если она вам не понятна - в запросы.



Ранг: 1.8 (гость)
Активность: 0.010
Статус: Участник

Создано: 20 апреля 2014 18:13 · Поправил: travnik
· Личное сообщение · #30

GroundHog пишет:
К сожалению, мы с Вами говорим на разных языках.


да, к сожалению. Потому что адрес текста хоть и меняется, но неизменным остается адрес, в котором находится актуальный указатель на текст.

GroundHog пишет:
Вы пытаетесь найти статичное смещение в коде программы и читать из него значение Label.


И это мне удается, поверьте, ничего сложного


. 1 . 2 . >>
 eXeL@B —› Софт, инструменты —› Посоветуйте ПО для определения адреса TLabel в чужом ПО
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати