Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 19.03.2013, 13:04
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию Хук Com winApi

Кратко говоря, стараюсь реализовать следующую задачу: программа должна отлавливать сообщения, посылаемые ком портом в стороннее приложение и немного корректировать их, далее получать ответ от приложения, и тоже, корректируя их отправлять обратно на порт.

Проблема в следующем: приложение стороннее работает напрямую с портом, без сторонних драйверов, а значит написание драйвера не вариант, (или ошибаюсь?). номер ком-порта определен заранее - 4-й и изменить я этого для программы не смогу, получается не могу стать приложением работающим с 4-м портом, а ты программу связать с собой как с 6-м например. (хоть может и в этом не прав).

Я думаю, единственный выход, это ловить какие - то апишные функции в самой программе, и действовать на значения их аргументов. (правильно мыслю?)

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

Последний раз редактировалось reqyz, 19.03.2013 в 13:29.
Ответить с цитированием
  #2  
Старый 19.03.2013, 18:42
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
программа должна отлавливать сообщения, посылаемые ком портом
Печальная новость: порт сообщений не посылает. Он просто читает данные, приходящие по протоколу UART.
Цитата:
приложение стороннее работает напрямую с портом, без сторонних драйверов
Что, прям-таки напрямую, прям
Код:
mov dx, PORT
out dx, eax
? Молодцы ребята, взломали аппаратную защиту процессора.
Прежде, чем за такое браться, нужно представлять, как работает ввод-вывод. Что с 3 кольца НЕВОЗМОЖЕН ввод/вывод в порт напрямую (в нормальных системах), потому что это гарантирует моментальное убийство ОС любой программой, которая этого захотела. Работа все равно идет через драйвер, просто он системный. И написать драйвер для перехвата CreateFile/WriteFile/ReadFile можно. Только большой геморрой.
Цитата:
Я думаю, единственный выход, это ловить какие - то апишные функции в самой программе
В САМОЙ программе - можно. Для этого надо реверсить программу, найти, где она принимает, и сделать патч. Либо пропатчить программу руками (тяжело), либо сделать загрузчик, который запускает приложение, внедряет код каким-либо методом, в нужном месте ставит jmp/call на свой код и уже в самом приложении писать то, что нужно. Для этого надо владеть реверс-инженерингом и хорошо знать ассемблер, а также немного машинные коды.

Я бы делал методом стартера или внедрением DLL. Нашел бы в программе строку 'COM', 'COM4' или в этом роде, нашел ее использование и в дебаге отследил до чтения данных. Или же сразу в дебаге поставил бы бряк на CreateFileA и CreateFileW и жал F5, пока не увижу первым параметром в стеке нужную строку. Так же можно и с ReadFile поступить, если прога не насилует хард постоянными обращениями к файлам.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 19.03.2013 в 18:51.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
reqyz (20.03.2013)
  #3  
Старый 20.03.2013, 06:26
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию

сейчас постараюсь что то написать по новой инфе, тема не закрыта, буду неоднократно обращаться) спасибо за помощь)
Ответить с цитированием
  #4  
Старый 20.03.2013, 06:46
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию

думаю буду делать так:

1. встраиваем длл-кой код в чужой процесс на отлов функций
2. ловим функции приема передачи сообщений по ком порту(не знаю какие)
3. меняем их аргументы как необходимо

хочется верить что этого достаточно)
с первым пунктом справлюсь) во втором, какие мессаджы ловить?

буду рад любой адекватной помощи)
Ответить с цитированием
  #5  
Старый 20.03.2013, 21:52
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

