|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Определить алгоритм контрольной суммы
Всем привет! Есть определенное устройство которое пересылает данные по сети, я перехватил данные пересылаемые между программой и устройством и нашел где хранится нужная мне информация. только вот чтобы устройство реагировало на команды изменения параметров устройства, нужно посчитать контрольную сумму, которая находится в последних двух байтах посылаемой команды. Проблема в том что устройство старое и документации и исходников программы управления не найти, можно ли как то определить как считается контрольная сумма исходя из перехваченных данных?
Вот одна и та же команда с изменением одного параметра: Код:
$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
|
|||
|
|||
Ну, просто на уровне догадки, т.к. устройство старое, то попробуй CRC16. Если не подходит, то придется уже копаться более серьезно, есть несколько идей, но если алгоритм какой-нить кастомный дурацкий, то фиг отгадаешь.
ЗЫ. А устройство чье, наше или вражеское. Если вражеское, то, наверное, можно все-таки попробовать нарыть доку в инете. ЗЗЫ. Ну и еще всегда можно попробовать дизасемблировать программу и попробовать "выковырять" алгоритм из нее... |
#3
|
|||
|
|||
Пробовал crc16 несколько разных реализаций и все они давали разный результат, нет часом рабочего алгоритма для crc?
|
#4
|
|||
|
|||
Цитата:
Решил пойти по этому пути, но наткнулся на одну не понятную для меня штуку: Код:
movzx eax, ds:ИМЯ_ИЗ_.rdata[edx*2] Код:
.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
|
|||
|
|||
Цитата:
з.ы. ты ведь уже проверил свой код на корректность генерируемого псевдокода? |
#6
|
|||
|
|||
Цитата:
В .rdata обычно данные хранятся. А смысл такой: Это какая то походу досовсая прога, т.к. юзает прерывания "int XX" Код:
.rdata:10029678 ; __int16 ИМЯ[] // Вызов прерывания. int16 это прерывание для работы с клавой. .rdata:10029678 ИМЯ dw 0 ; DATA XREF: адрес_вызова+46r //это походу динамический адрес .rdata:1002967A db 89h ; Й // а db 89h Строка по адресу 89h Цитата:
Можно считать весь файл, а можно определённый кусок файла "от сих до сих", и даже не один "кусок" может быть. Можно в одном файле проверять определённые куски и потом считать CRC определённым образом для каждого куска. И алго подсчёта может быть не стандартизированным. Всё зависит от извращённости автора защиты. Есть такой инструмент кряекрский Keygener Assistant Если им по файлу пробежаться, то он показывает места проверок и какой алго CRC использовался. Ну а дальше в отладчик и... "Копать"..."Копать"..."Копать"... Ну конечно, если файл не досовский... А что с базой этой делать... ХЗ. И с чего ты взял что это именно CRC ? Это могут и хеши быть какие... Последний раз редактировалось TEKTON, 01.08.2018 в 11:18. |