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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 15.07.2018, 18:07
firewex firewex вне форума
Прохожий
 
Регистрация: 13.02.2018
Сообщения: 8
Версия Delphi: Delphi XE7
Репутация: 10
Вопрос Определить алгоритм контрольной суммы

Всем привет! Есть определенное устройство которое пересылает данные по сети, я перехватил данные пересылаемые между программой и устройством и нашел где хранится нужная мне информация. только вот чтобы устройство реагировало на команды изменения параметров устройства, нужно посчитать контрольную сумму, которая находится в последних двух байтах посылаемой команды. Проблема в том что устройство старое и документации и исходников программы управления не найти, можно ли как то определить как считается контрольная сумма исходя из перехваченных данных?
Вот одна и та же команда с изменением одного параметра:
Код:
$A5, $00, $00, $00, $2D, $B0, $00, $00, $12, $30, $32, $2E, $30, $34, $2E, $37, $35, $6F, $42, $3F, $0A, $03, $00, $10, $00, $00, $02, $16, $7F 
$A5, $00, $00, $00, $2D, $B0, $00, $00, $12, $30, $32, $2E, $30, $34, $2E, $37, $35, $50, $2B, $67, $0A, $03, $00, $10, $00, $00, $02, $75, $9C 
$A5, $00, $00, $00, $2D, $B0, $00, $00, $12, $30, $32, $2E, $30, $34, $2E, $37, $35, $50, $30, $39, $0A, $03, $00, $10, $00, $00, $02, $A8, $C4 
$A5, $00, $00, $00, $2D, $B0, $00, $00, $12, $30, $32, $2E, $30, $34, $2E, $37, $35, $60, $00, $00, $0A, $03, $00, $10, $00, $00, $02, $69, $F3
$A5, $00, $00, $00, $2D, $B0, $00, $00, $12, $30, $32, $2E, $30, $34, $2E, $37, $35, $60, $00, $01, $0A, $03, $00, $10, $00, $00, $02, $D6, $72
$A5, $00, $00, $00, $2D, $B0, $00, $00, $12, $30, $32, $2E, $30, $34, $2E, $37, $35, $60, $00, $02, $0A, $03, $00, $10, $00, $00, $02, $06, $F8
$A5, $00, $00, $00, $2D, $B0, $00, $00, $12, $30, $32, $2E, $30, $34, $2E, $37, $35, $60, $00, $09, $0A, $03, $00, $10, $00, $00, $02, $6A, $5F 
$A5, $00, $00, $00, $2D, $B0, $00, $00, $12, $30, $32, $2E, $30, $34, $2E, $37, $35, $60, $00, $0F, $0A, $03, $00, $10, $00, $00, $02, $DB, $42
$A5, $00, $00, $00, $2D, $B0, $00, $00, $12, $30, $32, $2E, $30, $34, $2E, $37, $35, $60, $00, $FF, $0A, $03, $00, $10, $00, $00, $02, $40, $01
$A5, $00, $00, $00, $2D, $B0, $00, $00, $12, $30, $32, $2E, $30, $34, $2E, $37, $35, $60, $3B, $97, $0A, $03, $00, $10, $00, $00, $02, $9D, $5E

// $00 - байты которые менял командой
// $00 - контрольная сумма (нужно понять какой алгоритм ее считает) 
Ответить с цитированием
  #2  
Старый 15.07.2018, 18:23
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, просто на уровне догадки, т.к. устройство старое, то попробуй CRC16. Если не подходит, то придется уже копаться более серьезно, есть несколько идей, но если алгоритм какой-нить кастомный дурацкий, то фиг отгадаешь.

ЗЫ. А устройство чье, наше или вражеское. Если вражеское, то, наверное, можно все-таки попробовать нарыть доку в инете.
ЗЗЫ. Ну и еще всегда можно попробовать дизасемблировать программу и попробовать "выковырять" алгоритм из нее...
Ответить с цитированием
  #3  
Старый 15.07.2018, 18:34
firewex firewex вне форума
Прохожий
 
Регистрация: 13.02.2018
Сообщения: 8
Версия Delphi: Delphi XE7
Репутация: 10
По умолчанию

