Сейчас на форуме: zds, _MBK_ (+5 невидимых)

 eXeL@B —› Основной форум —› Встраивание кода (вызов функций из собсвенной Dll)
. 1 . 2 . >>
Посл.ответ Сообщение

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

Создано: 01 октября 2007 20:38
· Личное сообщение · #1

Подскажите, как можно реализовать следущую вещь.
Надо встроить вызов функии ReadFile, WriteFile (для чтения СОМ-порта) из длл1 проги. Думаю поместить эти функции и их обработку в собственную длл. Все бы ничего, но открытие СОМ-порта происходит в другой длл2. И хендла открытого СОМ-порта в ддл1 - нет. Как его поиметь из длл2? Надо передать этот хендл в свою длл.



Ранг: 226.0 (наставник), 67thx
Активность: 0.160
Статус: Участник

Создано: 01 октября 2007 20:48 · Поправил: SergX
· Личное сообщение · #2

voidshah пишет:
Надо встроить вызов функии

куда тебе их надо встроить ?

Ну ты намудрил

Толи я туго доганяю...

Почему эта тема в основном форуме ?




Ранг: 247.7 (наставник), 3thx
Активность: 0.160
Статус: Участник
Халявщик

Создано: 01 октября 2007 20:57
· Личное сообщение · #3

я тоже чето не вкурил, нормально объясни

-----
Лень - это подсознательная мудрость




Ранг: 65.7 (постоянный)
Активность: 0.050
Статус: Участник

Создано: 01 октября 2007 20:57 · Поправил: Halt
· Личное сообщение · #4

ну а в чем проблема?? пиши в длл2 которая с портами работает функцию на возврат хендела порта из длл ее вызывай и юзай.. вот только по-моему надо будет юзать менеджер памяти если на делфях (типа FastShareMem)




Ранг: 247.7 (наставник), 3thx
Активность: 0.160
Статус: Участник
Халявщик

Создано: 01 октября 2007 20:59
· Личное сообщение · #5

depler Создано: 1 октября 2007 20:57:39 New!
Halt Создано: 1 октября 2007 20:57:41 New!


а вам слабо на две секунды раньше написать?

-----
Лень - это подсознательная мудрость




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

Создано: 01 октября 2007 21:01
· Личное сообщение · #6

Дцмал вначале в "Программирование" поместить, но тут же изменение кода уже работающей проги. Изменения повлекут за собой увеличение функциональности оной.
1. есть Main.dll
2. в нее встраиваем вызов фукции из своей dll.
3. в своей dll надо использовать ReadFile, WriteFile (для чтения СОМ-порта).
4. НО! Открытие СОМ-порта происходит в Serial.dll. Соответственно и хендл открытого СОМ-порта в Serial.dll остается.
5. Как передать этот хендл в функцию своей dll, если вызов функции надо осуществить из Main.dll???

Как еще объяснить?




Ранг: 247.7 (наставник), 3thx
Активность: 0.160
Статус: Участник
Халявщик

Создано: 01 октября 2007 21:07
· Личное сообщение · #7

voidshah

Попробуй так:
пропатч serial.dll так чтобы она например в реестр сохраняла хэндл при открытии компорта., а из свой dll считывай это хэндл, как только ее вызовут из main.dll

-----
Лень - это подсознательная мудрость




Ранг: 65.7 (постоянный)
Активность: 0.050
Статус: Участник

Создано: 01 октября 2007 21:10 · Поправил: Halt
· Личное сообщение · #8

как ты получаешь хендел сом порта в этой Serial.dll ??
вот и вбей в нее функцию

function gethandleCOM:HWND;
begin
result:=h_COM;
end;

только повторюсь имхо понадобится менеждер памяти... да и получается через может лучше unit дополнительный подключить?? чем другую dll ваять??

так или я туплю и ты хочешь присобавить свою dll к чужому процессу??



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

Создано: 01 октября 2007 21:11
· Личное сообщение · #9

Спасибо! Попробую. Так же можно и в созданный файл хендл сохранить. Так?



Ранг: 65.7 (постоянный)
Активность: 0.050
Статус: Участник

Создано: 01 октября 2007 21:13
· Личное сообщение · #10

да по идее можно вроде ... вот только это совсем через ж получается ))



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

Создано: 01 октября 2007 22:25
· Личное сообщение · #11

voidshah пишет:
4. НО! Открытие СОМ-порта происходит в Serial.dll. Соответственно и хендл открытого СОМ-порта в Serial.dll остается.

Ну так исследуй Serial.dll, найди где открывается твой COM-порт...
путь 1: найди по какому смещению оно сохраняет хэндл, ну а потом из своей dll уже бери это значение
путь 2: пропатч вызов ф-ии на свою, а в своей открывай, сохраняй хэндл куда тебе нужно и возвращай его
и еще куча других путей, но никак не через реестр или файл...



Ранг: 226.0 (наставник), 67thx
Активность: 0.160
Статус: Участник

Создано: 02 октября 2007 16:19
· Личное сообщение · #12

voidshah
Как успехи ?



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

Создано: 02 октября 2007 19:35
· Личное сообщение · #13

Да пока никак
Правильно вызов функции из своей длл не могу сделать
В ITA свою длл внес. А как правильно call сделать, пока не понял. Буду разбираться. Тут недостаток знаний сказывается.



Ранг: 226.0 (наставник), 67thx
Активность: 0.160
Статус: Участник

Создано: 02 октября 2007 20:59
· Личное сообщение · #14

Если прогу выложишь, может скорее кто поможет...



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

Создано: 03 октября 2007 10:47
· Личное сообщение · #15

voidshah пишет:
В ITA свою длл внес.

ты наверно про IAT?


voidshah пишет:
А как правильно call сделать, пока не понял. Буду разбираться. Тут недостаток знаний сказывается.

смотря какого вида ф-ия, stdcall, cdecl и т.д.



Ранг: 65.7 (постоянный)
Активность: 0.050
Статус: Участник

Создано: 03 октября 2007 11:49 · Поправил: Halt
· Личное сообщение · #16

вноси не в iat а делай вызов loadlibrary - если конечно такая функция экспортируется потом getrpocaddress с названием твоей фукции ну а потом call eax

а если loadlibrary нет тогда только iat (хотя может есть и др способы но я не в курсе)



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

Создано: 03 октября 2007 12:07
· Личное сообщение · #17

drin
Конечно IAT - очепятка вышла.
Сама модифицируемя длл - насипана на VC 7.1 с MFC.
Своя длл на Дельфях. Делаю ее описание как stdcall.
Но думаю тут какаято запара с IAT. Неправильно адрес вызова подставляется.
Halt
Спасибо. Я уже решил так и делать. Попробую через loadlibrary.



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

Создано: 03 октября 2007 19:49
· Личное сообщение · #18

Halt пишет:
а если loadlibrary нет тогда только iat


Ее и не оказалось - остается 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

Но при загрузке основного приложения этот вызов изменяется на "неизвестно куда"
Что делаю не правильно???




Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 03 октября 2007 20:50
· Личное сообщение · #19

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

-----
EnJoy!




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

Создано: 03 октября 2007 23:16
· Личное сообщение · #20

Jupiter пишет:
отсутствие LoadLibrary не проблема, ведь есть GetModuleHandle

В том то и дело, что ее тоже нет
Jupiter пишет:
то нужно править релоки

Как? Или ткните носом где написано.
Jupiter пишет:
к тому же ты можешь написать базонезависимый код для запуска своей длл, чтобы не морочиться с релоками
потом можешь искать нужную ф-цию, сканя память

А тут - я совсем темный лес




Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 03 октября 2007 23:57
· Личное сообщение · #21

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

-----
EnJoy!




Ранг: 65.7 (постоянный)
Активность: 0.050
Статус: Участник

Создано: 04 октября 2007 00:10 · Поправил: Halt
· Личное сообщение · #22

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



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

Создано: 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)
.text:1001E4C1 push eax ; char *
.text:1001E4C2 call ds:atoi
.text:1001E4C8 add esp, 4
.text:1001E4CB test eax, eax
.text:1001E4CD jnz short loc_1001E4E3 <------

Проверяется состояние сети. Модем постоянно сообщает о состоянии сети в СОМ-порт так:
$$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)
.text:1000C1E1 cmp eax, ebx
.text:1000C1E3 jz short loc_1000C219
.text:1000C1E5 push 3E8h ; dwMilliseconds
.text:1000C1EA call ds:Sleep
.text:1000C1F0 lea edx, [esp+0C4h+VersionInformation]
.text:1000C1F4 push edx ; int
.text:1000C1F5 push offset szDeviceClass ; "comm/datamodem"
.text:1000C1FA mov ecx, esi
.text:1000C1FC call ?TAPIGetHandle@CcmoSerialPort@@QAEPAXPBDPAJ@Z ; CcmoSerialPort::TAPIGetHandle(char const *,long *)
.text:1000C201 mov [esi+1ABCh], eax

2. Перед проверкой в cmoMain.dll - вызвать свою dll.
3. В своей dll:
- отключить постоянное сообщение модемом изменений сети - AT$$NCSQ=0
- послать команду AT$$NCSQ - и получить состояние сети.
- включить постоянное сообщение модемом изменений сети - AT$$NCSQ=1,1
- вернуть состояние сети в cmoMain.dll или по состоянию сети определить - делать звонок или нет.

Планировал вызвать свою длл в cmoSerial.dll сразу после call ?TAPIGetHandle и сохранить хендл.
Потом вызвать свою длл в cmoMain.dll перед проверкой и провести необходимые мне действия.

Вот все описал, как просили.



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

Создано: 04 октября 2007 21:18
· Личное сообщение · #24

Приложу еще отдельно cmoMain.dll

7cf3_04.10.2007_CRACKLAB.rU.tgz - cmoMain.dll



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

Создано: 04 октября 2007 21:19
· Личное сообщение · #25

И cmoSerial.dll

2c8f_04.10.2007_CRACKLAB.rU.tgz - cmoSerial.dll



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

Создано: 06 октября 2007 14:25
· Личное сообщение · #26

Все молчат...
Подскажите хоть как править релоки и про базонезависимый код...



Ранг: 29.8 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 08 октября 2007 08:34 · Поправил: Grom_
· Личное сообщение · #27

Вот те теория(как я понял те нуно вытащить хендл открытого соединения с СОМ-портом):
1) Спроецировать свою dll на пространство с чужой dll.
2) В своей dll создать глобальные! переменные ХЕНДЛА + флаг получения хендла.
3) Пропатчить чужую dll - типо: после вызова функции получения нужного ХЕНДЛА, а он в eax, поэтому mov [память под глобальный хендл в твоей dll], eax и взводим флаг mov [память под флаг в твоей dll],1.
Адресное пространство у них(длл твоя и чужая) одно, так что должно быть без глюков.
4) работать с хендлом из своей dll с помощью функций.
+ проверка по флагу что хендл получен.

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

Может и изврат, но все же



Ранг: 29.8 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 08 октября 2007 08:42 · Поправил: Grom_
· Личное сообщение · #28

главное не нарваться на конфликт - одновременное чтение/запись в переменной флага



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

Создано: 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.

В чем проблема? Что неправильно?




Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 09 октября 2007 23:28
· Личное сообщение · #30

Grom_
нахрен городить дополнительный флаг о получении хэндла, если для этих целей можно использовать сам хэндл? не ноль - значит получен.

voidshah пишет:
Изменил на WriteFile(HCOM,Buff,12,BWritten,@pOver) - выдает ошибку ERROR_INVALID_HANDLE.

а структуру OVERLAPPED ты утянул у оригинальной проги?
обрати внимание на hEvent структуры OVERLAPPED !

typedef struct _OVERLAPPED {
ULONG_PTR Internal;
ULONG_PTR InternalHigh;
union {
struct {
DWORD Offset;
DWORD OffsetHigh;
};
PVOID Pointer;
};
HANDLE hEvent;
} OVERLAPPED, *LPOVERLAPPED;


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)
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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