Сейчас на форуме: ut2004, vsv1 (+8 невидимых)

 eXeL@B —› Вопросы новичков —› Изменение протокола обмена по последовательному порту RS-232 в программе
Посл.ответ Сообщение

Ранг: 1.1 (гость)
Активность: 0=0
Статус: Участник

Создано: 01 августа 2006 02:17 · Поправил: disasm
· Личное сообщение · #1

Привет всем!
Помогите в следующей проблеме.

Есть программа для взешивания авто, работает с измерительными весами. Программа работает с измерительным блоком КВА-15, нужно ее переделать
на работу с ИБ КВА-25. Протокол обмена для КВА-15 не удалось достать.
Программа ничем не запакована, написана на Borland C++, никаких защит нет.
Сама программа (1065 Kb) http://www.disasm.nm.ru/Scale.rar

Для работы программы требуется BDE.
Минимальный набор BDE необходимый для работы программы (751 Kb) http://www.disasm.nm.ru/BDE.rar

Путь установленной программы "C:\Program Files\Scale\"
Из архива Scale.rar файл IDAPI32.CFG нужно скопировать в "C:\Program Files\Common Files\Borland Shared\BDE\" и запустить файл реестра reg.reg (делает записи в BDE)
Логин "АДМИНИСТРАТОР", Пароль "Админ"

Протокол обмена между измерительным блоком(ИБ) КВА-25 и компьютером.
Обмен ведётся по последовательному порту RS-232 на скорости 19200, 8 бит данных, без чётности, 1 стоп-бит.
Обмен данными может быть инициирован как компьютером, так и ИБ. В первом случае компьютер посылает байт запрос и получает требуемую информацию. Во втором - ИБ передаёт информацию о прошедшей оси.
Режимы работы ИБ.
Имеются два режима работы системы: динамический - основной и статический дополнительный.
При работе в основном режиме ИБ ведёт непрерывный контроль за состоянием грузоприёмной платформы и автоматически передаёт информацию о прошедших по ней осях без запроса со стороны компьютера в следующем формате:
Длинна посылки - 7 байт. Первый байт = 00h, второй, третий - время проезда
оси по платформе в обратных отсчётах миллисекунд (т.е. отсчёт ведётся от максимума по убывающей FFFEh=lMC, FFFDh=2MC,...), четвёртый, пятый - слово определяющее вес оси в условных единицах, шестой,седьмой - время прошедшее от съезда предыдущей оси до наезда данной в миллисекундах.
При работе ИБ в статическом режиме, он не проводит ни каких измерений самостоятельно и ждёт команды со стороны компьютера.
Система команд.
Команда всегда подаётся компьютером. Длинна команды - 1 байт. В ответ на команду ИБ возвращает 3 байта данных.
Измерительный блок "понимает" следующие команды:
1 - Перейти в режим статического измерения и вернуть текущий вес платформы.
2 - Перейти в режим динамического измерения и вернуть текущий вес платформы.
3 - Вернуть версию ПО измерительного блока.
В ответ возвращается следующая информация:
команда ответ
1 первый байт = 30h, второй, третий байты - слово определяющее текущий вес платформы в условных единицах
2 первый байт = 40h, второй, третий байты - слово определяющее текущий вес платформы в условных единицах
3 первый байт = 20h, второй, третий байты - слово определяющее версию ПО измерительного блока.


С помощью IDA v4.9 выцепил в программе следующий кусок кода, который задает параметры работы COM-порта