Пробовал crc16 несколько разных реализаций и все они давали разный результат, нет часом рабочего алгоритма для crc?
Ответить с цитированием
  #4  
Старый 20.07.2018, 11:34
firewex firewex вне форума
Прохожий
 
Регистрация: 13.02.2018
Сообщения: 8
Версия Delphi: Delphi XE7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
ЗЗЫ. Ну и еще всегда можно попробовать дизасемблировать программу и попробовать "выковырять" алгоритм из нее...

Решил пойти по этому пути, но наткнулся на одну не понятную для меня штуку:
Код:
movzx   eax, ds:ИМЯ_ИЗ_.rdata[edx*2]
в .rdata это выглядит вот так:
Код:
.rdata:10029678 ; __int16 ИМЯ[]
.rdata:10029678 ИМЯ      dw 0                    ; DATA XREF: адрес_вызова+46r
.rdata:1002967A              db  89h ; Й

Можете пояснить смысл данной манипуляции?

З.Ы. вот псевдокод который мне сгенерил HexRay:
Код:
__int16 __stdcall sub_1001B4C0(_BYTE *a1, int a2, __int16 a3)
{
  int v3; // ecx@2
  unsigned __int16 v4; // ST00_2@3 стартовое значение = 0 (не уверен)
  __int16 i; // [sp+0h] [bp-4h]@1

  for ( i = a3; ; i = ИМЯ[(unsigned __int8)v4] ^ ((signed int)v4 >> 8) )
  {
    v3 = a2--;
    if ( v3 <= 0 )
      break;
    v4 = *a1++ ^ i;
  }
  return i;
}
Ответить с цитированием
  #5  
Старый 30.07.2018, 16:41
robt robt вне форума
Активный
 
Регистрация: 17.02.2011
Сообщения: 298
Репутация: -1806
По умолчанию

Цитата:
Сообщение от firewex
З.Ы. вот псевдокод который мне сгенерил HexRay:
а где там делается этот псевдокод?

з.ы. ты ведь уже проверил свой код на корректность генерируемого псевдокода?
Ответить с цитированием
  #6  
Старый 31.07.2018, 22:31
TEKTON TEKTON вне форума
Новичок
 
Регистрация: 14.03.2011
Сообщения: 60
Репутация: 10
По умолчанию

Цитата:
Сообщение от firewex
в .rdata это выглядит вот так:
Код:
.rdata:10029678 ; __int16 ИМЯ[]
.rdata:10029678 ИМЯ      dw 0                    ; DATA XREF: адрес_вызова+46r
.rdata:1002967A              db  89h ; Й

В .rdata обычно данные хранятся.

А смысл такой:
Это какая то походу досовсая прога, т.к. юзает прерывания "int XX"

Код:
.rdata:10029678 ; __int16 ИМЯ[] // Вызов прерывания.  int16 это прерывание для работы с клавой.
.rdata:10029678 ИМЯ      dw 0 ; DATA XREF: адрес_вызова+46r //это походу динамический адрес
.rdata:1002967A     db  89h ; Й // а  db  89h  Строка по адресу  89h
Как то так.
Цитата:
Сообщение от firewex
...только вот чтобы устройство реагировало на команды изменения параметров устройства, нужно посчитать контрольную сумму, которая находится в последних двух байтах посылаемой команды.
Придётся всё равно в отладчик лезть. Т.К. CRC может считаться по разным алго.
Можно считать весь файл, а можно определённый кусок файла "от сих до сих", и даже не один "кусок" может быть.
Можно в одном файле проверять определённые куски и потом считать CRC определённым образом для каждого куска.
И алго подсчёта может быть не стандартизированным.
Всё зависит от извращённости автора защиты.
Есть такой инструмент кряекрский Keygener Assistant

Если им по файлу пробежаться, то он показывает места проверок и какой алго CRC использовался.
Ну а дальше в отладчик и... "Копать"..."Копать"..."Копать"...
Ну конечно, если файл не досовский...
А что с базой этой делать... ХЗ.
И с чего ты взял что это именно CRC ?
Это могут и хеши быть какие...

Последний раз редактировалось TEKTON, 01.08.2018 в 11:18.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter