![]() |
eXeL@B —› Основной форум —› Встраивание кода (вызов функций из собсвенной Dll) |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 01 октября 2007 20:38 · Личное сообщение · #1 Подскажите, как можно реализовать следущую вещь. Надо встроить вызов функии ReadFile, WriteFile (для чтения СОМ-порта) из длл1 проги. Думаю поместить эти функции и их обработку в собственную длл. Все бы ничего, но открытие СОМ-порта происходит в другой длл2. И хендла открытого СОМ-порта в ддл1 - нет. Как его поиметь из длл2? Надо передать этот хендл в свою длл. ![]() |
|
Создано: 01 октября 2007 20:48 · Поправил: SergX · Личное сообщение · #2 |
|
Создано: 01 октября 2007 20:57 · Личное сообщение · #3 |
|
Создано: 01 октября 2007 20:57 · Поправил: Halt · Личное сообщение · #4 |
|
Создано: 01 октября 2007 20:59 · Личное сообщение · #5 |
|
Создано: 01 октября 2007 21:01 · Личное сообщение · #6 Дцмал вначале в "Программирование" поместить, но тут же изменение кода уже работающей проги. Изменения повлекут за собой увеличение функциональности оной. 1. есть Main.dll 2. в нее встраиваем вызов фукции из своей dll. 3. в своей dll надо использовать ReadFile, WriteFile (для чтения СОМ-порта). 4. НО! Открытие СОМ-порта происходит в Serial.dll. Соответственно и хендл открытого СОМ-порта в Serial.dll остается. 5. Как передать этот хендл в функцию своей dll, если вызов функции надо осуществить из Main.dll??? Как еще объяснить? ![]() |
|
Создано: 01 октября 2007 21:07 · Личное сообщение · #7 |
|
Создано: 01 октября 2007 21:10 · Поправил: Halt · Личное сообщение · #8 как ты получаешь хендел сом порта в этой Serial.dll ?? вот и вбей в нее функцию function gethandleCOM:HWND; begin result:=h_COM; end; только повторюсь имхо понадобится менеждер памяти... да и получается через ![]() так или я туплю и ты хочешь присобавить свою dll к чужому процессу?? ![]() |
|
Создано: 01 октября 2007 21:11 · Личное сообщение · #9 |
|
Создано: 01 октября 2007 21:13 · Личное сообщение · #10 |
|
Создано: 01 октября 2007 22:25 · Личное сообщение · #11 voidshah пишет: 4. НО! Открытие СОМ-порта происходит в Serial.dll. Соответственно и хендл открытого СОМ-порта в Serial.dll остается. Ну так исследуй Serial.dll, найди где открывается твой COM-порт... путь 1: найди по какому смещению оно сохраняет хэндл, ну а потом из своей dll уже бери это значение путь 2: пропатч вызов ф-ии на свою, а в своей открывай, сохраняй хэндл куда тебе нужно и возвращай его и еще куча других путей, но никак не через реестр или файл... ![]() |
|
Создано: 02 октября 2007 16:19 · Личное сообщение · #12 |
|
Создано: 02 октября 2007 19:35 · Личное сообщение · #13 |
|
Создано: 02 октября 2007 20:59 · Личное сообщение · #14 |
|
Создано: 03 октября 2007 10:47 · Личное сообщение · #15 |
|
Создано: 03 октября 2007 11:49 · Поправил: Halt · Личное сообщение · #16 |
|
Создано: 03 октября 2007 12:07 · Личное сообщение · #17 |
|
Создано: 03 октября 2007 19:49 · Личное сообщение · #18 Halt пишет: а если loadlibrary нет тогда только iat Ее и не оказалось ![]() Может кто подскажет как правильно вызвать функцию с использованием IAT. Пробовал добавлять функцию в Serial.dll и с помощью Lord PE и CFF Explorer. Потом гружу Serial.dll в Ольку. Далее Ctr-N. Ищу название своей функции (GetCOMHandle). Смотрю ее адресс и вписываю ее вызов в Serial.dll как call dword ptr ds:[адресс]. Проблема в том, что в Ольке функцию сразу видно (загружена Serial.dll) 007C7C78 FF15 19207D00 CALL DWORD PTR DS:[<&Voice.GetCOMHandle>>; Voice.GetCOMHandle
Но при загрузке основного приложения этот вызов изменяется на "неизвестно куда" Что делаю не правильно??? ![]() |
|
Создано: 03 октября 2007 20:50 · Личное сообщение · #19 voidshah если та длл, в которую ты пишешь код с вызовом, не всегда грузится по одному и тому же адресу (а это стандартная ситуация), то нужно править релоки. что тебе мешает пропатчить DllMain основной длл, чтобы звать свою длл оттуда? отсутствие LoadLibrary не проблема, ведь есть GetModuleHandle к тому же ты можешь написать базонезависимый код для запуска своей длл, чтобы не морочиться с релоками потом можешь искать нужную ф-цию, сканя память ----- EnJoy! ![]() |
|
Создано: 03 октября 2007 23:16 · Личное сообщение · #20 Jupiter пишет: отсутствие LoadLibrary не проблема, ведь есть GetModuleHandle В том то и дело, что ее тоже нет ![]() Jupiter пишет: то нужно править релоки Как? Или ткните носом где написано. Jupiter пишет: к тому же ты можешь написать базонезависимый код для запуска своей длл, чтобы не морочиться с релоками потом можешь искать нужную ф-цию, сканя память А тут - я совсем темный лес ![]() ![]() ![]() ![]() |
|
Создано: 03 октября 2007 23:57 · Личное сообщение · #21 |
|
Создано: 04 октября 2007 00:10 · Поправил: Halt · Личное сообщение · #22 GetModuleHandle есть в экзешнике ![]() ![]() и вообще а не проще сделать загрузку длл из экзешника и вызов функции из этой длл которая скопирует нужный код в lkk которую тебе надо пропатчить.. а если ты хочешь захучить какието функции то тогда еще проще - грузи lkk из экзе.. в ней ставь хук (во только поставится ли) и при вызове из родной lkk нужной тебе функции будет вызываться твоя функция.. в общем лучше выложи... что-то какой то бред помоему начинается ![]() ![]() |
|
Создано: 04 октября 2007 21:17 · Личное сообщение · #23 Выкладываю: Софт для CDMA модема CCU-550 (есть на Украине такой оператор People.net) http://www.people.net.ua/f/devices/files/21/16.rar http://www.people.net.ua/f/devices/files/21/16.rar Проблема в том, что данный модем позиционируется только для передачи данных (не для звонков). Хотя звонить и говорить с него можно (есть разъем для подключения гарнитуры), что проверено на буржуйском софте. В "нашем" софте" выдает сообщение "Voice Call are not supported in Searching State". У буржуйского софта - свои косяки с интерфейсом (кнопки сползают, пропадают и т.п.). Вот и взялся препарировать "наш" софт. Проверка происходит в cmoMain.dll вот здесь: .text:1001E4BB call ds:??B?$CSimpleStringT@D$00@ATL@@QBEPBDXZ ; ATL::CSimpleStringT<char,1>::operator char const *(void)
Проверяется состояние сети. Модем постоянно сообщает о состоянии сети в СОМ-порт так: $$NCSQ 96,3,92,4 где первая цифра - сигнал 1х в dB, вторая - количество "палочек" 1x на индикаторе, третья - сигнал EV_DO в dB, четвертая - количество "палочек" EV-DO на индикаторе. В софте проверяется количество "палочек" 1x на индикаторе и если оно не 0, то происхоит переход и звонок. Так в буржуйском софте. В "нашем" же всегда 0. Глюк это или западло выяснить не удалось. Можно конечно сделать принудительный переход, но это "не честно" и ИМХО чревато глюками, если сеть пропадет. Версии буржуйского и "нашего" софта разные - посему подменить длл-ки не вышло. Родилась идея: 1. Заполучить хендл открытого СОМ-порта Происходит это в cmoSerial.dll здесь: .text:1000C1DC call ?TAPIOpen@CcmoSerialPort@@QAEHV?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTr aitsCRT@D@ATL@@@@@ATL@@H@Z ; CcmoSerialPort::TAPIOpen(ATL::CStringT<char,StrTraitMFC_DLL<char,ATL:: ChTraitsCRT<char>>>,int)
2. Перед проверкой в cmoMain.dll - вызвать свою dll. 3. В своей dll: - отключить постоянное сообщение модемом изменений сети - AT$$NCSQ=0 - послать команду AT$$NCSQ - и получить состояние сети. - включить постоянное сообщение модемом изменений сети - AT$$NCSQ=1,1 - вернуть состояние сети в cmoMain.dll или по состоянию сети определить - делать звонок или нет. Планировал вызвать свою длл в cmoSerial.dll сразу после call ?TAPIGetHandle и сохранить хендл. Потом вызвать свою длл в cmoMain.dll перед проверкой и провести необходимые мне действия. Вот все описал, как просили. ![]() |
|
Создано: 04 октября 2007 21:18 · Личное сообщение · #24 |
|
Создано: 04 октября 2007 21:19 · Личное сообщение · #25 |
|
Создано: 06 октября 2007 14:25 · Личное сообщение · #26 |
|
Создано: 08 октября 2007 08:34 · Поправил: Grom_ · Личное сообщение · #27 Вот те теория(как я понял те нуно вытащить хендл открытого соединения с СОМ-портом): 1) Спроецировать свою dll на пространство с чужой dll. 2) В своей dll создать глобальные! переменные ХЕНДЛА + флаг получения хендла. 3) Пропатчить чужую dll - типо: после вызова функции получения нужного ХЕНДЛА, а он в eax, поэтому mov [память под глобальный хендл в твоей dll], eax и взводим флаг mov [память под флаг в твоей dll],1. Адресное пространство у них(длл твоя и чужая) одно, так что должно быть без глюков. 4) работать с хендлом из своей dll с помощью функций. + проверка по флагу что хендл получен. вот только я не знаю как точно прицепиться к адресам переменных(в твоей dll), при каждом запуске возможно разное их расположение. ![]() Может и изврат, но все же ![]() ![]() |
|
Создано: 08 октября 2007 08:42 · Поправил: Grom_ · Личное сообщение · #28 |
|
Создано: 09 октября 2007 23:16 · Личное сообщение · #29 С базонезависимым кодом разобрался. Удалось получить базу в Dll EP. Дальше пропатчил все вызовы своей dll. Все работает кроме чтения/записи в СОМ-порт ![]() И ClearCommError, и PurgeComm работают. Если делаю вызов WriteFile(HCOM,Buff,12,BнеуыWritten,nil) (HCOM - тот самый хендл), то выдает ошибку ERROR_INVALID_PARAMETER. Я так понял, потому что СОМ-порт открывается с FILE_FLAG_OVERLAPPED. Изменил на WriteFile(HCOM,Buff,12,BWritten,@pOver) - выдает ошибку ERROR_INVALID_HANDLE. В чем проблема? Что неправильно? ![]() |
|
Создано: 09 октября 2007 23:28 · Личное сообщение · #30 Grom_ нахрен городить дополнительный флаг о получении хэндла, если для этих целей можно использовать сам хэндл? не ноль - значит получен. voidshah пишет: Изменил на WriteFile(HCOM,Buff,12,BWritten,@pOver) - выдает ошибку ERROR_INVALID_HANDLE. а структуру OVERLAPPED ты утянул у оригинальной проги? обрати внимание на hEvent структуры OVERLAPPED ! typedef struct _OVERLAPPED {
hEvent Handle to an event that will be set to the signaled state when the operation has been completed. The calling process must set this member either to zero or a valid event handle before calling any overlapped functions. ----- EnJoy! ![]() |
. 1 . 2 . >> |
![]() |
eXeL@B —› Основной форум —› Встраивание кода (вызов функций из собсвенной Dll) |