.text:0040D16F loc_40D16F: ; CODE XREF: sub_40D128+Ej
.text:0040D16F lea ecx, [ebp+DCB]
.text:0040D172 push ecx ; lpDCB
.text:0040D173 mov eax, [ebx+18h]
.text:0040D176 push eax ; hFile
.text:0040D177 call GetCommState
.text:0040D17C mov edx, [ebp+arg_4]
.text:0040D17F mov [ebp+DCB.BaudRate], edx
.text:0040D182 lea edx, [ebp+DCB]
.text:0040D185 mov [ebp+DCB.ByteSize], 8
.text:0040D189 mov cl, [ebp+arg_8]
.text:0040D18C mov [ebp+DCB.Parity], cl
.text:0040D18F mov al, [ebp+arg_C]
.text:0040D192 mov [ebp+DCB.StopBits], al
.text:0040D195 and byte ptr [ebp+DCB.fDummy2+1], 0CFh
.text:0040D199 push edx ; lpDCB
.text:0040D19A mov ecx, [ebx+18h]
.text:0040D19D push ecx ; hFile
.text:0040D19E call SetCommState
.text:0040D1A3 xor eax, eax
.text:0040D1A5
.text:0040D1A5 loc_40D1A5: ; CODE XREF: sub_40D128+1Bj
.text:0040D1A5 pop ebx
.text:0040D1A6 mov esp, ebp
.text:0040D1A8 pop ebp
.text:0040D1A9 retn
.text:0040D1A9 sub_40D128 endp

что получил при отладке:
DCB.BaudRate=4B0h
DCB.ByteSize=8
DCB.Parity=0
DCB.StopBits=1
Т.е обмен ведётся по последовательному порту на скорости 1200, 8 бит данных, без чётности, 1 стоп-бит.
Программа возращается по адресу 402794

Кто знает, что за поле DCB.fDummy2? За что оно отвечает?
И можно ли в IDA поставить точку останова на память [ebp+arg_4], или подскажите как отследить? Хотелось бы найти откуда задается скорость.

Последующая работа с COM-портами идет как с файлами, путем использования функций ReadFile(40B1CC) и WriteFile(40D1AC).

.text:0040D1AC ; --------------- S U B R O U T I N E ---------------------------------------
.text:0040D1AC
.text:0040D1AC ; Attributes: bp-based frame
.text:0040D1AC
.text:0040D1AC ; int __cdecl sub_40D1AC(int,int Buffer)
.text:0040D1AC sub_40D1AC proc near ; CODE XREF: sub_40D224+Dp
.text:0040D1AC ; sub_40D224+18p ...
.text:0040D1AC
.text:0040D1AC NumberOfBytesWritten= dword ptr -4
.text:0040D1AC arg_0 = dword ptr 8
.text:0040D1AC Buffer = dword ptr 0Ch
.text:0040D1AC
.text:0040D1AC push ebp
.text:0040D1AD mov ebp, esp
.text:0040D1AF push ecx
.text:0040D1B0 mov eax, [ebp+arg_0]
.text:0040D1B3 lea edx, [ebp+NumberOfBytesWritten]
.text:0040D1B6 push 0 ; lpOverlapped
.text:0040D1B8 push edx ; lpNumberOfBytesWritten
.text:0040D1B9 lea ecx, [ebp+Buffer]
.text:0040D1BC push 1 ; nNumberOfBytesToWrite
.text:0040D1BE push ecx ; lpBuffer
.text:0040D1BF mov eax, [eax+18h]
.text:0040D1C2 push eax ; hFile
.text:0040D1C3 call WriteFile
.text:0040D1C8 pop ecx
.text:0040D1C9 pop ebp
.text:0040D1CA retn
.text:0040D1CA sub_40D1AC endp
.text:0040D1CA
.text:0040D1CA ; ---------------------------------------------------------------------- -----
.text:0040D1CB align 4




.text:0040D1CC sub_40D1CC proc near ; CODE XREF: sub_40D224+80p
.text:0040D1CC ; sub_40D2FC+22p ...
.text:0040D1CC
.text:0040D1CC var_5 = byte ptr -5
.text:0040D1CC NumberOfBytesRead= dword ptr -4
.text:0040D1CC arg_0 = dword ptr 8
.text:0040D1CC
.text:0040D1CC push ebp
.text:0040D1CD mov ebp, esp
.text:0040D1CF add esp, 0FFFFFFF8h
.text:0040D1D2 push ebx
.text:0040D1D3 mov ebx, [ebp+arg_0]
.text:0040D1D6 push 0
.text:0040D1D8 push 0
.text:0040D1DA push 0
.text:0040D1DC push 0Fh
.text:0040D1DE push 0
.text:0040D1E0 push ebx
.text:0040D1E1 call sub_40D05C
.text:0040D1E6 add esp, 18h
.text:0040D1E9 lea eax, [ebp+NumberOfBytesRead]
.text:0040D1EC lea edx, [ebp-5]
.text:0040D1EF push 0 ; lpOverlapped
.text:0040D1F1 push eax ; lpNumberOfBytesRead
.text:0040D1F2 push 1 ; nNumberOfBytesToRead
.text:0040D1F4 push edx ; lpBuffer
.text:0040D1F5 mov ecx, [ebx+18h]
.text:0040D1F8 push ecx ; hFile
.text:0040D1F9 call ReadFile
.text:0040D1FE push 0
.text:0040D200 push 0
.text:0040D202 push 0
.text:0040D204 push 0
.text:0040D206 push 0FFFFFFFFh
.text:0040D208 push ebx
.text:0040D209 call sub_40D05C
.text:0040D20E add esp, 18h
.text:0040D211 cmp [ebp+NumberOfBytesRead], 0
.text:0040D215 jnz short loc_40D21C
.text:0040D217 or eax, 0FFFFFFFFh
.text:0040D21A jmp short loc_40D21F
.text:0040D21C ; ---------------------------------------------------------------------- -----
.text:0040D21C
.text:0040D21C loc_40D21C: ; CODE XREF: sub_40D1CC+49j
.text:0040D21C mov al, [ebp+var_5]
.text:0040D21F
.text:0040D21F loc_40D21F: ; CODE XREF: sub_40D1CC+4Ej
.text:0040D21F pop ebx
.text:0040D220 pop ecx
.text:0040D221 pop ecx
.text:0040D222 pop ebp
.text:0040D223 retn
.text:0040D223 sub_40D1CC endp
.text:0040D223
.text:0040D224


При чтении есть параметр NumberOfBytesRead, который определяет как я понял, сколько байт следует принять(считать).
Как пройти начальную инициализацию COM-портов, чтобы добраться до функций чтения-записи под отладкой?
Уберать все проверки? Или возращать положительные результаты этих проверок?
Или можно написать заглушку для COM-портов, эмулировав передачу данных программе?


p.s. Программы ломал еще в 2000 году, отучил пару программ от диска, пару зарегестрировал на себя. Потом стало не до взлома, все время ушло на учебу. Сейчас приходиться вспоминать старое, надеюсь обойдусь без SoftICE. Опыта работы с COM-портами нет, так что помогайте кто чем может.
Буду презнателен за



Ранг: 228.7 (наставник), 2thx
Активность: 0.120
Статус: Участник
malware research

Создано: 01 августа 2006 22:14
· Личное сообщение · #2

disasm
Доступ к порту должен начинаться примерно так:
hcom=CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, ......
далее задается режим работы порта... disasm пишет:
Как пройти начальную инициализацию COM-портов, чтобы добраться до функций чтения-записи под отладкой?
не совсем понял вопроса... ты вообще как отлаживаешь? Бери OllyDbg и ставь точку останова на функции WriteFile, ReadFile, аналогично на доступ к памяти [ebp+arg_4].

-----
Research is my purpose




Ранг: 1.1 (гость)
Активность: 0=0
Статус: Участник

Создано: 02 августа 2006 15:56
· Личное сообщение · #3

Error_Log
Программа вначале проверяет готовность устройста ИБ КВА-15, инициализирует его и только после этого принимает данные.
Проблема в том, что сейчас я не могу работать вместе с весами, соответственно остается изучать код программы.



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

Создано: 03 августа 2006 05:27
· Личное сообщение · #4

disasm пишет:
Как пройти начальную инициализацию COM-портов, чтобы добраться до функций чтения-записи под отладкой?

а просто пропатчить данные по адресам ebp+DCB.BaudRate, ebp+DCB.ByteSize итд нужными значениями?
disasm пишет:
Кто знает, что за поле DCB.fDummy2? За что оно отвечает?

По докам от M$ это поле зарезервировано. Неплохой ман по COM - upload.caxapa.ru/components/test/%D0%E0%E1%EE%F2%E0%20%F1%20COM%20%EF%EE%F0%F2%E0%EC%E8%20%D2%E8%F2%EE%E2.doc


 eXeL@B —› Вопросы новичков —› Изменение протокола обмена по последовательному порту RS-232 в программе
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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