1) Я бы все-таки нашел место в программе, которое можно безболезненно пропатчить, и вместо него вставил бы LoadLibrary; в DLLMain загружаемой библы поставил бы те действия, что стер из-за лоадлибрари.
2) Я ж уже написал: CreateFile, ReadFile, WriteFile, CloseHandle. Ввод-вывод в любое устройство все равно сводится к этим функциям, только обычно это обернуто в другие функции или компоненты. Бряк на CreateFileA, и ждешь, пока первым параметром не передадут строку 'COM4' или че-то в этом роде (например, '\\.\COM4\'). Потом смотрим, куда адрес возврата - получаем место, откуда ком-порт открывается. Его надо патчить, хотя бы чтобы сохранить хендл у себя (можно ессно попробовать нарыть глобальную переменную хендла, но если в проге юзалась какая-то обертка над ком-портом или много ООП - то задолбаться искать).
3) Менять аргументы не нужно. Вызовы ReadFile/WriteFile можно поменять на свои функции из DLL, описанные по соответствующему шаблону из МСДН:
Код:
int __stdcall newCreateFile(char *name, DWORD access, DWORD share, void *attrs, DWORD disp, DWORD flags, DWORD temp);
И все в таком духе.
Меняется код очень просто - если адрес функции в константе (call ds:CreateFileA), то меняем константу. Если относительный (конструкция вида call _CreateFileA | _CreateFileA: jmp ds:CreateFileA как любит делать студия) - то меняем прямо в опкоде адрес. Адрес вычисляется в этом случае относительный, то есть <адрес_новой_функции> - <адрес команды CALL + 5>. Менять проще всего динамически в DLLMain подгружаемой библиотеки (не забудь, что DLLMain должно вернуть НЕ НОЛЬ, иначе библа выгрузится). Разумеется, чтобы менять код, надо сделать VirtualProtect и снять с нужной страницы флаг READ_ONLY.
Сам код функций - любой, только в конце обязательно вызов оригинальной функции.
Пример:
Код:
int __stdcall newCreateFile(char *name, DWORD access, DWORD share, void *attrs, DWORD disp, DWORD flags, DWORD temp)
{
    FILE *f = fopen("log.txt", "a");
    fprintf(f, "File opened: %s", name);
    fclose(f);
    CreateFileA(name, access, share, attrs, disp, flags, temp);
}
Так можно снимать лог открытых файлов/портов из конкретного места кода. Также можно мониторить и менять при необходимости гоняемые туда-сюда данные через порт, поменяв ReadFile.

Вообще, без патча CreateFile можно обойтись, если работа с портом идет из отдельного места, а не через общий интерфейс для файлов и порта. Тогда можно пропатчить конкретный вызов ReadFile и юзать хендл, приходящий туда. Однако в общем случае может понадобиться сохранение хендла порта.

ЗЫЖ: есть еще один наркоманский вариант, который я один раз использовал - проходиться по стеку вызовов ReadFile вверх на какой-то уровень, и если там определенный адрес, то подменять, иначе вызывать стандартный ReadFile. Вылезал так на 3 функции вверх, обходил STL-ные операции с файлами.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 21.03.2013 в 00:33.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
reqyz (21.03.2013)
  #6  
Старый 21.03.2013, 12:20
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

При работе с Com - портом могут использоваться все эти функции, которые описаны здесь
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
Ответить с цитированием
Этот пользователь сказал Спасибо icWasya за это полезное сообщение:
reqyz (21.03.2013)
  #7  
Старый 21.03.2013, 15:29
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию

сегодня переначну алгоритм) по мере появления вопросов буду обращаться) спасибо)
Ответить с цитированием
  #8  
Старый 21.03.2013, 15:29
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Мне приходит в голову поменять нафиг COM4 на какой-нить COM9 (через патч/загрузчик), и заюзать программу для виртуализации ком-портов. В итоге получаем схему вида:
COM4 (реальный девайс) <-> Наша программка, обрабатывающая команды <-> Виртуальный ком-порт <-> Драйвер виртуального ком-порта <-> Ещё один виртуальный ком-порт <-> Основная программа (пропатченная)
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #9  
Старый 21.03.2013, 22:20
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Виртуальный порт еще найти надо, и приаттачиться к драйверу виртуального порта программой. Тоже тот еще гемор.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #10  
Старый 21.03.2013, 23:55
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

а если так:
истинный СОМ4 (на машине) меняем на какой-нить другой СОМ, используем нуль-СОМ эмулятор, например такой, где выставляем один порт СОМ4, другой порт - другой СОМ на котором уже будет висеть своя программа и получать от испытуемой необходимые данные, править их и отправлять в железо, от железа также править и отправлять обратно в испытуемую программу, вернее в порт на котором она висит, а нуль-СОМ эмулятор уже будет подавать в испытуемую программу...
__________________
Понять, что хочет заказчик - бесценно, ведь он платит MasterCard
Ответить с цитированием
  #11  
Старый 22.03.2013, 00:00
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Нужно БОЛЬШЕ ком-портов...
Можно. Так в чем-то проще. Для человека, плохо знающего асм и машкод - сильно проще. Хотя если прога будет работать не только у того, кто ее писал - я бы сделал патчем. Потому что с этими виртуальными ком-портами - как повезет. Я месяц пытался у знакомого настроить виртуальный порт. У меня все встало на комп без проблем, а там - хоть убейся, ничего не выходит.
А когда я делаю патч - я знаю, что оно будет работать всегда и везде.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 22.03.2013 в 00:04.
Ответить с цитированием
  #12  
Старый 22.03.2013, 10:25
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

ТС если так хорошо знаешь протокол обмена что налету готов корректировать, не проще написть свою прогу и делать что хочешь?
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #13  
Старый 24.03.2013, 16:07
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию

У меня всё окей) перехват реализовал вплоть до изменения, через отлов реад и врайт файла) если кому понадобится пример исходника, скину)
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:48.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter